< 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 >