diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-06-20 03:09:07 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-06-20 03:09:07 +0000 |
commit | f67252e090fd6492efe1bb668ea545099ab75ad6 (patch) | |
tree | a1ebab5a9c3070cf1ce1fc7dc2280cd6f028034b | |
parent | 3a8713fe10b06c27012908c979ec2ae3a89f9b1b (diff) |
fixed fn init local alignment when closed over longs/doubles
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 29 |
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(); |