< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page

        

*** 242,270 **** default: fatal("Unsupported BasicType"); } } ! IRT_ENTRY(void, InterpreterRuntime::vdefault(JavaThread* thread, ConstantPool* pool, int index)) // Getting the ValueKlass Klass* k = pool->klass_at(index, CHECK); ! assert(k->is_value(), "vdefault argument must be the value type class"); ValueKlass* vklass = ValueKlass::cast(k); vklass->initialize(THREAD); oop res = vklass->default_value(); thread->set_vm_result(res); IRT_END ! IRT_ENTRY(int, InterpreterRuntime::vwithfield(JavaThread* thread, ConstantPoolCache* cp_cache)) LastFrameAccessor last_frame(thread); // Getting the ValueKlass ! int index = ConstantPool::decode_cpcache_index(last_frame.get_index_u2_cpcache(Bytecodes::_vwithfield)); ConstantPoolCacheEntry* cp_entry = cp_cache->entry_at(index); ! assert(cp_entry->is_resolved(Bytecodes::_vwithfield), "Should have been resolved"); Klass* klass = cp_entry->f1_as_klass(); ! assert(klass->is_value(), "vwithfield only applies to value types"); ValueKlass* vklass = ValueKlass::cast(klass); // Getting Field information int offset = cp_entry->f2_as_index(); int field_index = cp_entry->field_index(); --- 242,270 ---- default: fatal("Unsupported BasicType"); } } ! IRT_ENTRY(void, InterpreterRuntime::defaultvalue(JavaThread* thread, ConstantPool* pool, int index)) // Getting the ValueKlass Klass* k = pool->klass_at(index, CHECK); ! assert(k->is_value(), "defaultvalue argument must be the value type class"); ValueKlass* vklass = ValueKlass::cast(k); vklass->initialize(THREAD); oop res = vklass->default_value(); thread->set_vm_result(res); IRT_END ! IRT_ENTRY(int, InterpreterRuntime::withfield(JavaThread* thread, ConstantPoolCache* cp_cache)) LastFrameAccessor last_frame(thread); // Getting the ValueKlass ! int index = ConstantPool::decode_cpcache_index(last_frame.get_index_u2_cpcache(Bytecodes::_withfield)); ConstantPoolCacheEntry* cp_entry = cp_cache->entry_at(index); ! assert(cp_entry->is_resolved(Bytecodes::_withfield), "Should have been resolved"); Klass* klass = cp_entry->f1_as_klass(); ! assert(klass->is_value(), "withfield only applies to value types"); ValueKlass* vklass = ValueKlass::cast(klass); // Getting Field information int offset = cp_entry->f2_as_index(); int field_index = cp_entry->field_index();
*** 339,396 **** copy_primitive_argument(addr, new_value_h, field_offset, field_type); } // returning result thread->set_vm_result(new_value_h()); ! return (type2size[field_type] + type2size[T_VALUETYPE]) * AbstractInterpreter::stackElementSize; ! IRT_END ! ! IRT_ENTRY(void, InterpreterRuntime::vbox(JavaThread* thread, ConstantPool* pool, int index, oopDesc* value)) ! assert(EnableMVT, "vbox is supported only when the MVT programming model is enabled"); ! if (value == NULL) { ! THROW(vmSymbols::java_lang_NullPointerException()); ! } ! ! // Since the verifier is probably disabled, a few extra type check ! Klass* target_klass = pool->klass_at(index, CHECK); ! if (target_klass->is_value()) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vbox target is value type"); ! } ! Klass* klass = value->klass(); ! if (!klass->is_value()) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vbox not from value type"); ! } ! ValueKlass* vtklass = ValueKlass::cast(klass); ! if (vtklass->get_vcc_klass() != target_klass) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vbox target is not derive value type box"); ! } ! oop box = vtklass->box(Handle(THREAD, value), ! InstanceKlass::cast(target_klass), ! CHECK); ! thread->set_vm_result(box); ! IRT_END ! ! IRT_ENTRY(void, InterpreterRuntime::vunbox(JavaThread* thread, ConstantPool* pool, int index, oopDesc* obj)) ! assert(EnableMVT, "vunbox is supported only when the MVT programming model is enabled"); ! if (obj == NULL) { ! THROW(vmSymbols::java_lang_NullPointerException()); ! } ! Klass* target_klass = pool->klass_at(index, CHECK); ! if (!target_klass->is_value()) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vunbox target is not value type"); ! } ! Klass* klass = obj->klass(); ! if ((!klass->is_instance_klass()) || klass->is_value()) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vunbox source is not an instance"); ! } ! if (klass != InstanceKlass::cast(target_klass)->get_vcc_klass()) { ! THROW_MSG(vmSymbols::java_lang_ClassCastException(), "vunbox target is not derive value type"); ! } ! oop value = ValueKlass::cast(target_klass)->unbox(Handle(THREAD, obj), ! InstanceKlass::cast(target_klass), ! CHECK); ! thread->set_vm_result(value); IRT_END IRT_ENTRY(void, InterpreterRuntime::qgetfield(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder)) Handle value_h(THREAD, obj); InstanceKlass* klass = InstanceKlass::cast(field_holder); --- 339,349 ---- copy_primitive_argument(addr, new_value_h, field_offset, field_type); } // returning result thread->set_vm_result(new_value_h()); ! return (type2size[field_type] + type2size[T_OBJECT]) * AbstractInterpreter::stackElementSize; IRT_END IRT_ENTRY(void, InterpreterRuntime::qgetfield(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder)) Handle value_h(THREAD, obj); InstanceKlass* klass = InstanceKlass::cast(field_holder);
*** 666,679 **** IRT_ENTRY(void, InterpreterRuntime::check_areturn(JavaThread* thread, oopDesc* obj)) if (obj != NULL) { Klass* k = obj->klass(); if (k->is_value()) { ! ResourceMark rm(thread); ! tty->print_cr("areturn used on a value from %s", k->name()->as_C_string()); } - assert(!k->is_value(), "areturn should never be used on values"); } thread->set_vm_result(obj); IRT_END IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj)) --- 619,631 ---- IRT_ENTRY(void, InterpreterRuntime::check_areturn(JavaThread* thread, oopDesc* obj)) if (obj != NULL) { Klass* k = obj->klass(); if (k->is_value()) { ! // ResourceMark rm(thread); ! // tty->print_cr("areturn used on a value from %s", k->name()->as_C_string()); } } thread->set_vm_result(obj); IRT_END IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj))
*** 1030,1042 **** fieldDescriptor info; LastFrameAccessor last_frame(thread); constantPoolHandle pool(thread, last_frame.method()->constants()); methodHandle m(thread, last_frame.method()); bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_nofast_putfield || ! bytecode == Bytecodes::_putstatic || bytecode == Bytecodes::_vwithfield); bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic); ! bool is_value = bytecode == Bytecodes::_vwithfield; { JvmtiHideSingleStepping jhss(thread); LinkResolver::resolve_field_access(info, pool, last_frame.get_index_u2_cpcache(bytecode), m, bytecode, CHECK); --- 982,994 ---- fieldDescriptor info; LastFrameAccessor last_frame(thread); constantPoolHandle pool(thread, last_frame.method()->constants()); methodHandle m(thread, last_frame.method()); bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_nofast_putfield || ! bytecode == Bytecodes::_putstatic || bytecode == Bytecodes::_withfield); bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic); ! bool is_value = bytecode == Bytecodes::_withfield; { JvmtiHideSingleStepping jhss(thread); LinkResolver::resolve_field_access(info, pool, last_frame.get_index_u2_cpcache(bytecode), m, bytecode, CHECK);
*** 1082,1092 **** get_code = Bytecodes::_getstatic; } else { get_code = Bytecodes::_getfield; } if (is_put && is_value) { ! put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_vwithfield); } else if ((is_put && !has_initialized_final_update) || !info.access_flags().is_final()) { put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield); } } --- 1034,1044 ---- get_code = Bytecodes::_getstatic; } else { get_code = Bytecodes::_getfield; } if (is_put && is_value) { ! put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_withfield); } else if ((is_put && !has_initialized_final_update) || !info.access_flags().is_final()) { put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield); } }
*** 1098,1107 **** --- 1050,1060 ---- info.offset(), state, info.access_flags().is_final(), info.access_flags().is_volatile(), info.is_flatten(), + info.is_flattenable(), pool->pool_holder() ); }
*** 1355,1365 **** switch (bytecode) { case Bytecodes::_getstatic: case Bytecodes::_putstatic: case Bytecodes::_getfield: case Bytecodes::_putfield: ! case Bytecodes::_vwithfield: resolve_get_put(thread, bytecode); break; case Bytecodes::_invokevirtual: case Bytecodes::_invokespecial: case Bytecodes::_invokestatic: --- 1308,1318 ---- switch (bytecode) { case Bytecodes::_getstatic: case Bytecodes::_putstatic: case Bytecodes::_getfield: case Bytecodes::_putfield: ! case Bytecodes::_withfield: resolve_get_put(thread, bytecode); break; case Bytecodes::_invokevirtual: case Bytecodes::_invokespecial: case Bytecodes::_invokestatic:
< prev index next >