< prev index next >

src/share/vm/interpreter/interpreterRuntime.cpp

Print this page

        

*** 586,595 **** --- 586,625 ---- InstanceKlass* klass = InstanceKlass::cast(info.field_holder()); bool uninitialized_static = ((bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic) && !klass->is_initialized()); Bytecodes::Code get_code = (Bytecodes::Code)0; + + if (info.is_accessor()) { + // If it is an accessor (not a real field) change bytecode + // semantic to be a call to the accessor-method) + InstanceKlass* current_klass = method(thread)->method_holder(); + // find method based on get/put + Method* m = klass->method_with_idnum(is_put + ? info.get_put_accessor() + : info.get_get_accessor() + ); + + // Create a linkinfo to resolve the method + LinkInfo linfo(klass,m->name(),m->signature(),current_klass,true); + + // Resolve static/non-static method and initialize cp_cache_entry + // accordingly + if (is_static) { + methodHandle mh = LinkResolver::resolve_static_call_or_null(linfo); + cp_cache_entry->set_direct_call( + Bytecodes::_invokestatic, + mh); + }else { + methodHandle mh = LinkResolver::resolve_virtual_call_or_null(klass,linfo); + cp_cache_entry->set_vtable_call( + Bytecodes::_invokevirtual, + mh, + m->vtable_index()); + } + + }else { if (!uninitialized_static) { get_code = ((is_static) ? Bytecodes::_getstatic : Bytecodes::_getfield); if (is_put || !info.access_flags().is_final()) { put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield); }
*** 604,613 **** --- 634,644 ---- state, info.access_flags().is_final(), info.access_flags().is_volatile(), pool->pool_holder() ); + } } //------------------------------------------------------------------------------------------------------------------------ // Synchronization
< prev index next >