diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-12-11 07:02:23 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-12-11 07:02:23 -0500 |
commit | 42e45b9988bfa17584f259d422b39c64cebabcce (patch) | |
tree | d2c394cd4f9a75b6f55b4fe5f1008882d342dca1 | |
parent | 6d40a76e8a012909f2d2a594ce66a78318889799 (diff) |
prevent local clearing of letfns
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 22da75cb..46d167d8 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -3955,7 +3955,7 @@ static public class ObjExpr implements Expr{ HostExpr.emitBoxReturn(this, gen, primc); else { - if(clear) + if(clear && lb.canBeCleared) { // System.out.println("clear: " + rep); gen.visitInsn(Opcodes.ACONST_NULL); @@ -3977,7 +3977,7 @@ static public class ObjExpr implements Expr{ else { gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ILOAD), lb.idx); - if(clear) + if(clear && lb.canBeCleared) { // System.out.println("clear: " + rep); gen.visitInsn(Opcodes.ACONST_NULL); @@ -4375,6 +4375,7 @@ public static class LocalBinding{ public final String name; public final boolean isArg; public final PathNode clearPathRoot; + public boolean canBeCleared = true; public LocalBinding(int num, Symbol sym, Symbol tag, Expr init, boolean isArg,PathNode clearPathRoot) throws Exception{ @@ -4636,6 +4637,7 @@ public static class LetFnExpr implements Expr{ if(sym.getNamespace() != null) throw new Exception("Can't let qualified name: " + sym); LocalBinding lb = registerLocal(sym, tagOf(sym), null,false); + lb.canBeCleared = false; lbs = lbs.cons(lb); } PersistentVector bindingInits = PersistentVector.EMPTY; |