# HG changeset patch # User Thomas Wuerthinger # Date 1308419174 -7200 # Node ID 77bb196828cb3fa50eeb269555223fca476e540d # Parent 5857923e563cf7ea62f7faa3268fbaaf5d8cda90 Fixed an issue with accessing non-initialized static fields. diff -r 5857923e563c -r 77bb196828cb graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java --- 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(); } /** diff -r 5857923e563c -r 77bb196828cb graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- 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); diff -r 5857923e563c -r 77bb196828cb src/share/vm/runtime/deoptimization.cpp --- 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* 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); }