diff --git a/convex-core/src/main/java/convex/core/lang/Compiler.java b/convex-core/src/main/java/convex/core/lang/Compiler.java index 7c62687d7..d6d19730a 100644 --- a/convex-core/src/main/java/convex/core/lang/Compiler.java +++ b/convex-core/src/main/java/convex/core/lang/Compiler.java @@ -217,9 +217,7 @@ private static Context compileEnvSymbol(Symbol sym, Context context) { Address address=context.getAddress(); // Check if the symbol references an existing declaration - context=context.lookupDefiningAddress(address, sym); - if (context.isExceptional()) return context; // could be juice error? - Address a=context.getResult(); + Address a=context.lookupDefiningAddress(address, sym); if (a!=null) return context.withResult(Juice.COMPILE_LOOKUP,Lookup.create(Constant.of(a),sym)); // Finally revert to a lookup in the current address / environment diff --git a/convex-core/src/main/java/convex/core/lang/Context.java b/convex-core/src/main/java/convex/core/lang/Context.java index 2cccba4d3..586e2d61b 100644 --- a/convex-core/src/main/java/convex/core/lang/Context.java +++ b/convex-core/src/main/java/convex/core/lang/Context.java @@ -575,16 +575,19 @@ public AHashMap lookupMeta(Symbol sym) { * @return Metadata for given symbol (may be empty) or null if undeclared */ public AHashMap lookupMeta(Address address,Symbol sym) { - AccountStatus as=(address==null)?getAccountStatus():getAccountStatus(address); + if (address==null) address=getAddress(); for (int i=0; i env=as.getEnvironment(); if (env.containsKey(sym)) { return as.getMetadata().get(sym,Maps.empty()); } + + // go to parent + if (Core.CORE_ADDRESS.equals(address)) break; address=getParentAddress(as); if (address==null) return null; - as=getAccountStatus(address); } return null; } @@ -593,31 +596,26 @@ public AHashMap lookupMeta(Address address,Symbol sym) { * Looks up the address of the account that defines a given Symbol * @param sym Symbol to look up * @param address Address to look up in first instance (null for current address). - * @return Context with result as the address defining the given symbol (or null if undeclared) + * @return Address defining the given symbol (or null if undeclared) */ - public Context lookupDefiningAddress(Address address,Symbol sym) { - Context ctx=this; + public Address lookupDefiningAddress(Address address,Symbol sym) { Address addr=(address==null)?getAddress():address; - for (int i=0; i env=as.getEnvironment(); MapEntry entry = env.getEntry(sym); if (entry!=null) { - return ctx.withResult(Juice.LOOKUP, addr); + return addr; } - ctx=ctx.consumeJuice(Juice.LOOKUP); - if (ctx.isExceptional()) return ctx; - + // go to parent if (addr.equals(Core.CORE_ADDRESS)) break; addr=getParentAddress(as); } - - return ctx.withResult(Juice.LOOKUP, null); + return null; } private Address getParentAddress(AccountStatus as) { diff --git a/convex-core/src/main/java/convex/core/lang/Juice.java b/convex-core/src/main/java/convex/core/lang/Juice.java index f4da011b8..a9211f0e0 100644 --- a/convex-core/src/main/java/convex/core/lang/Juice.java +++ b/convex-core/src/main/java/convex/core/lang/Juice.java @@ -258,17 +258,16 @@ public class Juice { /** * Juice cost to compile a lookup which is defined in account */ - public static final long COMPILE_LOOKUP_DEFINED = COMPILE_LOOKUP+LOOKUP; + public static final long COMPILE_LOOKUP_DEFINED = COMPILE_LOOKUP+LOOKUP; // ?? /** * Juice cost to compile a lookup which is defined in core */ - public static final long COMPILE_LOOKUP_CORE = COMPILE_LOOKUP+LOOKUP*2; - + public static final long COMPILE_LOOKUP_CORE = COMPILE_LOOKUP; //+LOOKUP*2? /** * Juice cost to compile a lookup which is undefined in account and core */ - public static final long COMPILE_LOOKUP_UNDEFINED = COMPILE_LOOKUP+LOOKUP*3; + public static final long COMPILE_LOOKUP_UNDEFINED = COMPILE_LOOKUP; //+LOOKUP*3? /** * Juice cost to compile a general AST node diff --git a/convex-core/src/test/java/convex/core/lang/JuiceTest.java b/convex-core/src/test/java/convex/core/lang/JuiceTest.java index 783f0f5bf..8454c36e3 100644 --- a/convex-core/src/test/java/convex/core/lang/JuiceTest.java +++ b/convex-core/src/test/java/convex/core/lang/JuiceTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; +import convex.core.Constants; import convex.core.data.Address; import static convex.test.Assertions.*; @@ -129,6 +130,17 @@ public void testBalanceAway() { public void testDef() { assertEquals(Juice.DEF + Juice.CONSTANT, juice("(def a 1)")); } + + @Test public void testLookup() { + if (Constants.OPT_STATIC) { + assertEquals(Juice.CONSTANT,juice("count")); + } else { + assertEquals(Juice.LOOKUP*3,juice("count")); + } + + assertEquals(Juice.LOOKUP*3,juice("missing")); + assertEquals(Juice.LOOKUP*3,juice("if")); + } @Test public void testReturn() {