< prev index next >
src/share/vm/prims/methodHandles.cpp
Print this page
@@ -176,11 +176,11 @@
}
}
return NULL;
}
-oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, bool intern) {
+oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
assert(info.resolved_appendix().is_null(), "only normal methods here");
methodHandle m = info.resolved_method();
assert(m.not_null(), "null method handle");
KlassHandle m_klass = m->method_holder();
assert(m.not_null(), "null holder for method handle");
@@ -277,11 +277,17 @@
// The clazz must be eagerly stored, because it provides a GC
// root to help keep alive the Method*.
// If relevant, the vtable or itable value is stored as vmindex.
// This is done eagerly, since it is readily available without
// constructing any new objects.
- return m->method_holder()->add_member_name(mname, intern);
+ // TO DO: maybe intern mname_oop
+ if (m->method_holder()->add_member_name(mname)) {
+ return mname();
+ } else {
+ // Redefinition caused this to fail. Return NULL (and an exception?)
+ return NULL;
+ }
}
oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
@@ -967,13 +973,11 @@
} 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);
- // Since this is going through the methods to create MemberNames, don't search
- // for matching methods already in the table
- oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false);
+ 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
}
@@ -1050,38 +1054,13 @@
jweak ref = this->at(idx);
JNIHandles::destroy_weak_global(ref);
}
}
-oop MemberNameTable::add_member_name(jweak mem_name_wref) {
+void MemberNameTable::add_member_name(jweak mem_name_wref) {
assert_locked_or_safepoint(MemberNameTable_lock);
this->push(mem_name_wref);
- return JNIHandles::resolve(mem_name_wref);
-}
-
-oop MemberNameTable::find_or_add_member_name(jweak mem_name_wref) {
- assert_locked_or_safepoint(MemberNameTable_lock);
- oop new_mem_name = JNIHandles::resolve(mem_name_wref);
-
- // Find matching member name in the list.
- // This is linear because these because these are short lists.
- int len = this->length();
- int new_index = len;
- for (int idx = 0; idx < len; idx++) {
- oop mname = JNIHandles::resolve(this->at(idx));
- if (mname == NULL) {
- new_index = idx;
- continue;
- }
- if (java_lang_invoke_MemberName::equals(new_mem_name, mname)) {
- JNIHandles::destroy_weak_global(mem_name_wref);
- return mname;
- }
- }
- // Not found, push the new one, or reuse empty slot
- this->at_put_grow(new_index, mem_name_wref);
- return new_mem_name;
}
#if INCLUDE_JVMTI
// It is called at safepoint only for RedefineClasses
void MemberNameTable::adjust_method_entries(InstanceKlass* holder, bool * trace_name_printed) {
< prev index next >