summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-06-20 03:09:07 +0000
committerRich Hickey <richhickey@gmail.com>2008-06-20 03:09:07 +0000
commitf67252e090fd6492efe1bb668ea545099ab75ad6 (patch)
treea1ebab5a9c3070cf1ce1fc7dc2280cd6f028034b /src
parent3a8713fe10b06c27012908c979ec2ae3a89f9b1b (diff)
fixed fn init local alignment when closed over longs/doubles
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 0cc9a324..5319d9ff 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -2901,8 +2901,11 @@ static public class FnExpr implements Expr{
null,
null,
cv);
+ Label start = ctorgen.newLabel();
+ Label end = ctorgen.newLabel();
ctorgen.visitCode();
ctorgen.visitLineNumber(line, ctorgen.mark());
+ ctorgen.visitLabel(start);
ctorgen.loadThis();
if(isVariadic()) //RestFn ctor takes reqArity arg
{
@@ -2916,10 +2919,13 @@ static public class FnExpr implements Expr{
{
LocalBinding lb = (LocalBinding) s.first();
ctorgen.loadThis();
- if(lb.getPrimitiveType() != null)
+ Class primc = lb.getPrimitiveType();
+ if(primc != null)
{
- ctorgen.visitVarInsn(Type.getType(lb.getPrimitiveType()).getOpcode(Opcodes.ILOAD), a);
- ctorgen.putField(fntype, lb.name, Type.getType(lb.getPrimitiveType()));
+ ctorgen.visitVarInsn(Type.getType(primc).getOpcode(Opcodes.ILOAD), a);
+ ctorgen.putField(fntype, lb.name, Type.getType(primc));
+ if(primc == Long.TYPE || primc == Double.TYPE)
+ ++a;
}
else
{
@@ -2927,6 +2933,23 @@ static public class FnExpr implements Expr{
ctorgen.putField(fntype, lb.name, OBJECT_TYPE);
}
}
+ ctorgen.visitLabel(end);
+// a = 1;
+// for(ISeq s = RT.keys(closes); s != null; s = s.rest(), ++a)
+// {
+// LocalBinding lb = (LocalBinding) s.first();
+// Class primc = lb.getPrimitiveType();
+// if(primc != null)
+// {
+// ctorgen.visitLocalVariable(lb.name, Type.getDescriptor(primc), null, start, end, a);
+// if(primc == Long.TYPE || primc == Double.TYPE)
+// ++a;
+// }
+// else
+// {
+// ctorgen.visitLocalVariable(lb.name, "Ljava/lang/Object;", null, start, end, a);
+// }
+// }
ctorgen.returnValue();
// ctorgen.visitMaxs(1, 1);
ctorgen.endMethod();