diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-03 22:03:41 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-03 22:03:41 +0000 |
commit | 5759cb53f75f34e43814d99a362f96ffc315eb42 (patch) | |
tree | b1965da69ac1bbd0b8b53badf0c5efd097e37803 /src | |
parent | 54acb784b9b1872195466924377ec49587f88f58 (diff) |
fixed DefExpr emit
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/BytecodeCompiler.java | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/jvm/clojure/lang/BytecodeCompiler.java b/src/jvm/clojure/lang/BytecodeCompiler.java index 05e30433..c8fd191b 100644 --- a/src/jvm/clojure/lang/BytecodeCompiler.java +++ b/src/jvm/clojure/lang/BytecodeCompiler.java @@ -129,11 +129,12 @@ static class DefExpr implements Expr{ } public void emit(C context, FnExpr fn, GeneratorAdapter gen){ - fn.emitVarValue(gen, var); + fn.emitVar(gen, var); + gen.dup(); init.emit(C.EXPRESSION, fn, gen); gen.invokeVirtual(VAR_TYPE, bindRootMethod); - if(!(context == C.STATEMENT)) - fn.emitVarValue(gen, var); + if(context == C.STATEMENT) + gen.pop(); } public static Expr parse(C context, ISeq form) throws Exception{ @@ -154,6 +155,7 @@ static class DefExpr implements Expr{ static class VarExpr implements Expr{ final Var var; final Symbol tag; + final static Method getMethod = Method.getMethod("Object get()"); public VarExpr(Var var, Symbol tag){ this.var = var; @@ -166,7 +168,10 @@ static class VarExpr implements Expr{ public void emit(C context, FnExpr fn, GeneratorAdapter gen){ if(context != C.STATEMENT) - fn.emitVarValue(gen, var); + { + fn.emitVar(gen, var); + gen.invokeVirtual(VAR_TYPE, getMethod); + } } } @@ -693,7 +698,6 @@ static class FnExpr implements Expr{ final static Method varintern = Method.getMethod("clojure.lang.Var intern(clojure.lang.Symbol)"); final static Method afnctor = Method.getMethod("void <init>()"); final static Method restfnctor = Method.getMethod("void <init>(int)"); - final static Method getMethod = Method.getMethod("Object get()"); final static Type aFnType = Type.getType(AFn.class); final static Type restFnType = Type.getType(RestFn.class); @@ -897,12 +901,6 @@ static class FnExpr implements Expr{ gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ILOAD), lb.idx); } - - public void emitVarValue(GeneratorAdapter gen, Var var){ - emitVar(gen, var); - gen.invokeVirtual(VAR_TYPE, getMethod); - } - public void emitVar(GeneratorAdapter gen, Var var){ gen.getStatic(fntype, munge(var.sym.toString()), VAR_TYPE); } |