< prev index next >

src/hotspot/share/c1/c1_GraphBuilder.cpp

Print this page

*** 1854,1864 **** void GraphBuilder::withfield(int field_index) { bool will_link; ciField* field_modify = stream()->get_field(will_link); ciInstanceKlass* holder = field_modify->holder(); - assert(holder->is_valuetype(), "must be a value klass"); BasicType field_type = field_modify->type()->basic_type(); ValueType* type = as_ValueType(field_type); // call will_link again to determine if the field is valid. const bool needs_patching = !holder->is_loaded() || --- 1854,1863 ----
*** 1868,1882 **** scope()->set_wrote_final(); scope()->set_wrote_fields(); const int offset = !needs_patching ? field_modify->offset() : -1; Value val = pop(type); Value obj = apop(); ! ValueStack* state_before = copy_state_for_exception(); NewValueTypeInstance* new_instance = new NewValueTypeInstance(holder->as_value_klass(), state_before, false); _memory->new_instance(new_instance); apush(append_split(new_instance)); for (int i = 0; i < holder->nof_nonstatic_fields(); i++) { --- 1867,1890 ---- scope()->set_wrote_final(); scope()->set_wrote_fields(); const int offset = !needs_patching ? field_modify->offset() : -1; + + if (!holder->is_loaded()) { + ValueStack* state_before = copy_state_before(); Value val = pop(type); Value obj = apop(); ! apush(append_split(new WithField(obj->type(), state_before))); ! return; ! } ValueStack* state_before = copy_state_for_exception(); + Value val = pop(type); + Value obj = apop(); + + assert(holder->is_valuetype(), "must be a value klass"); NewValueTypeInstance* new_instance = new NewValueTypeInstance(holder->as_value_klass(), state_before, false); _memory->new_instance(new_instance); apush(append_split(new_instance)); for (int i = 0; i < holder->nof_nonstatic_fields(); i++) {
*** 2299,2316 **** _memory->new_instance(new_instance); apush(append_split(new_instance)); } void GraphBuilder::new_value_type_instance(int klass_index) { - ValueStack* state_before = copy_state_exhandling(); bool will_link; ciKlass* klass = stream()->get_klass(will_link); assert(klass->is_valuetype(), "must be a value klass"); NewValueTypeInstance* new_instance = new NewValueTypeInstance(klass->as_value_klass(), state_before, stream()->is_unresolved_klass()); _memory->new_instance(new_instance); apush(append_split(new_instance)); } void GraphBuilder::new_type_array() { ValueStack* state_before = copy_state_exhandling(); apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index(), state_before))); --- 2307,2329 ---- _memory->new_instance(new_instance); apush(append_split(new_instance)); } void GraphBuilder::new_value_type_instance(int klass_index) { bool will_link; ciKlass* klass = stream()->get_klass(will_link); + if (klass->is_loaded()) { assert(klass->is_valuetype(), "must be a value klass"); + ValueStack* state_before = copy_state_exhandling(); NewValueTypeInstance* new_instance = new NewValueTypeInstance(klass->as_value_klass(), state_before, stream()->is_unresolved_klass()); _memory->new_instance(new_instance); apush(append_split(new_instance)); + } else { + ValueStack* state_before = copy_state_before(); + apush(append_split(new DefaultValue(objectType, state_before))); + } } void GraphBuilder::new_type_array() { ValueStack* state_before = copy_state_exhandling(); apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index(), state_before)));
< prev index next >