diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-12-14 16:45:43 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-12-14 16:45:43 +0000 |
commit | 7c25fa0b6a1f90d78f489e04e2f9c43c980d4a93 (patch) | |
tree | e9da4b5baa9d95174bfc0a5cd404a5f32e52c993 /src | |
parent | 981cda7c8e8dec5e3343fcd95e3bb7cf12921cdc (diff) |
added non-reflective static field read compilation
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index f15795b2..ecd667ff 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -744,14 +744,18 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{ static class StaticFieldExpr extends FieldExpr implements AssignableExpr{ final String className; final String fieldName; + final Class c; + final java.lang.reflect.Field field; final static Method getStaticFieldMethod = Method.getMethod("Object getStaticField(String,String)"); final static Method setStaticFieldMethod = Method.getMethod("Object setStaticField(String,String,Object)"); final int line; - public StaticFieldExpr(int line, String className, String fieldName){ + public StaticFieldExpr(int line, String className, String fieldName) throws Exception{ this.className = className; this.fieldName = fieldName; this.line = line; + c = Class.forName(className); + field = c.getField(fieldName); } public Object eval() throws Exception{ @@ -759,10 +763,16 @@ static class StaticFieldExpr extends FieldExpr implements AssignableExpr{ } public void emit(C context, FnExpr fn, GeneratorAdapter gen){ - gen.visitLineNumber(line, gen.mark()); - gen.push(className); - gen.push(fieldName); - gen.invokeStatic(REFLECTOR_TYPE, getStaticFieldMethod); + if(context != C.STATEMENT) + { + gen.visitLineNumber(line, gen.mark()); + + gen.getStatic(Type.getType(c), fieldName, Type.getType(field.getType())); + HostExpr.emitBoxReturn(fn, gen, field.getType()); + } +// gen.push(className); +// gen.push(fieldName); +// gen.invokeStatic(REFLECTOR_TYPE, getStaticFieldMethod); } public boolean hasJavaClass(){ |