< prev index next >

src/share/vm/opto/compile.cpp

Print this page

        

*** 1755,1785 **** // but the base pointer type is not distinctive enough to identify // references into JavaThread.) // Check for final fields. const TypeInstPtr* tinst = flat->isa_instptr(); if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) { - ciField* field; if (tinst->const_oop() != NULL && tinst->klass() == ciEnv::current()->Class_klass() && tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) { // static field ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass(); field = k->get_field_by_offset(tinst->offset(), true); } else { ciInstanceKlass *k = tinst->klass()->as_instance_klass(); field = k->get_field_by_offset(tinst->offset(), false); } assert(field == NULL || original_field == NULL || (field->holder() == original_field->holder() && field->offset() == original_field->offset() && field->is_static() == original_field->is_static()), "wrong field?"); // Set field() and is_rewritable() attributes. if (field != NULL) alias_type(idx)->set_field(field); } - } // Fill the cache for next time. ace->_adr_type = adr_type; ace->_index = idx; assert(alias_type(adr_type) == alias_type(idx), "type must be installed"); --- 1755,1790 ---- // but the base pointer type is not distinctive enough to identify // references into JavaThread.) // Check for final fields. const TypeInstPtr* tinst = flat->isa_instptr(); + const TypeValueTypePtr* vtptr = flat->isa_valuetypeptr(); + ciField* field = NULL; if (tinst && tinst->offset() >= instanceOopDesc::base_offset_in_bytes()) { if (tinst->const_oop() != NULL && tinst->klass() == ciEnv::current()->Class_klass() && tinst->offset() >= (tinst->klass()->as_instance_klass()->size_helper() * wordSize)) { // static field ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass(); field = k->get_field_by_offset(tinst->offset(), true); } else { ciInstanceKlass *k = tinst->klass()->as_instance_klass(); field = k->get_field_by_offset(tinst->offset(), false); } + } else if (vtptr) { + // Value type field + ciValueKlass* vk = vtptr->klass()->as_value_klass(); + field = vk->get_field_by_offset(vtptr->offset(), false); + } assert(field == NULL || original_field == NULL || (field->holder() == original_field->holder() && field->offset() == original_field->offset() && field->is_static() == original_field->is_static()), "wrong field?"); // Set field() and is_rewritable() attributes. if (field != NULL) alias_type(idx)->set_field(field); } // Fill the cache for next time. ace->_adr_type = adr_type; ace->_index = idx; assert(alias_type(adr_type) == alias_type(idx), "type must be installed");
< prev index next >