122 if (!k->is_initialized()) k->initialize(CHECK_(empty)); |
122 if (!k->is_initialized()) k->initialize(CHECK_(empty)); |
123 return Handle(THREAD, k->allocate_instance(THREAD)); |
123 return Handle(THREAD, k->allocate_instance(THREAD)); |
124 } |
124 } |
125 |
125 |
126 oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) { |
126 oop MethodHandles::init_MemberName(oop mname_oop, oop target_oop) { |
127 klassOop target_klass = target_oop->klass(); |
127 Klass* target_klass = target_oop->klass(); |
128 if (target_klass == SystemDictionary::reflect_Field_klass()) { |
128 if (target_klass == SystemDictionary::reflect_Field_klass()) { |
129 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() |
129 oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder() |
130 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() |
130 int slot = java_lang_reflect_Field::slot(target_oop); // fd.index() |
131 int mods = java_lang_reflect_Field::modifiers(target_oop); |
131 int mods = java_lang_reflect_Field::modifiers(target_oop); |
132 oop type = java_lang_reflect_Field::type(target_oop); |
132 oop type = java_lang_reflect_Field::type(target_oop); |
133 oop name = java_lang_reflect_Field::name(target_oop); |
133 oop name = java_lang_reflect_Field::name(target_oop); |
134 klassOop k = java_lang_Class::as_klassOop(clazz); |
134 Klass* k = java_lang_Class::as_Klass(clazz); |
135 intptr_t offset = instanceKlass::cast(k)->field_offset(slot); |
135 intptr_t offset = InstanceKlass::cast(k)->field_offset(slot); |
136 return init_field_MemberName(mname_oop, k, accessFlags_from(mods), type, name, offset); |
136 return init_field_MemberName(mname_oop, k, accessFlags_from(mods), type, name, offset); |
137 } else if (target_klass == SystemDictionary::reflect_Method_klass()) { |
137 } else if (target_klass == SystemDictionary::reflect_Method_klass()) { |
138 oop clazz = java_lang_reflect_Method::clazz(target_oop); |
138 oop clazz = java_lang_reflect_Method::clazz(target_oop); |
139 int slot = java_lang_reflect_Method::slot(target_oop); |
139 int slot = java_lang_reflect_Method::slot(target_oop); |
140 klassOop k = java_lang_Class::as_klassOop(clazz); |
140 Klass* k = java_lang_Class::as_Klass(clazz); |
141 if (k != NULL && Klass::cast(k)->oop_is_instance()) { |
141 if (k != NULL && Klass::cast(k)->oop_is_instance()) { |
142 methodOop m = instanceKlass::cast(k)->method_with_idnum(slot); |
142 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
143 return init_method_MemberName(mname_oop, m, true, k); |
143 return init_method_MemberName(mname_oop, m, true, k); |
144 } |
144 } |
145 } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { |
145 } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { |
146 oop clazz = java_lang_reflect_Constructor::clazz(target_oop); |
146 oop clazz = java_lang_reflect_Constructor::clazz(target_oop); |
147 int slot = java_lang_reflect_Constructor::slot(target_oop); |
147 int slot = java_lang_reflect_Constructor::slot(target_oop); |
148 klassOop k = java_lang_Class::as_klassOop(clazz); |
148 Klass* k = java_lang_Class::as_Klass(clazz); |
149 if (k != NULL && Klass::cast(k)->oop_is_instance()) { |
149 if (k != NULL && Klass::cast(k)->oop_is_instance()) { |
150 methodOop m = instanceKlass::cast(k)->method_with_idnum(slot); |
150 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); |
151 return init_method_MemberName(mname_oop, m, false, k); |
151 return init_method_MemberName(mname_oop, m, false, k); |
152 } |
152 } |
153 } else if (target_klass == SystemDictionary::MemberName_klass()) { |
153 } else if (target_klass == SystemDictionary::MemberName_klass()) { |
154 // Note: This only works if the MemberName has already been resolved. |
154 // Note: This only works if the MemberName has already been resolved. |
155 oop clazz = java_lang_invoke_MemberName::clazz(target_oop); |
155 oop clazz = java_lang_invoke_MemberName::clazz(target_oop); |
156 int flags = java_lang_invoke_MemberName::flags(target_oop); |
156 int flags = java_lang_invoke_MemberName::flags(target_oop); |
157 oop vmtarget = java_lang_invoke_MemberName::vmtarget(target_oop); |
157 Metadata* vmtarget=java_lang_invoke_MemberName::vmtarget(target_oop); |
158 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(target_oop); |
158 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(target_oop); |
159 klassOop k = java_lang_Class::as_klassOop(clazz); |
159 Klass* k = java_lang_Class::as_Klass(clazz); |
160 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
160 int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK; |
161 if (vmtarget == NULL) return NULL; // not resolved |
161 if (vmtarget == NULL) return NULL; // not resolved |
162 if ((flags & IS_FIELD) != 0) { |
162 if ((flags & IS_FIELD) != 0) { |
163 assert(vmtarget->is_klass(), "field vmtarget is klassOop"); |
163 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
164 int basic_mods = (ref_kind_is_static(ref_kind) ? JVM_ACC_STATIC : 0); |
164 int basic_mods = (ref_kind_is_static(ref_kind) ? JVM_ACC_STATIC : 0); |
165 // FIXME: how does k (receiver_limit) contribute? |
165 // FIXME: how does k (receiver_limit) contribute? |
166 return init_field_MemberName(mname_oop, klassOop(vmtarget), accessFlags_from(basic_mods), NULL, NULL, vmindex); |
166 return init_field_MemberName(mname_oop, (Klass*)vmtarget, accessFlags_from(basic_mods), NULL, NULL, vmindex); |
167 } else if ((flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) { |
167 } else if ((flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) { |
168 assert(vmtarget->is_method(), "method or constructor vmtarget is methodOop"); |
168 assert(vmtarget->is_method(), "method or constructor vmtarget is Method*"); |
169 return init_method_MemberName(mname_oop, methodOop(vmtarget), ref_kind_does_dispatch(ref_kind), k); |
169 return init_method_MemberName(mname_oop, (Method*)vmtarget, ref_kind_does_dispatch(ref_kind), k); |
170 } else { |
170 } else { |
171 return NULL; |
171 return NULL; |
172 } |
172 } |
173 } |
173 } |
174 return NULL; |
174 return NULL; |
175 } |
175 } |
176 |
176 |
177 oop MethodHandles::init_method_MemberName(oop mname_oop, methodOop m, bool do_dispatch, |
177 oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch, |
178 klassOop receiver_limit) { |
178 Klass* receiver_limit) { |
179 AccessFlags mods = m->access_flags(); |
179 AccessFlags mods = m->access_flags(); |
180 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
180 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS ); |
181 int vmindex = methodOopDesc::nonvirtual_vtable_index; // implies never any dispatch |
181 int vmindex = Method::nonvirtual_vtable_index; // implies never any dispatch |
182 klassOop mklass = m->method_holder(); |
182 Klass* mklass = m->method_holder(); |
183 if (receiver_limit == NULL) |
183 if (receiver_limit == NULL) |
184 receiver_limit = mklass; |
184 receiver_limit = mklass; |
185 if (m->is_initializer()) { |
185 if (m->is_initializer()) { |
186 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
186 flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
187 } else if (mods.is_static()) { |
187 } else if (mods.is_static()) { |
236 if (defc->is_interface() && Klass::cast(m->method_holder())->is_interface()) { |
236 if (defc->is_interface() && Klass::cast(m->method_holder())->is_interface()) { |
237 // LinkResolver does not report itable indexes! (fix this?) |
237 // LinkResolver does not report itable indexes! (fix this?) |
238 vmindex = klassItable::compute_itable_index(m()); |
238 vmindex = klassItable::compute_itable_index(m()); |
239 } else if (m->can_be_statically_bound()) { |
239 } else if (m->can_be_statically_bound()) { |
240 // LinkResolver reports vtable index even for final methods! |
240 // LinkResolver reports vtable index even for final methods! |
241 vmindex = methodOopDesc::nonvirtual_vtable_index; |
241 vmindex = Method::nonvirtual_vtable_index; |
242 } else { |
242 } else { |
243 vmindex = info.vtable_index(); |
243 vmindex = info.vtable_index(); |
244 } |
244 } |
245 oop res = init_method_MemberName(mname_oop, m(), (vmindex >= 0), defc()); |
245 oop res = init_method_MemberName(mname_oop, m(), (vmindex >= 0), defc()); |
246 assert(res == NULL || (java_lang_invoke_MemberName::vmindex(res) == vmindex), ""); |
246 assert(res == NULL || (java_lang_invoke_MemberName::vmindex(res) == vmindex), ""); |
247 return Handle(THREAD, res); |
247 return Handle(THREAD, res); |
248 } |
248 } |
249 |
249 |
250 oop MethodHandles::init_field_MemberName(oop mname_oop, klassOop field_holder, |
250 oop MethodHandles::init_field_MemberName(oop mname_oop, Klass* field_holder, |
251 AccessFlags mods, oop type, oop name, |
251 AccessFlags mods, oop type, oop name, |
252 intptr_t offset, bool is_setter) { |
252 intptr_t offset, bool is_setter) { |
253 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
253 int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS ); |
254 flags |= IS_FIELD | ((mods.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
254 flags |= IS_FIELD | ((mods.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
255 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
255 if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT); |
256 oop vmtarget = field_holder; |
256 Metadata* vmtarget = field_holder; |
257 int vmindex = offset; // determines the field uniquely when combined with static bit |
257 int vmindex = offset; // determines the field uniquely when combined with static bit |
258 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
258 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
259 java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget); |
259 java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget); |
260 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); |
260 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); |
261 java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(field_holder)->java_mirror()); |
261 java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(field_holder)->java_mirror()); |
291 // A method is signature polymorphic if and only if all of the following conditions hold : |
291 // A method is signature polymorphic if and only if all of the following conditions hold : |
292 // * It is declared in the java.lang.invoke.MethodHandle class. |
292 // * It is declared in the java.lang.invoke.MethodHandle class. |
293 // * It has a single formal parameter of type Object[]. |
293 // * It has a single formal parameter of type Object[]. |
294 // * It has a return type of Object. |
294 // * It has a return type of Object. |
295 // * It has the ACC_VARARGS and ACC_NATIVE flags set. |
295 // * It has the ACC_VARARGS and ACC_NATIVE flags set. |
296 bool MethodHandles::is_method_handle_invoke_name(klassOop klass, Symbol* name) { |
296 bool MethodHandles::is_method_handle_invoke_name(Klass* klass, Symbol* name) { |
297 if (klass == NULL) |
297 if (klass == NULL) |
298 return false; |
298 return false; |
299 // The following test will fail spuriously during bootstrap of MethodHandle itself: |
299 // The following test will fail spuriously during bootstrap of MethodHandle itself: |
300 // if (klass != SystemDictionary::MethodHandle_klass()) |
300 // if (klass != SystemDictionary::MethodHandle_klass()) |
301 // Test the name instead: |
301 // Test the name instead: |
302 if (Klass::cast(klass)->name() != vmSymbols::java_lang_invoke_MethodHandle()) |
302 if (Klass::cast(klass)->name() != vmSymbols::java_lang_invoke_MethodHandle()) |
303 return false; |
303 return false; |
304 Symbol* poly_sig = vmSymbols::object_array_object_signature(); |
304 Symbol* poly_sig = vmSymbols::object_array_object_signature(); |
305 methodOop m = instanceKlass::cast(klass)->find_method(name, poly_sig); |
305 Method* m = InstanceKlass::cast(klass)->find_method(name, poly_sig); |
306 if (m == NULL) return false; |
306 if (m == NULL) return false; |
307 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; |
307 int required = JVM_ACC_NATIVE | JVM_ACC_VARARGS; |
308 int flags = m->access_flags().as_int(); |
308 int flags = m->access_flags().as_int(); |
309 return (flags & required) == required; |
309 return (flags & required) == required; |
310 } |
310 } |
349 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; |
349 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToSpecial_name): return vmIntrinsics::_linkToSpecial; |
350 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; |
350 case vmSymbols::VM_SYMBOL_ENUM_NAME(linkToInterface_name): return vmIntrinsics::_linkToInterface; |
351 } |
351 } |
352 |
352 |
353 // Cover the case of invokeExact and any future variants of invokeFoo. |
353 // Cover the case of invokeExact and any future variants of invokeFoo. |
354 klassOop mh_klass = SystemDictionary::well_known_klass( |
354 Klass* mh_klass = SystemDictionary::well_known_klass( |
355 SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) ); |
355 SystemDictionary::WK_KLASS_ENUM_NAME(MethodHandle_klass) ); |
356 if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name)) |
356 if (mh_klass != NULL && is_method_handle_invoke_name(mh_klass, name)) |
357 return vmIntrinsics::_invokeGeneric; |
357 return vmIntrinsics::_invokeGeneric; |
358 |
358 |
359 // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against. |
359 // Note: The pseudo-intrinsic _compiledLambdaForm is never linked against. |
360 // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic. |
360 // Instead it is used to mark lambda forms bound to invokehandle or invokedynamic. |
361 return vmIntrinsics::_none; |
361 return vmIntrinsics::_none; |
362 } |
362 } |
363 |
363 |
364 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(klassOop klass, Symbol* name) { |
364 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Klass* klass, Symbol* name) { |
365 if (klass != NULL && |
365 if (klass != NULL && |
366 Klass::cast(klass)->name() == vmSymbols::java_lang_invoke_MethodHandle()) { |
366 Klass::cast(klass)->name() == vmSymbols::java_lang_invoke_MethodHandle()) { |
367 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
367 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
368 if (iid != vmIntrinsics::_none) |
368 if (iid != vmIntrinsics::_none) |
369 return iid; |
369 return iid; |
566 } else { |
566 } else { |
567 int len = s->utf8_length(); |
567 int len = s->utf8_length(); |
568 if (s->byte_at(0) == 'L' && s->byte_at(len-1) == ';') { |
568 if (s->byte_at(0) == 'L' && s->byte_at(len-1) == ';') { |
569 TempNewSymbol cname = SymbolTable::probe((const char*)&s->bytes()[1], len-2); |
569 TempNewSymbol cname = SymbolTable::probe((const char*)&s->bytes()[1], len-2); |
570 if (cname == NULL) return NULL; |
570 if (cname == NULL) return NULL; |
571 klassOop wkk = SystemDictionary::find_well_known_klass(cname); |
571 Klass* wkk = SystemDictionary::find_well_known_klass(cname); |
572 if (wkk == NULL) return NULL; |
572 if (wkk == NULL) return NULL; |
573 return Klass::cast(wkk)->java_mirror(); |
573 return Klass::cast(wkk)->java_mirror(); |
574 } |
574 } |
575 } |
575 } |
576 } |
576 } |
577 return NULL; |
577 return NULL; |
578 } |
578 } |
579 |
579 |
|
580 |
580 // An unresolved member name is a mere symbolic reference. |
581 // An unresolved member name is a mere symbolic reference. |
581 // Resolving it plants a vmtarget/vmindex in it, |
582 // Resolving it plants a vmtarget/vmindex in it, |
582 // which refers dirctly to JVM internals. |
583 // which refers directly to JVM internals. |
583 Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) { |
584 Handle MethodHandles::resolve_MemberName(Handle mname, TRAPS) { |
584 Handle empty; |
585 Handle empty; |
585 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
586 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
586 |
587 |
587 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
588 if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) { |
588 // Already resolved. |
589 // Already resolved. |
589 DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname())); |
590 DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname())); |
590 assert(vmindex >= methodOopDesc::nonvirtual_vtable_index, ""); |
591 assert(vmindex >= Method::nonvirtual_vtable_index, ""); |
591 return mname; |
592 return mname; |
592 } |
593 } |
593 |
594 |
594 Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname())); |
595 Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname())); |
595 Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname())); |
596 Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname())); |
703 } |
704 } |
704 case IS_FIELD: |
705 case IS_FIELD: |
705 { |
706 { |
706 // This is taken from LinkResolver::resolve_field, sans access checks. |
707 // This is taken from LinkResolver::resolve_field, sans access checks. |
707 fieldDescriptor fd; // find_field initializes fd if found |
708 fieldDescriptor fd; // find_field initializes fd if found |
708 KlassHandle sel_klass(THREAD, instanceKlass::cast(defc())->find_field(name, type, &fd)); |
709 KlassHandle sel_klass(THREAD, InstanceKlass::cast(defc())->find_field(name, type, &fd)); |
709 // check if field exists; i.e., if a klass containing the field def has been selected |
710 // check if field exists; i.e., if a klass containing the field def has been selected |
710 if (sel_klass.is_null()) return empty; // should not happen |
711 if (sel_klass.is_null()) return empty; // should not happen |
711 oop type = field_signature_type_or_null(fd.signature()); |
712 oop type = field_signature_type_or_null(fd.signature()); |
712 oop name = field_name_or_null(fd.name()); |
713 oop name = field_name_or_null(fd.name()); |
713 bool is_setter = (ref_kind_is_valid(ref_kind) && ref_kind_is_setter(ref_kind)); |
714 bool is_setter = (ref_kind_is_valid(ref_kind) && ref_kind_is_setter(ref_kind)); |
714 mname = Handle(THREAD, |
715 mname = Handle(THREAD, |
715 init_field_MemberName(mname(), sel_klass->as_klassOop(), |
716 init_field_MemberName(mname(), sel_klass(), |
716 fd.access_flags(), type, name, fd.offset(), is_setter)); |
717 fd.access_flags(), type, name, fd.offset(), is_setter)); |
717 return mname; |
718 return mname; |
718 } |
719 } |
719 default: |
720 default: |
720 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty); |
721 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty); |
1105 |
1106 |
1106 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1107 JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname_jh)) { |
1107 if (mname_jh == NULL) return NULL; |
1108 if (mname_jh == NULL) return NULL; |
1108 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1109 Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh)); |
1109 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
1110 intptr_t vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
1110 Handle vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
1111 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
1111 objArrayHandle result = oopFactory::new_objArray(SystemDictionary::Object_klass(), 2, CHECK_NULL); |
1112 objArrayHandle result = oopFactory::new_objArray(SystemDictionary::Object_klass(), 2, CHECK_NULL); |
1112 jvalue vmindex_value; vmindex_value.j = (long)vmindex; |
1113 jvalue vmindex_value; vmindex_value.j = (long)vmindex; |
1113 oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL); |
1114 oop x = java_lang_boxing_object::create(T_LONG, &vmindex_value, CHECK_NULL); |
1114 result->obj_at_put(0, x); |
1115 result->obj_at_put(0, x); |
1115 x = NULL; |
1116 x = NULL; |
1116 if (vmtarget.is_null() || vmtarget->is_instance()) { |
1117 if (vmtarget == NULL) { |
1117 x = vmtarget(); |
1118 x = NULL; |
1118 } else if (vmtarget->is_klass()) { |
1119 } else if (vmtarget->is_klass()) { |
1119 x = Klass::cast((klassOop) vmtarget())->java_mirror(); |
1120 x = Klass::cast((Klass*) vmtarget)->java_mirror(); |
1120 } else { |
1121 } else if (vmtarget->is_method()) { |
1121 Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL); |
1122 Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL); |
1122 if (vmtarget->is_method()) |
1123 x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL); |
1123 x = MethodHandles::init_method_MemberName(mname2(), methodOop(vmtarget()), false, NULL); |
|
1124 else |
|
1125 x = MethodHandles::init_MemberName(mname2(), vmtarget()); |
|
1126 } |
1124 } |
1127 result->obj_at_put(1, x); |
1125 result->obj_at_put(1, x); |
1128 return JNIHandles::make_local(env, result()); |
1126 return JNIHandles::make_local(env, result()); |
1129 } |
1127 } |
1130 JVM_END |
1128 JVM_END |
1135 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1133 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
1136 JVM_ENTRY(jint, MHN_getMembers(JNIEnv *env, jobject igcls, |
1134 JVM_ENTRY(jint, MHN_getMembers(JNIEnv *env, jobject igcls, |
1137 jclass clazz_jh, jstring name_jh, jstring sig_jh, |
1135 jclass clazz_jh, jstring name_jh, jstring sig_jh, |
1138 int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) { |
1136 int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) { |
1139 if (clazz_jh == NULL || results_jh == NULL) return -1; |
1137 if (clazz_jh == NULL || results_jh == NULL) return -1; |
1140 KlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz_jh))); |
1138 KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh))); |
1141 |
1139 |
1142 objArrayHandle results(THREAD, (objArrayOop) JNIHandles::resolve(results_jh)); |
1140 objArrayHandle results(THREAD, (objArrayOop) JNIHandles::resolve(results_jh)); |
1143 if (results.is_null() || !results->is_objArray()) return -1; |
1141 if (results.is_null() || !results->is_objArray()) return -1; |
1144 |
1142 |
1145 TempNewSymbol name = NULL; |
1143 TempNewSymbol name = NULL; |
1231 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1243 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1232 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1244 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1233 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1245 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1234 }; |
1246 }; |
1235 |
1247 |
|
1248 static JNINativeMethod invoke_methods[] = { |
|
1249 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)}, |
|
1250 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)} |
|
1251 }; |
|
1252 |
1236 // This one function is exported, used by NativeLookup. |
1253 // This one function is exported, used by NativeLookup. |
1237 |
1254 |
1238 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
1255 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
1239 if (!EnableInvokeDynamic) { |
1256 if (!EnableInvokeDynamic) { |
1240 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |
1257 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |