Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/methodHandles.cpp @ 6983:070d523b96a7
8001471: Klass::cast() does nothing
Summary: Remove function Klass::cast() and calls to it.
Reviewed-by: dholmes, coleenp
author | hseigel |
---|---|
date | Mon, 12 Nov 2012 16:15:05 -0500 |
parents | 18fb7da42534 |
children | 5c0931d15474 |
comparison
equal
deleted
inserted
replaced
6981:8c413497f434 | 6983:070d523b96a7 |
---|---|
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 Klass* k = java_lang_Class::as_Klass(clazz); | 140 Klass* k = java_lang_Class::as_Klass(clazz); |
141 if (k != NULL && Klass::cast(k)->oop_is_instance()) { | 141 if (k != NULL && k->oop_is_instance()) { |
142 Method* 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 Klass* k = java_lang_Class::as_Klass(clazz); | 148 Klass* k = java_lang_Class::as_Klass(clazz); |
149 if (k != NULL && Klass::cast(k)->oop_is_instance()) { | 149 if (k != NULL && k->oop_is_instance()) { |
150 Method* 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. |
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()) { |
188 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); | 188 flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); |
189 } else if (receiver_limit != mklass && | 189 } else if (receiver_limit != mklass && |
190 !Klass::cast(receiver_limit)->is_subtype_of(mklass)) { | 190 !receiver_limit->is_subtype_of(mklass)) { |
191 return NULL; // bad receiver limit | 191 return NULL; // bad receiver limit |
192 } else if (Klass::cast(receiver_limit)->is_interface() && | 192 } else if (receiver_limit->is_interface() && |
193 Klass::cast(mklass)->is_interface()) { | 193 mklass->is_interface()) { |
194 flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT); | 194 flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT); |
195 receiver_limit = mklass; // ignore passed-in limit; interfaces are interconvertible | 195 receiver_limit = mklass; // ignore passed-in limit; interfaces are interconvertible |
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 && 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()); |
208 } | 208 } |
209 | 209 |
210 java_lang_invoke_MemberName::set_flags(mname_oop, flags); | 210 java_lang_invoke_MemberName::set_flags(mname_oop, flags); |
211 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m); | 211 java_lang_invoke_MemberName::set_vmtarget(mname_oop, m); |
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, 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 Method*. | 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. |
256 Metadata* 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, field_holder->java_mirror()); |
262 if (name != NULL) | 262 if (name != NULL) |
263 java_lang_invoke_MemberName::set_name(mname_oop, name); | 263 java_lang_invoke_MemberName::set_name(mname_oop, name); |
264 if (type != NULL) | 264 if (type != NULL) |
265 java_lang_invoke_MemberName::set_type(mname_oop, type); | 265 java_lang_invoke_MemberName::set_type(mname_oop, type); |
266 // Note: name and type can be lazily computed by resolve_MemberName, | 266 // Note: name and type can be lazily computed by resolve_MemberName, |
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->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 Method* 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; |
361 return vmIntrinsics::_none; | 361 return vmIntrinsics::_none; |
362 } | 362 } |
363 | 363 |
364 vmIntrinsics::ID MethodHandles::signature_polymorphic_name_id(Klass* 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->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; |
370 if (is_method_handle_invoke_name(klass, name)) | 370 if (is_method_handle_invoke_name(klass, name)) |
371 return vmIntrinsics::_invokeGeneric; | 371 return vmIntrinsics::_invokeGeneric; |
537 } | 537 } |
538 | 538 |
539 | 539 |
540 | 540 |
541 static oop object_java_mirror() { | 541 static oop object_java_mirror() { |
542 return Klass::cast(SystemDictionary::Object_klass())->java_mirror(); | 542 return SystemDictionary::Object_klass()->java_mirror(); |
543 } | 543 } |
544 | 544 |
545 static oop field_name_or_null(Symbol* s) { | 545 static oop field_name_or_null(Symbol* s) { |
546 if (s == NULL) return NULL; | 546 if (s == NULL) return NULL; |
547 return StringTable::lookup(s); | 547 return StringTable::lookup(s); |
558 // They are optional, since reference types can be resolved lazily. | 558 // They are optional, since reference types can be resolved lazily. |
559 if (bt == T_OBJECT) { | 559 if (bt == T_OBJECT) { |
560 if (s == vmSymbols::object_signature()) { | 560 if (s == vmSymbols::object_signature()) { |
561 return object_java_mirror(); | 561 return object_java_mirror(); |
562 } else if (s == vmSymbols::class_signature()) { | 562 } else if (s == vmSymbols::class_signature()) { |
563 return Klass::cast(SystemDictionary::Class_klass())->java_mirror(); | 563 return SystemDictionary::Class_klass()->java_mirror(); |
564 } else if (s == vmSymbols::string_signature()) { | 564 } else if (s == vmSymbols::string_signature()) { |
565 return Klass::cast(SystemDictionary::String_klass())->java_mirror(); | 565 return SystemDictionary::String_klass()->java_mirror(); |
566 } | 566 } |
567 } | 567 } |
568 return NULL; | 568 return NULL; |
569 } | 569 } |
570 | 570 |
601 | 601 |
602 instanceKlassHandle defc; | 602 instanceKlassHandle defc; |
603 { | 603 { |
604 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop()); | 604 Klass* defc_klass = java_lang_Class::as_Klass(defc_oop()); |
605 if (defc_klass == NULL) return empty; // a primitive; no resolution possible | 605 if (defc_klass == NULL) return empty; // a primitive; no resolution possible |
606 if (!Klass::cast(defc_klass)->oop_is_instance()) { | 606 if (!defc_klass->oop_is_instance()) { |
607 if (!Klass::cast(defc_klass)->oop_is_array()) return empty; | 607 if (!defc_klass->oop_is_array()) return empty; |
608 defc_klass = SystemDictionary::Object_klass(); | 608 defc_klass = SystemDictionary::Object_klass(); |
609 } | 609 } |
610 defc = instanceKlassHandle(THREAD, defc_klass); | 610 defc = instanceKlassHandle(THREAD, defc_klass); |
611 } | 611 } |
612 if (defc.is_null()) { | 612 if (defc.is_null()) { |
765 } | 765 } |
766 case IS_FIELD: | 766 case IS_FIELD: |
767 { | 767 { |
768 // This is taken from LinkResolver::resolve_field, sans access checks. | 768 // This is taken from LinkResolver::resolve_field, sans access checks. |
769 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); | 769 assert(vmtarget->is_klass(), "field vmtarget is Klass*"); |
770 if (!Klass::cast((Klass*) vmtarget)->oop_is_instance()) break; | 770 if (!((Klass*) vmtarget)->oop_is_instance()) break; |
771 instanceKlassHandle defc(THREAD, (Klass*) vmtarget); | 771 instanceKlassHandle defc(THREAD, (Klass*) vmtarget); |
772 DEBUG_ONLY(vmtarget = NULL); // safety | 772 DEBUG_ONLY(vmtarget = NULL); // safety |
773 bool is_static = ((flags & JVM_ACC_STATIC) != 0); | 773 bool is_static = ((flags & JVM_ACC_STATIC) != 0); |
774 fieldDescriptor fd; // find_field initializes fd if found | 774 fieldDescriptor fd; // find_field initializes fd if found |
775 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) | 775 if (!defc->find_field_from_offset(vmindex, is_static, &fd)) |
803 DEBUG_ONLY(No_Safepoint_Verifier nsv); | 803 DEBUG_ONLY(No_Safepoint_Verifier nsv); |
804 // this code contains no safepoints! | 804 // this code contains no safepoints! |
805 | 805 |
806 // %%% take caller into account! | 806 // %%% take caller into account! |
807 | 807 |
808 if (k == NULL || !Klass::cast(k)->oop_is_instance()) return -1; | 808 if (k == NULL || !k->oop_is_instance()) return -1; |
809 | 809 |
810 int rfill = 0, rlimit = results->length(), rskip = skip; | 810 int rfill = 0, rlimit = results->length(), rskip = skip; |
811 // overflow measurement: | 811 // overflow measurement: |
812 int overflow = 0, overflow_limit = MAX2(1000, rlimit); | 812 int overflow = 0, overflow_limit = MAX2(1000, rlimit); |
813 | 813 |
1030 // Emulate LinkResolver::check_klass_accessability. | 1030 // Emulate LinkResolver::check_klass_accessability. |
1031 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); | 1031 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); |
1032 if (!Reflection::verify_class_access(caller, | 1032 if (!Reflection::verify_class_access(caller, |
1033 reference_klass, | 1033 reference_klass, |
1034 true)) { | 1034 true)) { |
1035 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), Klass::cast(reference_klass)->external_name()); | 1035 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name()); |
1036 } | 1036 } |
1037 } | 1037 } |
1038 } | 1038 } |
1039 | 1039 |
1040 Handle resolved = MethodHandles::resolve_MemberName(mname, CHECK_NULL); | 1040 Handle resolved = MethodHandles::resolve_MemberName(mname, CHECK_NULL); |
1106 result->obj_at_put(0, x); | 1106 result->obj_at_put(0, x); |
1107 x = NULL; | 1107 x = NULL; |
1108 if (vmtarget == NULL) { | 1108 if (vmtarget == NULL) { |
1109 x = NULL; | 1109 x = NULL; |
1110 } else if (vmtarget->is_klass()) { | 1110 } else if (vmtarget->is_klass()) { |
1111 x = Klass::cast((Klass*) vmtarget)->java_mirror(); | 1111 x = ((Klass*) vmtarget)->java_mirror(); |
1112 } else if (vmtarget->is_method()) { | 1112 } else if (vmtarget->is_method()) { |
1113 Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL); | 1113 Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL); |
1114 x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL); | 1114 x = MethodHandles::init_method_MemberName(mname2(), (Method*)vmtarget, false, NULL); |
1115 } | 1115 } |
1116 result->obj_at_put(1, x); | 1116 result->obj_at_put(1, x); |
1235 | 1235 |
1236 jclass MH_class = NULL; | 1236 jclass MH_class = NULL; |
1237 if (SystemDictionary::MethodHandle_klass() == NULL) { | 1237 if (SystemDictionary::MethodHandle_klass() == NULL) { |
1238 enable_MH = false; | 1238 enable_MH = false; |
1239 } else { | 1239 } else { |
1240 oop mirror = Klass::cast(SystemDictionary::MethodHandle_klass())->java_mirror(); | 1240 oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); |
1241 MH_class = (jclass) JNIHandles::make_local(env, mirror); | 1241 MH_class = (jclass) JNIHandles::make_local(env, mirror); |
1242 } | 1242 } |
1243 | 1243 |
1244 int status; | 1244 int status; |
1245 | 1245 |