Mercurial > hg > truffle
comparison src/share/vm/prims/methodHandles.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 93c71eb28866 |
children | d17383603741 |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
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()) { |
196 vmindex = klassItable::compute_itable_index(m); | 196 vmindex = klassItable::compute_itable_index(m); |
197 } else if (mklass != receiver_limit && Klass::cast(mklass)->is_interface()) { | 197 } else if (mklass != receiver_limit && Klass::cast(mklass)->is_interface()) { |
198 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); | 198 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); |
199 // it is a miranda method, so m->vtable_index is not what we want | 199 // it is a miranda method, so m->vtable_index is not what we want |
200 ResourceMark rm; | 200 ResourceMark rm; |
201 klassVtable* vt = instanceKlass::cast(receiver_limit)->vtable(); | 201 klassVtable* vt = InstanceKlass::cast(receiver_limit)->vtable(); |
202 vmindex = vt->index_of_miranda(m->name(), m->signature()); | 202 vmindex = vt->index_of_miranda(m->name(), m->signature()); |
203 } else if (!do_dispatch || m->can_be_statically_bound()) { | 203 } else if (!do_dispatch || m->can_be_statically_bound()) { |
204 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); | 204 flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); |
205 } else { | 205 } else { |
206 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); | 206 flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT); |
212 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index | 212 java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex); // vtable/itable index |
213 java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(receiver_limit)->java_mirror()); | 213 java_lang_invoke_MemberName::set_clazz(mname_oop, Klass::cast(receiver_limit)->java_mirror()); |
214 // Note: name and type can be lazily computed by resolve_MemberName, | 214 // Note: name and type can be lazily computed by resolve_MemberName, |
215 // if Java code needs them as resolved String and MethodType objects. | 215 // if Java code needs them as resolved String and MethodType objects. |
216 // The clazz must be eagerly stored, because it provides a GC | 216 // The clazz must be eagerly stored, because it provides a GC |
217 // root to help keep alive the methodOop. | 217 // root to help keep alive the Method*. |
218 // If relevant, the vtable or itable value is stored as vmindex. | 218 // If relevant, the vtable or itable value is stored as vmindex. |
219 // This is done eagerly, since it is readily available without | 219 // This is done eagerly, since it is readily available without |
220 // constructing any new objects. | 220 // constructing any new objects. |
221 // TO DO: maybe intern mname_oop | 221 // TO DO: maybe intern mname_oop |
222 return mname_oop; | 222 return mname_oop; |
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()); |
274 return mname_oop; | 274 return mname_oop; |
275 } | 275 } |
276 | 276 |
277 Handle MethodHandles::init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS) { | 277 Handle MethodHandles::init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS) { |
278 return Handle(); | 278 return Handle(); |
279 #if 0 | 279 #if 0 // FIXME |
280 KlassHandle field_holder = info.klass(); | 280 KlassHandle field_holder = info.klass(); |
281 intptr_t field_offset = info.field_offset(); | 281 intptr_t field_offset = info.field_offset(); |
282 return init_field_MemberName(mname_oop, field_holder(), | 282 return init_field_MemberName(mname_oop, field_holder(), |
283 info.access_flags(), | 283 info.access_flags(), |
284 type, name, | 284 type, name, |
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())); |
607 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty); | 608 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty); |
608 } | 609 } |
609 | 610 |
610 instanceKlassHandle defc; | 611 instanceKlassHandle defc; |
611 { | 612 { |
612 klassOop defc_klassOop = java_lang_Class::as_klassOop(defc_oop()); | 613 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop()); |
613 if (defc_klassOop == NULL) return empty; // a primitive; no resolution possible | 614 if (defc_klass == NULL) return empty; // a primitive; no resolution possible |
614 if (!Klass::cast(defc_klassOop)->oop_is_instance()) { | 615 if (!Klass::cast(defc_klass)->oop_is_instance()) { |
615 if (!Klass::cast(defc_klassOop)->oop_is_array()) return empty; | 616 if (!Klass::cast(defc_klass)->oop_is_array()) return empty; |
616 defc_klassOop = SystemDictionary::Object_klass(); | 617 defc_klass = SystemDictionary::Object_klass(); |
617 } | 618 } |
618 defc = instanceKlassHandle(THREAD, defc_klassOop); | 619 defc = instanceKlassHandle(THREAD, defc_klass); |
619 } | 620 } |
620 if (defc.is_null()) { | 621 if (defc.is_null()) { |
621 THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty); | 622 THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty); |
622 } | 623 } |
623 defc->link_class(CHECK_(empty)); // possible safepoint | 624 defc->link_class(CHECK_(empty)); // possible safepoint |
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); |
727 // may have null defc, name, and type fields. | 728 // may have null defc, name, and type fields. |
728 // Resolving it plants a vmtarget/vmindex in it, | 729 // Resolving it plants a vmtarget/vmindex in it, |
729 // which refers directly to JVM internals. | 730 // which refers directly to JVM internals. |
730 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { | 731 void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { |
731 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); | 732 assert(java_lang_invoke_MemberName::is_instance(mname()), ""); |
732 oop vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); | 733 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname()); |
733 int vmindex = java_lang_invoke_MemberName::vmindex(mname()); | 734 int vmindex = java_lang_invoke_MemberName::vmindex(mname()); |
734 if (vmtarget == NULL) { | 735 if (vmtarget == NULL) { |
735 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand"); | 736 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "nothing to expand"); |
736 } | 737 } |
737 | 738 |
750 | 751 |
751 switch (flags & ALL_KINDS) { | 752 switch (flags & ALL_KINDS) { |
752 case IS_METHOD: | 753 case IS_METHOD: |
753 case IS_CONSTRUCTOR: | 754 case IS_CONSTRUCTOR: |
754 { | 755 { |
755 assert(vmtarget->is_method(), "method or constructor vmtarget is methodOop"); | 756 assert(vmtarget->is_method(), "method or constructor vmtarget is Method*"); |
756 methodHandle m(THREAD, methodOop(vmtarget)); | 757 methodHandle m(THREAD, (Method*)vmtarget); |
757 DEBUG_ONLY(vmtarget = NULL); // safety | 758 DEBUG_ONLY(vmtarget = NULL); // safety |
758 if (m.is_null()) break; | 759 if (m.is_null()) break; |
759 if (!have_defc) { | 760 if (!have_defc) { |
760 klassOop defc = m->method_holder(); | 761 Klass* defc = m->method_holder(); |
761 java_lang_invoke_MemberName::set_clazz(mname(), Klass::cast(defc)->java_mirror()); | 762 java_lang_invoke_MemberName::set_clazz(mname(), Klass::cast(defc)->java_mirror()); |
762 } | 763 } |
763 if (!have_name) { | 764 if (!have_name) { |
764 //not java_lang_String::create_from_symbol; let's intern member names | 765 //not java_lang_String::create_from_symbol; let's intern member names |
765 Handle name = StringTable::intern(m->name(), CHECK); | 766 Handle name = StringTable::intern(m->name(), CHECK); |
772 return; | 773 return; |
773 } | 774 } |
774 case IS_FIELD: | 775 case IS_FIELD: |
775 { | 776 { |
776 // This is taken from LinkResolver::resolve_field, sans access checks. | 777 // This is taken from LinkResolver::resolve_field, sans access checks. |
777 assert(vmtarget->is_klass(), "field vmtarget is klassOop"); | 778 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
778 if (!Klass::cast((klassOop) vmtarget)->oop_is_instance()) break; | 779 if (!Klass::cast((Klass*) vmtarget)->oop_is_instance()) break; |
779 instanceKlassHandle defc(THREAD, (klassOop) vmtarget); | 780 instanceKlassHandle defc(THREAD, (Klass*) vmtarget); |
780 DEBUG_ONLY(vmtarget = NULL); // safety | 781 DEBUG_ONLY(vmtarget = NULL); // safety |
781 bool is_static = ((flags & JVM_ACC_STATIC) != 0); | 782 bool is_static = ((flags & JVM_ACC_STATIC) != 0); |
782 fieldDescriptor fd; // find_field initializes fd if found | 783 fieldDescriptor fd; // find_field initializes fd if found |
783 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) | 784 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) |
784 break; // cannot expand | 785 break; // cannot expand |
802 } | 803 } |
803 } | 804 } |
804 THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format"); | 805 THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format"); |
805 } | 806 } |
806 | 807 |
807 int MethodHandles::find_MemberNames(klassOop k, | 808 int MethodHandles::find_MemberNames(Klass* k, |
808 Symbol* name, Symbol* sig, | 809 Symbol* name, Symbol* sig, |
809 int mflags, klassOop caller, | 810 int mflags, Klass* caller, |
810 int skip, objArrayOop results) { | 811 int skip, objArrayOop results) { |
811 DEBUG_ONLY(No_Safepoint_Verifier nsv); | 812 DEBUG_ONLY(No_Safepoint_Verifier nsv); |
812 // this code contains no safepoints! | 813 // this code contains no safepoints! |
813 | 814 |
814 // %%% take caller into account! | 815 // %%% take caller into account! |
853 oop result = results->obj_at(rfill++); | 854 oop result = results->obj_at(rfill++); |
854 if (!java_lang_invoke_MemberName::is_instance(result)) | 855 if (!java_lang_invoke_MemberName::is_instance(result)) |
855 return -99; // caller bug! | 856 return -99; // caller bug! |
856 oop type = field_signature_type_or_null(st.signature()); | 857 oop type = field_signature_type_or_null(st.signature()); |
857 oop name = field_name_or_null(st.name()); | 858 oop name = field_name_or_null(st.name()); |
858 oop saved = MethodHandles::init_field_MemberName(result, st.klass()->as_klassOop(), | 859 oop saved = MethodHandles::init_field_MemberName(result, st.klass()(), |
859 st.access_flags(), type, name, | 860 st.access_flags(), type, name, |
860 st.offset()); | 861 st.offset()); |
861 if (saved != result) | 862 if (saved != result) |
862 results->obj_at_put(rfill-1, saved); // show saved instance to user | 863 results->obj_at_put(rfill-1, saved); // show saved instance to user |
863 } else if (++overflow >= overflow_limit) { | 864 } else if (++overflow >= overflow_limit) { |
890 } | 891 } |
891 } else { | 892 } else { |
892 // caller will accept either sort; no need to adjust name | 893 // caller will accept either sort; no need to adjust name |
893 } | 894 } |
894 for (MethodStream st(k, local_only, !search_intfc); !st.eos(); st.next()) { | 895 for (MethodStream st(k, local_only, !search_intfc); !st.eos(); st.next()) { |
895 methodOop m = st.method(); | 896 Method* m = st.method(); |
896 Symbol* m_name = m->name(); | 897 Symbol* m_name = m->name(); |
897 if (m_name == clinit_name) | 898 if (m_name == clinit_name) |
898 continue; | 899 continue; |
899 if (name != NULL && ((m_name != name) ^ negate_name_test)) | 900 if (name != NULL && ((m_name != name) ^ negate_name_test)) |
900 continue; | 901 continue; |
917 } | 918 } |
918 | 919 |
919 // return number of elements we at leasted wanted to initialize | 920 // return number of elements we at leasted wanted to initialize |
920 return rfill + overflow; | 921 return rfill + overflow; |
921 } | 922 } |
922 | |
923 // | 923 // |
924 // Here are the native methods in java.lang.invoke.MethodHandleNatives | 924 // Here are the native methods in java.lang.invoke.MethodHandleNatives |
925 // They are the private interface between this JVM and the HotSpot-specific | 925 // They are the private interface between this JVM and the HotSpot-specific |
926 // Java code that implements JSR 292 method handles. | 926 // Java code that implements JSR 292 method handles. |
927 // | 927 // |
928 // Note: We use a JVM_ENTRY macro to define each of these, for this is the way | 928 // Note: We use a JVM_ENTRY macro to define each of these, for this is the way |
929 // that intrinsic (non-JNI) native methods are defined in HotSpot. | 929 // that intrinsic (non-JNI) native methods are defined in HotSpot. |
930 // | 930 // |
931 | |
931 JVM_ENTRY(jint, MHN_getConstant(JNIEnv *env, jobject igcls, jint which)) { | 932 JVM_ENTRY(jint, MHN_getConstant(JNIEnv *env, jobject igcls, jint which)) { |
932 switch (which) { | 933 switch (which) { |
933 case MethodHandles::GC_COUNT_GWT: | 934 case MethodHandles::GC_COUNT_GWT: |
934 #ifdef COMPILER2 | 935 #ifdef COMPILER2 |
935 return true; | 936 return true; |
1031 | 1032 |
1032 // The trusted Java code that calls this method should already have performed | 1033 // The trusted Java code that calls this method should already have performed |
1033 // access checks on behalf of the given caller. But, we can verify this. | 1034 // access checks on behalf of the given caller. But, we can verify this. |
1034 if (VerifyMethodHandles && caller_jh != NULL && | 1035 if (VerifyMethodHandles && caller_jh != NULL && |
1035 java_lang_invoke_MemberName::clazz(mname()) != NULL) { | 1036 java_lang_invoke_MemberName::clazz(mname()) != NULL) { |
1036 klassOop reference_klass = java_lang_Class::as_klassOop(java_lang_invoke_MemberName::clazz(mname())); | 1037 Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname())); |
1037 if (reference_klass != NULL) { | 1038 if (reference_klass != NULL) { |
1038 // Emulate LinkResolver::check_klass_accessability. | 1039 // Emulate LinkResolver::check_klass_accessability. |
1039 klassOop caller = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(caller_jh)); | 1040 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); |
1040 if (!Reflection::verify_class_access(caller, | 1041 if (!Reflection::verify_class_access(caller, |
1041 reference_klass, | 1042 reference_klass, |
1042 true)) { | 1043 true)) { |
1043 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), Klass::cast(reference_klass)->external_name()); | 1044 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), Klass::cast(reference_klass)->external_name()); |
1044 } | 1045 } |
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; |
1155 | 1153 |
1156 KlassHandle caller; | 1154 KlassHandle caller; |
1157 if (caller_jh != NULL) { | 1155 if (caller_jh != NULL) { |
1158 oop caller_oop = JNIHandles::resolve_non_null(caller_jh); | 1156 oop caller_oop = JNIHandles::resolve_non_null(caller_jh); |
1159 if (!java_lang_Class::is_instance(caller_oop)) return -1; | 1157 if (!java_lang_Class::is_instance(caller_oop)) return -1; |
1160 caller = KlassHandle(THREAD, java_lang_Class::as_klassOop(caller_oop)); | 1158 caller = KlassHandle(THREAD, java_lang_Class::as_Klass(caller_oop)); |
1161 } | 1159 } |
1162 | 1160 |
1163 if (name != NULL && sig != NULL && results.not_null()) { | 1161 if (name != NULL && sig != NULL && results.not_null()) { |
1164 // try a direct resolve | 1162 // try a direct resolve |
1165 // %%% TO DO | 1163 // %%% TO DO |
1191 // Walk all nmethods depending on this call site. | 1189 // Walk all nmethods depending on this call site. |
1192 MutexLocker mu(Compile_lock, thread); | 1190 MutexLocker mu(Compile_lock, thread); |
1193 Universe::flush_dependents_on(call_site, target); | 1191 Universe::flush_dependents_on(call_site, target); |
1194 } | 1192 } |
1195 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); | 1193 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
1194 } | |
1195 JVM_END | |
1196 | |
1197 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv *env, jobject igmh, jobjectArray igargs)) { | |
1198 TempNewSymbol UOE_name = SymbolTable::new_symbol("java/lang/UnsupportedOperationException", CHECK_NULL); | |
1199 THROW_MSG_NULL(UOE_name, "MethodHandle.invoke cannot be invoked reflectively"); | |
1200 return NULL; | |
1201 } | |
1202 JVM_END | |
1203 | |
1204 JVM_ENTRY(jobject, MH_invokeExact_UOE(JNIEnv *env, jobject igmh, jobjectArray igargs)) { | |
1205 TempNewSymbol UOE_name = SymbolTable::new_symbol("java/lang/UnsupportedOperationException", CHECK_NULL); | |
1206 THROW_MSG_NULL(UOE_name, "MethodHandle.invokeExact cannot be invoked reflectively"); | |
1207 return NULL; | |
1196 } | 1208 } |
1197 JVM_END | 1209 JVM_END |
1198 | 1210 |
1199 /// JVM_RegisterMethodHandleMethods | 1211 /// JVM_RegisterMethodHandleMethods |
1200 | 1212 |
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."); |
1256 | 1273 |
1257 if (enable_MH) { | 1274 if (enable_MH) { |
1258 ThreadToNativeFromVM ttnfv(thread); | 1275 ThreadToNativeFromVM ttnfv(thread); |
1259 | 1276 |
1260 status = env->RegisterNatives(MHN_class, required_methods_JDK8, sizeof(required_methods_JDK8)/sizeof(JNINativeMethod)); | 1277 status = env->RegisterNatives(MHN_class, required_methods_JDK8, sizeof(required_methods_JDK8)/sizeof(JNINativeMethod)); |
1278 if (status == JNI_OK && !env->ExceptionOccurred()) { | |
1279 status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod)); | |
1280 } | |
1261 if (status != JNI_OK || env->ExceptionOccurred()) { | 1281 if (status != JNI_OK || env->ExceptionOccurred()) { |
1262 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); | 1282 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
1263 enable_MH = false; | 1283 enable_MH = false; |
1264 env->ExceptionClear(); | 1284 env->ExceptionClear(); |
1265 } | 1285 } |