summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-14 16:45:43 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-14 16:45:43 +0000
commit7c25fa0b6a1f90d78f489e04e2f9c43c980d4a93 (patch)
treee9da4b5baa9d95174bfc0a5cd404a5f32e52c993 /src
parent981cda7c8e8dec5e3343fcd95e3bb7cf12921cdc (diff)
added non-reflective static field read compilation
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java20
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(){