< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page




 118   REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
 119   REFERENCE_KIND_MASK  = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
 120   SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
 121   SEARCH_INTERFACES    = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
 122   ALL_KINDS      = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
 123 };
 124 
 125 int MethodHandles::ref_kind_to_flags(int ref_kind) {
 126   assert(ref_kind_is_valid(ref_kind), "%d", ref_kind);
 127   int flags = (ref_kind << REFERENCE_KIND_SHIFT);
 128   if (ref_kind_is_field(ref_kind)) {
 129     flags |= IS_FIELD;
 130   } else if (ref_kind_is_method(ref_kind)) {
 131     flags |= IS_METHOD;
 132   } else if (ref_kind == JVM_REF_newInvokeSpecial) {
 133     flags |= IS_CONSTRUCTOR;
 134   }
 135   return flags;
 136 }
 137 




 138 Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) {
 139   Handle empty;
 140   Handle type(THREAD, java_lang_invoke_MemberName::type(mname()));
 141   if (!java_lang_String::is_instance_inlined(type())) {
 142     return type; // already resolved
 143   }
 144   Symbol* signature = java_lang_String::as_symbol_or_null(type());
 145   if (signature == NULL) {
 146     return empty;  // no such signature exists in the VM
 147   }
 148   Handle resolved;
 149   int flags = java_lang_invoke_MemberName::flags(mname());
 150   switch (flags & ALL_KINDS) {
 151     case IS_METHOD:
 152     case IS_CONSTRUCTOR:
 153       resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty));
 154       break;
 155     case IS_FIELD:
 156       resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty));
 157       break;


 663   // Here are some more short cuts for common types.
 664   // They are optional, since reference types can be resolved lazily.
 665   if (bt == T_OBJECT) {
 666     if (s == vmSymbols::object_signature()) {
 667       return object_java_mirror();
 668     } else if (s == vmSymbols::class_signature()) {
 669       return SystemDictionary::Class_klass()->java_mirror();
 670     } else if (s == vmSymbols::string_signature()) {
 671       return SystemDictionary::String_klass()->java_mirror();
 672     }
 673   }
 674   return NULL;
 675 }
 676 
 677 
 678 // An unresolved member name is a mere symbolic reference.
 679 // Resolving it plants a vmtarget/vmindex in it,
 680 // which refers directly to JVM internals.
 681 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
 682   Handle empty;





























 683   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
 684 
 685   if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
 686     // Already resolved.
 687     DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
 688     assert(vmindex >= Method::nonvirtual_vtable_index, "");
 689     return mname;
 690   }
 691 
 692   Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
 693   Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
 694   Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
 695   int    flags    =       java_lang_invoke_MemberName::flags(mname());
 696   int    ref_kind =       (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
 697   if (!ref_kind_is_valid(ref_kind)) {
 698     THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
 699   }
 700 
 701   DEBUG_ONLY(int old_vmindex);
 702   assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
 703 
 704   if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) {
 705     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
 706   }
 707 
 708   InstanceKlass* defc = NULL;
 709   {
 710     Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
 711     if (defc_klass == NULL)  return empty;  // a primitive; no resolution possible
 712     if (!defc_klass->is_instance_klass()) {
 713       if (!defc_klass->is_array_klass())  return empty;
 714       defc_klass = SystemDictionary::Object_klass();
 715     }
 716     defc = InstanceKlass::cast(defc_klass);


1195     if (reference_klass != NULL && reference_klass->is_objArray_klass()) {
1196       reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
1197     }
1198 
1199     // Reflection::verify_class_access can only handle instance classes.
1200     if (reference_klass != NULL && reference_klass->is_instance_klass()) {
1201       // Emulate LinkResolver::check_klass_accessability.
1202       Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1203       if (caller != SystemDictionary::Object_klass()
1204           && Reflection::verify_class_access(caller,
1205                                              InstanceKlass::cast(reference_klass),
1206                                              true) != Reflection::ACCESS_OK) {
1207         THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
1208       }
1209     }
1210   }
1211 
1212   Klass* caller = caller_jh == NULL ? NULL :
1213                      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1214   Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
1215 
1216   if (resolved.is_null()) {
1217     int flags = java_lang_invoke_MemberName::flags(mname());
1218     int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
1219     if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
1220       THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
1221     }
1222     if ((flags & ALL_KINDS) == IS_FIELD) {
1223       THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed");
1224     } else if ((flags & ALL_KINDS) == IS_METHOD ||
1225                (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
1226       THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed");
1227     } else {
1228       THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "resolution failed");
1229     }
1230   }
1231 
1232   return JNIHandles::make_local(THREAD, resolved());
1233 }
1234 JVM_END
1235 
1236 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
1237   if (mname == NULL ||
1238       java_lang_invoke_MemberName::clazz(mname) == NULL) {
1239     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
1240   } else {
1241     int flags = java_lang_invoke_MemberName::flags(mname);
1242     if ((flags & IS_FIELD) != 0 &&
1243         (must_be_static
1244          ? (flags & JVM_ACC_STATIC) != 0
1245          : (flags & JVM_ACC_STATIC) == 0)) {
1246       int vmindex = java_lang_invoke_MemberName::vmindex(mname);
1247       return (jlong) vmindex;
1248     }
1249   }
1250   const char* msg = (must_be_static ? "static field required" : "non-static field required");
1251   THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg);




 118   REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
 119   REFERENCE_KIND_MASK  = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
 120   SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
 121   SEARCH_INTERFACES    = java_lang_invoke_MemberName::MN_SEARCH_INTERFACES,
 122   ALL_KINDS      = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE
 123 };
 124 
 125 int MethodHandles::ref_kind_to_flags(int ref_kind) {
 126   assert(ref_kind_is_valid(ref_kind), "%d", ref_kind);
 127   int flags = (ref_kind << REFERENCE_KIND_SHIFT);
 128   if (ref_kind_is_field(ref_kind)) {
 129     flags |= IS_FIELD;
 130   } else if (ref_kind_is_method(ref_kind)) {
 131     flags |= IS_METHOD;
 132   } else if (ref_kind == JVM_REF_newInvokeSpecial) {
 133     flags |= IS_CONSTRUCTOR;
 134   }
 135   return flags;
 136 }
 137 
 138 int MethodHandles::flags_to_ref_kind(int flags) {
 139   return (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
 140 }
 141 
 142 Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) {
 143   Handle empty;
 144   Handle type(THREAD, java_lang_invoke_MemberName::type(mname()));
 145   if (!java_lang_String::is_instance_inlined(type())) {
 146     return type; // already resolved
 147   }
 148   Symbol* signature = java_lang_String::as_symbol_or_null(type());
 149   if (signature == NULL) {
 150     return empty;  // no such signature exists in the VM
 151   }
 152   Handle resolved;
 153   int flags = java_lang_invoke_MemberName::flags(mname());
 154   switch (flags & ALL_KINDS) {
 155     case IS_METHOD:
 156     case IS_CONSTRUCTOR:
 157       resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty));
 158       break;
 159     case IS_FIELD:
 160       resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty));
 161       break;


 667   // Here are some more short cuts for common types.
 668   // They are optional, since reference types can be resolved lazily.
 669   if (bt == T_OBJECT) {
 670     if (s == vmSymbols::object_signature()) {
 671       return object_java_mirror();
 672     } else if (s == vmSymbols::class_signature()) {
 673       return SystemDictionary::Class_klass()->java_mirror();
 674     } else if (s == vmSymbols::string_signature()) {
 675       return SystemDictionary::String_klass()->java_mirror();
 676     }
 677   }
 678   return NULL;
 679 }
 680 
 681 
 682 // An unresolved member name is a mere symbolic reference.
 683 // Resolving it plants a vmtarget/vmindex in it,
 684 // which refers directly to JVM internals.
 685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
 686   Handle empty;
 687   Handle resolved = MethodHandles::resolve_MemberName_helper(mname, caller, THREAD);
 688   if (HAS_PENDING_EXCEPTION) {
 689     if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass())) {
 690       // Convert CNFE to NCDFE and don't worry about it on JDK side.
 691       Handle e(THREAD, PENDING_EXCEPTION);
 692       CLEAR_PENDING_EXCEPTION;
 693       THROW_CAUSE_(vmSymbols::java_lang_NoClassDefFoundError(), e, empty);
 694     }
 695     return empty;
 696   }
 697   if (resolved.is_null()) {
 698     int flags = java_lang_invoke_MemberName::flags(mname());
 699     int ref_kind = flags_to_ref_kind(flags);
 700     if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
 701       THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
 702     } else if ((flags & ALL_KINDS) == IS_FIELD) {
 703       THROW_MSG_(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed", empty);
 704     } else if ((flags & ALL_KINDS) == IS_METHOD ||
 705                (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
 706       THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), "method resolution failed", empty);
 707     } else {
 708       THROW_MSG_(vmSymbols::java_lang_LinkageError(), "resolution failed", empty);
 709     }
 710   }
 711   return resolved;
 712 }
 713 
 714 Handle MethodHandles::resolve_MemberName_helper(Handle mname, Klass* caller, TRAPS) {
 715   Handle empty;
 716   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
 717 
 718   if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
 719     // Already resolved.
 720     DEBUG_ONLY(int vmindex = java_lang_invoke_MemberName::vmindex(mname()));
 721     assert(vmindex >= Method::nonvirtual_vtable_index, "");
 722     return mname;
 723   }
 724 
 725   Handle defc_oop(THREAD, java_lang_invoke_MemberName::clazz(mname()));
 726   Handle name_str(THREAD, java_lang_invoke_MemberName::name( mname()));
 727   Handle type_str(THREAD, java_lang_invoke_MemberName::type( mname()));
 728   int    flags    =       java_lang_invoke_MemberName::flags(mname());
 729   int    ref_kind =       flags_to_ref_kind(flags);
 730   if (!ref_kind_is_valid(ref_kind)) {
 731     THROW_MSG_(vmSymbols::java_lang_InternalError(), "obsolete MemberName format", empty);
 732   }
 733 
 734   DEBUG_ONLY(int old_vmindex);
 735   assert((old_vmindex = java_lang_invoke_MemberName::vmindex(mname())) == 0, "clean input");
 736 
 737   if (defc_oop.is_null() || name_str.is_null() || type_str.is_null()) {
 738     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
 739   }
 740 
 741   InstanceKlass* defc = NULL;
 742   {
 743     Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
 744     if (defc_klass == NULL)  return empty;  // a primitive; no resolution possible
 745     if (!defc_klass->is_instance_klass()) {
 746       if (!defc_klass->is_array_klass())  return empty;
 747       defc_klass = SystemDictionary::Object_klass();
 748     }
 749     defc = InstanceKlass::cast(defc_klass);


1228     if (reference_klass != NULL && reference_klass->is_objArray_klass()) {
1229       reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
1230     }
1231 
1232     // Reflection::verify_class_access can only handle instance classes.
1233     if (reference_klass != NULL && reference_klass->is_instance_klass()) {
1234       // Emulate LinkResolver::check_klass_accessability.
1235       Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1236       if (caller != SystemDictionary::Object_klass()
1237           && Reflection::verify_class_access(caller,
1238                                              InstanceKlass::cast(reference_klass),
1239                                              true) != Reflection::ACCESS_OK) {
1240         THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), reference_klass->external_name());
1241       }
1242     }
1243   }
1244 
1245   Klass* caller = caller_jh == NULL ? NULL :
1246                      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
1247   Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);

1248   if (resolved.is_null()) {
1249     // Resolution failure should already trigger an exception.
1250     THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "empty");


1251   }










1252   return JNIHandles::make_local(THREAD, resolved());
1253 }
1254 JVM_END
1255 
1256 static jlong find_member_field_offset(oop mname, bool must_be_static, TRAPS) {
1257   if (mname == NULL ||
1258       java_lang_invoke_MemberName::clazz(mname) == NULL) {
1259     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "mname not resolved");
1260   } else {
1261     int flags = java_lang_invoke_MemberName::flags(mname);
1262     if ((flags & IS_FIELD) != 0 &&
1263         (must_be_static
1264          ? (flags & JVM_ACC_STATIC) != 0
1265          : (flags & JVM_ACC_STATIC) == 0)) {
1266       int vmindex = java_lang_invoke_MemberName::vmindex(mname);
1267       return (jlong) vmindex;
1268     }
1269   }
1270   const char* msg = (must_be_static ? "static field required" : "non-static field required");
1271   THROW_MSG_0(vmSymbols::java_lang_InternalError(), msg);


< prev index next >