PatchSet 5030 
Date: 2004/07/30 13:57:47
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
tweak for GETSTATIC with static final fields

Members: 
        ChangeLog:1.2588->1.2589 
        kaffe/kaffevm/kaffe.def:1.32->1.33 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2588 kaffe/ChangeLog:1.2589
--- kaffe/ChangeLog:1.2588      Fri Jul 30 11:52:25 2004
+++ kaffe/ChangeLog     Fri Jul 30 13:57:47 2004
@@ -1,3 +1,8 @@
+2004-07-30  Helmer Kraemer  <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/kaffe.def (GETSTATIC): treat static final fields of
+       initialized classes as constants
+
 2004-07-30  Guilhem Lavaux <[EMAIL PROTECTED]>
 
        * libraries/java/lang/Thread.java: Reverted to original file from
Index: kaffe/kaffe/kaffevm/kaffe.def
diff -u kaffe/kaffe/kaffevm/kaffe.def:1.32 kaffe/kaffe/kaffevm/kaffe.def:1.33
--- kaffe/kaffe/kaffevm/kaffe.def:1.32  Sun Jul 25 16:33:49 2004
+++ kaffe/kaffe/kaffevm/kaffe.def       Fri Jul 30 13:57:34 2004
@@ -2182,6 +2182,9 @@
                softcall_initialise_class(c); \
        }
 
+#define FIELD_IS_CONSTANT() \
+       field_class()->state==CSTATE_COMPLETE && (field_field()->accflags&ACC_FINAL)!=0
+
 define_insn(GETSTATIC)
 {
        /*
@@ -2251,42 +2254,75 @@
           getting data in the right type of register.  */
        else if (!FIELD_ISPRIM(field_field())) {
                push(1);
-               load_addr_ref(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_ref_const(stack(0), *(jobject 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_ref(stack(0), FIELD_ADDRESS(field_field()));
+               }
        }
        else switch (CLASS_PRIM_SIG(FIELD_TYPE(field_field()))) {
        case 'I':
                push(1);
-               load_addr_int(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_int_const(stack(0), *(jint 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_int(stack(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'S':
                push(1);
-               load_addr_short(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_int_const(stack(0), *(jint 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_short(stack(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'B':
        case 'Z':
                push(1);
-               load_addr_byte(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_int_const (stack(0), *(jbyte 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_byte(stack(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'C':
                push(1);
-               load_addr_char(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_int_const(stack(0), *(jchar 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_char(stack(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'F':
                push(1);
-               load_addr_float(stack(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_float_const(stack(0), *(jfloat 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_float(stack(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'J':
                push(2);
-               load_addr_long(stack_long(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_long_const(stack(0), *(jlong 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_long(stack_long(0), FIELD_ADDRESS(field_field()));
+               }
                break;
        case 'D':
                push(2);
-               load_addr_double(stack_double(0), FIELD_ADDRESS(field_field()));
+               if (FIELD_IS_CONSTANT()) {
+                       move_double_const(stack(0), *(jdouble 
*)FIELD_ADDRESS(field_field()));
+               } else {
+                       load_addr_double(stack_double(0), 
FIELD_ADDRESS(field_field()));
+               }
                break;
        default:
                ABORT();
        }
 }
+#undef FIELD_IS_CONSTANT
 
 define_insn(PUTSTATIC)
 {

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to