--- old/src/share/vm/interpreter/interpreterRuntime.cpp 2017-09-13 15:20:14.000000000 -0400 +++ new/src/share/vm/interpreter/interpreterRuntime.cpp 2017-09-13 15:20:14.000000000 -0400 @@ -236,9 +236,9 @@ // Getting Field information int offset = cp_entry->f2_as_index(); - fieldDescriptor fd; - vklass->find_field_from_offset(offset, false, &fd); - Symbol* field_signature = fd.signature(); + int field_index = cp_entry->field_index(); + int field_offset = cp_entry->f2_as_offset(); + Symbol* field_signature = vklass->field_signature(field_index); ResourceMark rm(THREAD); const char* signature = (const char *) field_signature->as_utf8(); BasicType field_type = char2type(signature[0]); @@ -264,18 +264,18 @@ if (field_type == T_OBJECT || field_type == T_ARRAY) { oop aoop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); assert(aoop == NULL || (oopDesc::is_oop(aoop) && (!aoop->is_value())),"argument must be a reference type"); - new_value_h()->obj_field_put(fd.offset(), aoop); + new_value_h()->obj_field_put(field_offset, aoop); } else if (field_type == T_VALUETYPE) { - Klass* field_k = vklass->get_value_field_klass(fd.index()); + Klass* field_k = vklass->get_value_field_klass(field_index); ValueKlass* field_vk = ValueKlass::cast(field_k); oop vt_oop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx); assert(vt_oop != NULL && oopDesc::is_oop(vt_oop) && vt_oop->is_value(),"argument must be a value type"); assert(field_vk == vt_oop->klass(), "Must match"); field_vk->value_store(field_vk->data_for_oop(vt_oop), - ((char*)(oopDesc*)new_value_h()) + fd.offset(), true, false); + ((char*)(oopDesc*)new_value_h()) + field_offset, true, false); } else { intptr_t* addr = f.interpreter_frame_expression_stack_at(tos_idx); - copy_primitive_argument(addr, new_value_h, fd.offset(), field_type); + copy_primitive_argument(addr, new_value_h, field_offset, field_type); } // returning result @@ -330,13 +330,11 @@ thread->set_vm_result(value); IRT_END -IRT_ENTRY(void, InterpreterRuntime::qgetfield(JavaThread* thread, oopDesc* value, int offset)) +IRT_ENTRY(void, InterpreterRuntime::qgetfield(JavaThread* thread, oopDesc* value, int index)) Handle value_h(THREAD, value); InstanceKlass* klass = InstanceKlass::cast(value->klass()); - fieldDescriptor fd; - klass->find_field_from_offset(offset, false, &fd); - Klass* field_k = klass->get_value_field_klass(fd.index()); + Klass* field_k = klass->get_value_field_klass(index); ValueKlass* field_vklass = ValueKlass::cast(field_k); field_vklass->initialize(THREAD); @@ -345,19 +343,18 @@ instanceOop res = field_vklass->allocate_buffered_or_heap_instance(&in_heap, CHECK); instanceHandle res_h(THREAD, res); // copy value - field_vklass->value_store(((char*)(oopDesc*)value_h()) + offset, + field_vklass->value_store(((char*)(oopDesc*)value_h()) + klass->field_offset(index), field_vklass->data_for_oop(res), in_heap, false); thread->set_vm_result(res_h()); IRT_END -IRT_ENTRY(void, InterpreterRuntime::initialize_static_value_field(JavaThread* thread, oopDesc* mirror, int offset)) +IRT_ENTRY(void, InterpreterRuntime::initialize_static_value_field(JavaThread* thread, oopDesc* mirror, int index)) instanceHandle mirror_h(THREAD, (instanceOop)mirror); InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror)); + int offset = klass->field_offset(index); assert(mirror->obj_field(offset) == NULL,"Field must not be initialized twice"); - fieldDescriptor fd; - klass->find_field_from_offset(offset, true, &fd); - Klass* field_k = klass->get_value_field_klass(fd.index()); + Klass* field_k = klass->get_value_field_klass(index); ValueKlass* field_vklass = ValueKlass::cast(field_k); // allocate instance, because it is going to be assigned to a static field // it must not be a buffered value @@ -367,48 +364,32 @@ thread->set_vm_result(res_h()); IRT_END -IRT_ENTRY(void, InterpreterRuntime::qputfield(JavaThread* thread, oopDesc* obj, oopDesc* value, int offset)) +IRT_ENTRY(void, InterpreterRuntime::qputfield(JavaThread* thread, oopDesc* obj, oopDesc* value, int flags)) Handle value_h(THREAD, value); Handle obj_h(THREAD, obj); assert(!obj_h()->klass()->is_value(), "obj must be an object"); assert(value_h()->klass()->is_value(), "value must be an value type"); + int index = flags & ConstantPoolCacheEntry::field_index_mask; InstanceKlass* klass = InstanceKlass::cast(obj->klass()); - fieldDescriptor fd; - klass->find_field_from_offset(offset, false, &fd); - Klass* field_k = klass->get_value_field_klass(fd.index()); + Klass* field_k = klass->get_value_field_klass(index); ValueKlass* field_vklass = ValueKlass::cast(value->klass()); assert(field_k == field_vklass, "Field descriptor and argument must match"); // copy value field_vklass->value_store(field_vklass->data_for_oop(value_h()), - ((char*)(oopDesc*)obj_h()) + offset, true, false); + ((char*)(oopDesc*)obj_h()) + klass->field_offset(index), true, false); IRT_END -IRT_ENTRY(void, InterpreterRuntime::qputstatic(JavaThread* thread, oopDesc* value)) +IRT_ENTRY(void, InterpreterRuntime::qputstatic(JavaThread* thread, oopDesc* value, int offset, oopDesc* mirror)) instanceHandle value_h(THREAD, (instanceOop)value); assert(value_h()->is_value(), "qputstatic only deals with value arguments"); - Method* m = last_frame(thread).interpreter_frame_method(); - jint bci = last_frame(thread).interpreter_frame_bci(); - assert(m->code_at(bci) == Bytecodes::_putstatic, "qputstatic is a particular case of putstatic"); - ConstantPoolCache* cp_cache = last_frame(thread).interpreter_frame_method()->constants()->cache(); - int index = ConstantPool::decode_cpcache_index(get_index_u2_cpcache(thread, Bytecodes::_putstatic)); - ConstantPoolCacheEntry* cp_entry = cp_cache->entry_at(index); - assert(cp_entry->is_field_entry(), "Sanity check"); - - InstanceKlass* klass = InstanceKlass::cast(cp_entry->f1_as_klass()); - int offset = cp_entry->f2_as_index(); - oop mirror = klass->java_mirror(); - if (Universe::heap()->is_in_reserved(value_h())) { - mirror->obj_field_put(offset, value_h()); + mirror->obj_field_put(offset, value_h()); } else { // The argument is a buffered value, a copy must be created in the Java heap // because a static field cannot point to a thread-local buffered value - fieldDescriptor fd; - klass->find_field_from_offset(offset, false, &fd); - Klass* field_k = klass->get_value_field_klass(fd.index()); - ValueKlass* field_vklass = ValueKlass::cast(field_k); - assert(field_vklass == value->klass(), "Field descriptor and argument must match"); + ValueKlass* field_vklass = ValueKlass::cast(value_h()->klass()); + Handle mirror_h(THREAD, mirror); // allocate heap instance instanceOop res = field_vklass->allocate_instance(CHECK); assert(Universe::heap()->is_in_reserved(res), "Must be in the Java heap"); @@ -417,8 +398,8 @@ field_vklass->value_store(field_vklass->data_for_oop(value_h()), field_vklass->data_for_oop(res), true, false); // writing static field - mirror->obj_field_put(offset, res_h()); - assert(mirror->obj_field(offset) != NULL,"Sanity check"); + mirror_h->obj_field_put(offset, res_h()); + assert(mirror_h->obj_field(offset) != NULL,"Sanity check"); } IRT_END