diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-12-29 05:19:27 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-12-29 05:19:27 +0000 |
commit | 8fb9bddb590c10431ccff3e9383ba651f8b9663b (patch) | |
tree | a07a43fb62ea0e037308e8b7e407389141a24e4c | |
parent | c29ccf985770f751a41f7e5728938af0316b5dfe (diff) |
uniqueify foo# locals, don't clear primitive locals on tail calls
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 18 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 2 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index bb62536a..c8e520b2 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -3338,6 +3338,8 @@ public static class FnMethod{ public final FnMethod parent; //localbinding->localbinding IPersistentMap locals = null; + //num->localbinding + IPersistentMap indexlocals = null; //localbinding->localbinding PersistentVector reqParms = PersistentVector.EMPTY; LocalBinding restParm = null; @@ -3511,8 +3513,12 @@ public static class FnMethod{ { if(!localsUsedInCatchFinally.contains(i)) { - gen.visitInsn(Opcodes.ACONST_NULL); - gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ISTORE), i); + LocalBinding b = (LocalBinding) RT.get(indexlocals,i); + if(b == null || maybePrimitiveType(b.init) == null) + { + gen.visitInsn(Opcodes.ACONST_NULL); + gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ISTORE), i); + } } } } @@ -3782,12 +3788,15 @@ public static class LetExpr implements Expr{ for(ISeq bis = bindingInits.seq(); bis != null; bis = bis.rest()) { BindingInit bi = (BindingInit) bis.first(); + String lname = bi.binding.name; + if(lname.endsWith("__auto__")) + lname += RT.nextID(); Class primc = maybePrimitiveType(bi.init); if(primc != null) - gen.visitLocalVariable(bi.binding.name, Type.getDescriptor(primc), null, loopLabel, end, + gen.visitLocalVariable(lname, Type.getDescriptor(primc), null, loopLabel, end, bi.binding.idx); else - gen.visitLocalVariable(bi.binding.name, "Ljava/lang/Object;", null, loopLabel, end, bi.binding.idx); + gen.visitLocalVariable(lname, "Ljava/lang/Object;", null, loopLabel, end, bi.binding.idx); } } @@ -3892,6 +3901,7 @@ private static LocalBinding registerLocal(Symbol sym, Symbol tag, Expr init) thr LOCAL_ENV.set(RT.assoc(localsMap, b.sym, b)); FnMethod method = (FnMethod) METHOD.get(); method.locals = (IPersistentMap) RT.assoc(method.locals, b, b); + method.indexlocals = (IPersistentMap) RT.assoc(method.indexlocals, num, b); return b; } diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 0e94c009..d1e66000 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -676,7 +676,7 @@ public static class SyntaxQuoteReader extends AFn{ if(gs == null)
GENSYM_ENV.set(gmap.assoc(sym, gs = Symbol.intern(null,
sym.name.substring(0, sym.name.length() - 1)
- + "__" + RT.nextID())));
+ + "__" + RT.nextID() + "__auto__")));
sym = gs;
}
else
|