diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-10-19 12:25:38 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-10-19 12:25:38 -0400 |
commit | b7281364e3f9cfeca365d7884f1f4765660cc756 (patch) | |
tree | 77f36f267ca31e912f702d650b4ca0a001eab2c9 | |
parent | d1006391595641f16e9c54187a8df0a0138d3a53 (diff) |
consolidate reload preambles
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 38a22c57..288e65dc 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -4846,23 +4846,14 @@ public static class FnMethod extends ObjMethod{ EXCEPTION_TYPES, cv); gen.visitCode(); + emitVarReloadPreamble(fn, gen); + Label loopLabel = gen.mark(); - Label bodyLabel = new Label(); gen.visitLineNumber(line, loopLabel); try { Var.pushThreadBindings(RT.map(LOOP_LABEL, loopLabel, METHOD, this)); - if(fn.vars().count() > 0) - { - gen.loadThis(); - gen.getField(fn.objtype, "__varrev__", Type.INT_TYPE); - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - gen.ifICmp(GeneratorAdapter.EQ,bodyLabel); - gen.loadThis(); - gen.invokeVirtual(fn.objtype(), new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{})); - } - gen.visitLabel(bodyLabel); body.emit(C.RETURN, fn, gen); Label end = gen.mark(); @@ -4883,6 +4874,8 @@ public static class FnMethod extends ObjMethod{ gen.endMethod(); } + + public final PersistentVector reqParms(){ return reqParms; } @@ -5041,6 +5034,19 @@ abstract public static class ObjMethod{ abstract Type getReturnType(); abstract Type[] getArgTypes(); + void emitVarReloadPreamble(ObjExpr fn, GeneratorAdapter gen){ + if(fn.vars().count() > 0) + { + Label bodyLabel = new Label(); + gen.loadThis(); + gen.getField(fn.objtype, "__varrev__", Type.INT_TYPE); + gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); + gen.ifICmp(GeneratorAdapter.EQ,bodyLabel); + gen.loadThis(); + gen.invokeVirtual(fn.objtype(), new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{})); + gen.visitLabel(bodyLabel); + } + } public void emit(ObjExpr fn, ClassVisitor cv){ Method m = new Method(getMethodName(), getReturnType(), getArgTypes()); @@ -5051,23 +5057,14 @@ abstract public static class ObjMethod{ EXCEPTION_TYPES, cv); gen.visitCode(); + emitVarReloadPreamble(fn,gen); + Label loopLabel = gen.mark(); - Label bodyLabel = new Label(); gen.visitLineNumber(line, loopLabel); try { Var.pushThreadBindings(RT.map(LOOP_LABEL, loopLabel, METHOD, this)); - if(fn.vars().count() > 0) - { - gen.loadThis(); - gen.getField(fn.objtype, "__varrev__", Type.INT_TYPE); - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - gen.ifICmp(GeneratorAdapter.EQ,bodyLabel); - gen.loadThis(); - gen.invokeVirtual(fn.objtype(), new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{})); - } - gen.visitLabel(bodyLabel); body.emit(C.RETURN, fn, gen); Label end = gen.mark(); gen.visitLocalVariable("this", "Ljava/lang/Object;", null, loopLabel, end, 0); @@ -7389,24 +7386,15 @@ public static class NewInstanceMethod extends ObjMethod{ addParameterAnnotation(gen, meta, i); } gen.visitCode(); + emitVarReloadPreamble(obj,gen); + Label loopLabel = gen.mark(); - Label bodyLabel = new Label(); - + gen.visitLineNumber(line, loopLabel); try { Var.pushThreadBindings(RT.map(LOOP_LABEL, loopLabel, METHOD, this)); - if(obj.vars().count() > 0) - { - gen.loadThis(); - gen.getField(obj.objtype, "__varrev__", Type.INT_TYPE); - gen.getStatic(VAR_TYPE,"rev",Type.INT_TYPE); - gen.ifICmp(GeneratorAdapter.EQ,bodyLabel); - gen.loadThis(); - gen.invokeVirtual(obj.objtype(), new Method("__reloadVars__",Type.VOID_TYPE, new Type[]{})); - } - gen.visitLabel(bodyLabel); emitBody(objx, gen, retClass, body); Label end = gen.mark(); gen.visitLocalVariable("this", obj.objtype.getDescriptor(), null, loopLabel, end, 0); |