summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-03 22:03:41 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-03 22:03:41 +0000
commit5759cb53f75f34e43814d99a362f96ffc315eb42 (patch)
treeb1965da69ac1bbd0b8b53badf0c5efd097e37803 /src
parent54acb784b9b1872195466924377ec49587f88f58 (diff)
fixed DefExpr emit
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/BytecodeCompiler.java20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/jvm/clojure/lang/BytecodeCompiler.java b/src/jvm/clojure/lang/BytecodeCompiler.java
index 05e30433..c8fd191b 100644
--- a/src/jvm/clojure/lang/BytecodeCompiler.java
+++ b/src/jvm/clojure/lang/BytecodeCompiler.java
@@ -129,11 +129,12 @@ static class DefExpr implements Expr{
}
public void emit(C context, FnExpr fn, GeneratorAdapter gen){
- fn.emitVarValue(gen, var);
+ fn.emitVar(gen, var);
+ gen.dup();
init.emit(C.EXPRESSION, fn, gen);
gen.invokeVirtual(VAR_TYPE, bindRootMethod);
- if(!(context == C.STATEMENT))
- fn.emitVarValue(gen, var);
+ if(context == C.STATEMENT)
+ gen.pop();
}
public static Expr parse(C context, ISeq form) throws Exception{
@@ -154,6 +155,7 @@ static class DefExpr implements Expr{
static class VarExpr implements Expr{
final Var var;
final Symbol tag;
+ final static Method getMethod = Method.getMethod("Object get()");
public VarExpr(Var var, Symbol tag){
this.var = var;
@@ -166,7 +168,10 @@ static class VarExpr implements Expr{
public void emit(C context, FnExpr fn, GeneratorAdapter gen){
if(context != C.STATEMENT)
- fn.emitVarValue(gen, var);
+ {
+ fn.emitVar(gen, var);
+ gen.invokeVirtual(VAR_TYPE, getMethod);
+ }
}
}
@@ -693,7 +698,6 @@ static class FnExpr implements Expr{
final static Method varintern = Method.getMethod("clojure.lang.Var intern(clojure.lang.Symbol)");
final static Method afnctor = Method.getMethod("void <init>()");
final static Method restfnctor = Method.getMethod("void <init>(int)");
- final static Method getMethod = Method.getMethod("Object get()");
final static Type aFnType = Type.getType(AFn.class);
final static Type restFnType = Type.getType(RestFn.class);
@@ -897,12 +901,6 @@ static class FnExpr implements Expr{
gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ILOAD), lb.idx);
}
-
- public void emitVarValue(GeneratorAdapter gen, Var var){
- emitVar(gen, var);
- gen.invokeVirtual(VAR_TYPE, getMethod);
- }
-
public void emitVar(GeneratorAdapter gen, Var var){
gen.getStatic(fntype, munge(var.sym.toString()), VAR_TYPE);
}