summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-02-11 19:33:02 +0000
committerRich Hickey <richhickey@gmail.com>2009-02-11 19:33:02 +0000
commitbaddfb391f1e85784b08a97e9e881987657f1e38 (patch)
tree1c8e7e378c8d758070eb51bf43be25aaf94578a6
parenta256e51ef5e7f48e1f9fd4f0c4a1ba4bf1ccf6a2 (diff)
[lazy] declare closed-over fields non-final for once-only fns
-rw-r--r--src/jvm/clojure/lang/Compiler.java9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 4e75daff..cf03280e 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -3047,7 +3047,8 @@ static public class FnExpr implements Expr{
//static fields for constants
for(int i = 0; i < constants.count(); i++)
{
- cv.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, constantName(i), constantType(i).getDescriptor(),
+ cv.visitField(ACC_PUBLIC + ACC_FINAL
+ + ACC_STATIC, constantName(i), constantType(i).getDescriptor(),
null, null);
}
@@ -3092,10 +3093,12 @@ static public class FnExpr implements Expr{
{
LocalBinding lb = (LocalBinding) s.first();
if(lb.getPrimitiveType() != null)
- cv.visitField(ACC_PUBLIC + ACC_FINAL, lb.name, Type.getType(lb.getPrimitiveType()).getDescriptor(),
+ cv.visitField(ACC_PUBLIC + ACC_FINAL
+ , lb.name, Type.getType(lb.getPrimitiveType()).getDescriptor(),
null, null);
else
- cv.visitField(ACC_PUBLIC + ACC_FINAL, lb.name, OBJECT_TYPE.getDescriptor(), null, null);
+ cv.visitField(ACC_PUBLIC + (onceOnly ? 0 : ACC_FINAL)
+ , lb.name, OBJECT_TYPE.getDescriptor(), null, null);
}
//ctor that takes closed-overs and inits base + fields
// Method m = new Method("<init>", Type.VOID_TYPE, ARG_TYPES[closes.count()]);