[kaffe] CVS kaffe (hkraemer): tweak for GETSTATIC with static final fields

Kaffe CVS cvs-commits at kaffe.org
Fri Jul 30 07:10:14 PDT 2004


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  <hkraemer at freenet.de>
+
+	* kaffe/kaffevm/kaffe.def (GETSTATIC): treat static final fields of
+	initialized classes as constants
+
 2004-07-30  Guilhem Lavaux <guilhem at kaffe.org>
 
 	* 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)
 {




More information about the kaffe mailing list