summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-12-29 05:19:27 +0000
committerRich Hickey <richhickey@gmail.com>2008-12-29 05:19:27 +0000
commit8fb9bddb590c10431ccff3e9383ba651f8b9663b (patch)
treea07a43fb62ea0e037308e8b7e407389141a24e4c
parentc29ccf985770f751a41f7e5728938af0316b5dfe (diff)
uniqueify foo# locals, don't clear primitive locals on tail calls
-rw-r--r--src/jvm/clojure/lang/Compiler.java18
-rw-r--r--src/jvm/clojure/lang/LispReader.java2
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