changeset 3019:77bb196828cb

Fixed an issue with accessing non-initialized static fields.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Sat, 18 Jun 2011 19:46:14 +0200
parents 5857923e563c
children 9fed07e4a375
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java src/share/vm/runtime/deoptimization.cpp
diffstat 3 files changed, 8 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java	Sat Jun 18 19:13:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java	Sat Jun 18 19:46:14 2011 +0200
@@ -76,7 +76,7 @@
         this.field = field;
         setObject(object);
         assert field.isResolved();
-        assert field.holder().isResolved();
+        assert field.holder().isInitialized();
     }
 
     /**
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Sat Jun 18 19:13:55 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Sat Jun 18 19:46:14 2011 +0200
@@ -801,7 +801,7 @@
     private void genGetField(int cpi, RiField field) {
         CiKind kind = field.kind();
         Value receiver = frameState.apop();
-        if (field.isResolved()) {
+        if (field.isResolved() && field.holder().isInitialized()) {
             LoadField load = new LoadField(receiver, field, graph);
             appendOptimizedLoadField(kind, load);
         } else {
@@ -814,7 +814,7 @@
     private void genPutField(int cpi, RiField field) {
         Value value = frameState.pop(field.kind().stackKind());
         Value receiver = frameState.apop();
-        if (field.isResolved()) {
+        if (field.isResolved() && field.holder().isInitialized()) {
             StoreField store = new StoreField(receiver, field, value, graph);
             appendOptimizedStoreField(store);
         } else {
@@ -825,7 +825,7 @@
 
     private void genGetStatic(int cpi, RiField field) {
         RiType holder = field.holder();
-        boolean isInitialized = field.isResolved();
+        boolean isInitialized = field.isResolved() && field.holder().isInitialized();
         CiConstant constantValue = null;
         if (isInitialized) {
             constantValue = field.constantValue(null);
@@ -847,7 +847,7 @@
 
     private void genPutStatic(int cpi, RiField field) {
         RiType holder = field.holder();
-        Value container = genTypeOrDeopt(RiType.Representation.StaticFields, holder, field.isResolved(), cpi);
+        Value container = genTypeOrDeopt(RiType.Representation.StaticFields, holder, field.isResolved() && field.holder().isInitialized(), cpi);
         Value value = frameState.pop(field.kind().stackKind());
         if (container != null) {
             StoreField store = new StoreField(container, field, value, graph);
--- a/src/share/vm/runtime/deoptimization.cpp	Sat Jun 18 19:13:55 2011 +0200
+++ b/src/share/vm/runtime/deoptimization.cpp	Sat Jun 18 19:46:14 2011 +0200
@@ -1240,11 +1240,12 @@
     Bytecodes::Code trap_bc     = trap_method->java_code_at(trap_bci);
 
     if (trap_scope->rethrow_exception()) {
-      tty->print_cr("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Exception to be rethrown in the interpreter");
+      if (TraceDeoptimization) {
+        tty->print_cr("Exception to be rethrown in the interpreter");
+      }
       GrowableArray<ScopeValue*>* expressions = trap_scope->expressions();
       ScopeValue* topOfStack = expressions->top();
       Handle topOfStackObj = cvf->create_stack_value(topOfStack)->get_obj();
-      topOfStackObj->print();
       THREAD->set_pending_exception(topOfStackObj(), NULL, 0);
     }