< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page

        

*** 177,187 **** } oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) { // This method is used from java.lang.invoke.MemberName constructors. // It fills in the new MemberName from a java.lang.reflect.Member. - Thread* thread = Thread::current(); oop target_oop = target(); Klass* target_klass = target_oop->klass(); if (target_klass == SystemDictionary::reflect_Field_klass()) { oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() --- 177,186 ----
*** 205,231 **** if (k != NULL && k->is_instance_klass()) { Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); if (m == NULL || is_signature_polymorphic(m->intrinsic_id())) return NULL; // do not resolve unless there is a concrete signature CallInfo info(m, k, CHECK_NULL); ! return init_method_MemberName(mname, info); } } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { oop clazz = java_lang_reflect_Constructor::clazz(target_oop); int slot = java_lang_reflect_Constructor::slot(target_oop); Klass* k = java_lang_Class::as_Klass(clazz); if (k != NULL && k->is_instance_klass()) { Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); if (m == NULL) return NULL; CallInfo info(m, k, CHECK_NULL); ! return init_method_MemberName(mname, info); } } return NULL; } ! oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { assert(info.resolved_appendix().is_null(), "only normal methods here"); methodHandle m(Thread::current(), info.resolved_method()); assert(m.not_null(), "null method handle"); InstanceKlass* m_klass = m->method_holder(); assert(m_klass != NULL, "null holder for method handle"); --- 204,230 ---- if (k != NULL && k->is_instance_klass()) { Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); if (m == NULL || is_signature_polymorphic(m->intrinsic_id())) return NULL; // do not resolve unless there is a concrete signature CallInfo info(m, k, CHECK_NULL); ! return init_method_MemberName(mname, info, THREAD); } } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { oop clazz = java_lang_reflect_Constructor::clazz(target_oop); int slot = java_lang_reflect_Constructor::slot(target_oop); Klass* k = java_lang_Class::as_Klass(clazz); if (k != NULL && k->is_instance_klass()) { Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); if (m == NULL) return NULL; CallInfo info(m, k, CHECK_NULL); ! return init_method_MemberName(mname, info, THREAD); } } return NULL; } ! oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) { assert(info.resolved_appendix().is_null(), "only normal methods here"); methodHandle m(Thread::current(), info.resolved_method()); assert(m.not_null(), "null method handle"); InstanceKlass* m_klass = m->method_holder(); assert(m_klass != NULL, "null holder for method handle");
*** 787,797 **** // since there is no way to bind this value into the MemberName. // Caller is responsible to prevent this from happening. THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); } result.set_resolved_method_name(CHECK_(empty)); ! oop mname2 = init_method_MemberName(mname, result); return Handle(THREAD, mname2); } case IS_CONSTRUCTOR: { CallInfo result; --- 786,796 ---- // since there is no way to bind this value into the MemberName. // Caller is responsible to prevent this from happening. THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); } result.set_resolved_method_name(CHECK_(empty)); ! oop mname2 = init_method_MemberName(mname, result, THREAD); return Handle(THREAD, mname2); } case IS_CONSTRUCTOR: { CallInfo result;
*** 810,820 **** return empty; } } assert(result.is_statically_bound(), ""); result.set_resolved_method_name(CHECK_(empty)); ! oop mname2 = init_method_MemberName(mname, result); return Handle(THREAD, mname2); } case IS_FIELD: { fieldDescriptor result; // find_field initializes fd if found --- 809,819 ---- return empty; } } assert(result.is_statically_bound(), ""); result.set_resolved_method_name(CHECK_(empty)); ! oop mname2 = init_method_MemberName(mname, result, THREAD); return Handle(THREAD, mname2); } case IS_FIELD: { fieldDescriptor result; // find_field initializes fd if found
*** 920,931 **** Symbol* name, Symbol* sig, int mflags, Klass* caller, int skip, objArrayHandle results, TRAPS) { // %%% take caller into account! - Thread* thread = Thread::current(); - if (k == NULL || !k->is_instance_klass()) return -1; int rfill = 0, rlimit = results->length(), rskip = skip; // overflow measurement: int overflow = 0, overflow_limit = MAX2(1000, rlimit); --- 919,928 ----
*** 958,968 **** continue; // passed the filters if (rskip > 0) { --rskip; } else if (rfill < rlimit) { ! Handle result(thread, results->obj_at(rfill++)); if (!java_lang_invoke_MemberName::is_instance(result())) return -99; // caller bug! oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor()); if (saved != result()) results->obj_at_put(rfill-1, saved); // show saved instance to user --- 955,965 ---- continue; // passed the filters if (rskip > 0) { --rskip; } else if (rfill < rlimit) { ! Handle result(THREAD, results->obj_at(rfill++)); if (!java_lang_invoke_MemberName::is_instance(result())) return -99; // caller bug! oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor()); if (saved != result()) results->obj_at_put(rfill-1, saved); // show saved instance to user
*** 1009,1023 **** continue; // passed the filters if (rskip > 0) { --rskip; } else if (rfill < rlimit) { ! Handle result(thread, results->obj_at(rfill++)); if (!java_lang_invoke_MemberName::is_instance(result())) return -99; // caller bug! CallInfo info(m, NULL, CHECK_0); ! oop saved = MethodHandles::init_method_MemberName(result, info); if (saved != result()) results->obj_at_put(rfill-1, saved); // show saved instance to user } else if (++overflow >= overflow_limit) { match_flags = 0; break; // got tired of looking at overflow } --- 1006,1020 ---- continue; // passed the filters if (rskip > 0) { --rskip; } else if (rfill < rlimit) { ! Handle result(THREAD, results->obj_at(rfill++)); if (!java_lang_invoke_MemberName::is_instance(result())) return -99; // caller bug! CallInfo info(m, NULL, CHECK_0); ! oop saved = MethodHandles::init_method_MemberName(result, info, THREAD); if (saved != result()) results->obj_at_put(rfill-1, saved); // show saved instance to user } else if (++overflow >= overflow_limit) { match_flags = 0; break; // got tired of looking at overflow }
*** 1300,1310 **** Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); assert(vmtarget != NULL && vmtarget->is_method(), "vmtarget is only method"); x = mname(); } result->obj_at_put(1, x); ! return JNIHandles::make_local(env, result()); } JVM_END --- 1297,1307 ---- Method* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); assert(vmtarget != NULL && vmtarget->is_method(), "vmtarget is only method"); x = mname(); } result->obj_at_put(1, x); ! return JNIHandles::make_local(THREAD, result()); } JVM_END
*** 1548,1558 **** JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { assert(!MethodHandles::enabled(), "must not be enabled"); assert(SystemDictionary::MethodHandle_klass() != NULL, "should be present"); oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); ! jclass MH_class = (jclass) JNIHandles::make_local(env, mirror); { ThreadToNativeFromVM ttnfv(thread); int status = env->RegisterNatives(MHN_class, MHN_methods, sizeof(MHN_methods)/sizeof(JNINativeMethod)); --- 1545,1555 ---- JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { assert(!MethodHandles::enabled(), "must not be enabled"); assert(SystemDictionary::MethodHandle_klass() != NULL, "should be present"); oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); ! jclass MH_class = (jclass) JNIHandles::make_local(THREAD, mirror); { ThreadToNativeFromVM ttnfv(thread); int status = env->RegisterNatives(MHN_class, MHN_methods, sizeof(MHN_methods)/sizeof(JNINativeMethod));
< prev index next >