src/hotspot/share/prims/methodHandles.cpp
changeset 49641 2ad3212a7dd9
parent 49594 898ef81cbc0e
child 49646 24aca5861b91
equal deleted inserted replaced
49640:dd76fcbda95f 49641:2ad3212a7dd9
   304     flags |= CALLER_SENSITIVE;
   304     flags |= CALLER_SENSITIVE;
   305   }
   305   }
   306 
   306 
   307   Handle resolved_method = info.resolved_method_name();
   307   Handle resolved_method = info.resolved_method_name();
   308   assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(),
   308   assert(java_lang_invoke_ResolvedMethodName::vmtarget(resolved_method()) == m(),
   309          "Should not change after link resolultion");
   309          "Should not change after link resolution");
   310 
   310 
   311   oop mname_oop = mname();
   311   oop mname_oop = mname();
   312   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
   312   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
   313   java_lang_invoke_MemberName::set_method (mname_oop, resolved_method());
   313   java_lang_invoke_MemberName::set_method (mname_oop, resolved_method());
   314   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);   // vtable/itable index
   314   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);   // vtable/itable index
   680 
   680 
   681 
   681 
   682 // An unresolved member name is a mere symbolic reference.
   682 // An unresolved member name is a mere symbolic reference.
   683 // Resolving it plants a vmtarget/vmindex in it,
   683 // Resolving it plants a vmtarget/vmindex in it,
   684 // which refers directly to JVM internals.
   684 // which refers directly to JVM internals.
   685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
   685 Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller,
       
   686                                          bool speculative_resolve, TRAPS) {
   686   Handle empty;
   687   Handle empty;
   687   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
   688   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
   688 
   689 
   689   if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
   690   if (java_lang_invoke_MemberName::vmtarget(mname()) != NULL) {
   690     // Already resolved.
   691     // Already resolved.
   779                         link_info, false, THREAD);
   780                         link_info, false, THREAD);
   780         } else {
   781         } else {
   781           assert(false, "ref_kind=%d", ref_kind);
   782           assert(false, "ref_kind=%d", ref_kind);
   782         }
   783         }
   783         if (HAS_PENDING_EXCEPTION) {
   784         if (HAS_PENDING_EXCEPTION) {
       
   785           if (speculative_resolve) {
       
   786             CLEAR_PENDING_EXCEPTION;
       
   787           }
   784           return empty;
   788           return empty;
   785         }
   789         }
   786       }
   790       }
   787       if (result.resolved_appendix().not_null()) {
   791       if (result.resolved_appendix().not_null()) {
   788         // The resolved MemberName must not be accompanied by an appendix argument,
   792         // The resolved MemberName must not be accompanied by an appendix argument,
   804           LinkResolver::resolve_special_call(result, Handle(), link_info, THREAD);
   808           LinkResolver::resolve_special_call(result, Handle(), link_info, THREAD);
   805         } else {
   809         } else {
   806           break;                // will throw after end of switch
   810           break;                // will throw after end of switch
   807         }
   811         }
   808         if (HAS_PENDING_EXCEPTION) {
   812         if (HAS_PENDING_EXCEPTION) {
       
   813           if (speculative_resolve) {
       
   814             CLEAR_PENDING_EXCEPTION;
       
   815           }
   809           return empty;
   816           return empty;
   810         }
   817         }
   811       }
   818       }
   812       assert(result.is_statically_bound(), "");
   819       assert(result.is_statically_bound(), "");
   813       result.set_resolved_method_name(CHECK_(empty));
   820       result.set_resolved_method_name(CHECK_(empty));
   820       {
   827       {
   821         assert(!HAS_PENDING_EXCEPTION, "");
   828         assert(!HAS_PENDING_EXCEPTION, "");
   822         LinkInfo link_info(defc, name, type, caller, LinkInfo::skip_access_check);
   829         LinkInfo link_info(defc, name, type, caller, LinkInfo::skip_access_check);
   823         LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
   830         LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
   824         if (HAS_PENDING_EXCEPTION) {
   831         if (HAS_PENDING_EXCEPTION) {
       
   832           if (speculative_resolve) {
       
   833             CLEAR_PENDING_EXCEPTION;
       
   834           }
   825           return empty;
   835           return empty;
   826         }
   836         }
   827       }
   837       }
   828       oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
   838       oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
   829       return Handle(THREAD, mname2);
   839       return Handle(THREAD, mname2);
  1185   MethodHandles::expand_MemberName(mname, 0, CHECK);
  1195   MethodHandles::expand_MemberName(mname, 0, CHECK);
  1186 }
  1196 }
  1187 JVM_END
  1197 JVM_END
  1188 
  1198 
  1189 // void resolve(MemberName self, Class<?> caller)
  1199 // void resolve(MemberName self, Class<?> caller)
  1190 JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh)) {
  1200 JVM_ENTRY(jobject, MHN_resolve_Mem(JNIEnv *env, jobject igcls, jobject mname_jh, jclass caller_jh,
       
  1201     jboolean speculative_resolve)) {
  1191   if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); }
  1202   if (mname_jh == NULL) { THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "mname is null"); }
  1192   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1203   Handle mname(THREAD, JNIHandles::resolve_non_null(mname_jh));
  1193 
  1204 
  1194   // The trusted Java code that calls this method should already have performed
  1205   // The trusted Java code that calls this method should already have performed
  1195   // access checks on behalf of the given caller.  But, we can verify this.
  1206   // access checks on behalf of the given caller.  But, we can verify this.
  1213     }
  1224     }
  1214   }
  1225   }
  1215 
  1226 
  1216   Klass* caller = caller_jh == NULL ? NULL :
  1227   Klass* caller = caller_jh == NULL ? NULL :
  1217                      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
  1228                      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
  1218   Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
  1229   Handle resolved = MethodHandles::resolve_MemberName(mname, caller, speculative_resolve,
       
  1230                                                       CHECK_NULL);
  1219 
  1231 
  1220   if (resolved.is_null()) {
  1232   if (resolved.is_null()) {
  1221     int flags = java_lang_invoke_MemberName::flags(mname());
  1233     int flags = java_lang_invoke_MemberName::flags(mname());
  1222     int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
  1234     int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
  1223     if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
  1235     if (!MethodHandles::ref_kind_is_valid(ref_kind)) {
  1224       THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
  1236       THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "obsolete MemberName format");
       
  1237     }
       
  1238     if (speculative_resolve) {
       
  1239       assert(!HAS_PENDING_EXCEPTION, "No exceptions expected when resolving speculatively");
       
  1240       return NULL;
  1225     }
  1241     }
  1226     if ((flags & ALL_KINDS) == IS_FIELD) {
  1242     if ((flags & ALL_KINDS) == IS_FIELD) {
  1227       THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed");
  1243       THROW_MSG_NULL(vmSymbols::java_lang_NoSuchFieldError(), "field resolution failed");
  1228     } else if ((flags & ALL_KINDS) == IS_METHOD ||
  1244     } else if ((flags & ALL_KINDS) == IS_METHOD ||
  1229                (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
  1245                (flags & ALL_KINDS) == IS_CONSTRUCTOR) {
  1512 
  1528 
  1513 // These are the native methods on java.lang.invoke.MethodHandleNatives.
  1529 // These are the native methods on java.lang.invoke.MethodHandleNatives.
  1514 static JNINativeMethod MHN_methods[] = {
  1530 static JNINativeMethod MHN_methods[] = {
  1515   {CC "init",                      CC "(" MEM "" OBJ ")V",                   FN_PTR(MHN_init_Mem)},
  1531   {CC "init",                      CC "(" MEM "" OBJ ")V",                   FN_PTR(MHN_init_Mem)},
  1516   {CC "expand",                    CC "(" MEM ")V",                          FN_PTR(MHN_expand_Mem)},
  1532   {CC "expand",                    CC "(" MEM ")V",                          FN_PTR(MHN_expand_Mem)},
  1517   {CC "resolve",                   CC "(" MEM "" CLS ")" MEM,                FN_PTR(MHN_resolve_Mem)},
  1533   {CC "resolve",                   CC "(" MEM "" CLS "Z)" MEM,               FN_PTR(MHN_resolve_Mem)},
  1518   //  static native int getNamedCon(int which, Object[] name)
  1534   //  static native int getNamedCon(int which, Object[] name)
  1519   {CC "getNamedCon",               CC "(I[" OBJ ")I",                        FN_PTR(MHN_getNamedCon)},
  1535   {CC "getNamedCon",               CC "(I[" OBJ ")I",                        FN_PTR(MHN_getNamedCon)},
  1520   //  static native int getMembers(Class<?> defc, String matchName, String matchSig,
  1536   //  static native int getMembers(Class<?> defc, String matchName, String matchSig,
  1521   //          int matchFlags, Class<?> caller, int skip, MemberName[] results);
  1537   //          int matchFlags, Class<?> caller, int skip, MemberName[] results);
  1522   {CC "getMembers",                CC "(" CLS "" STRG "" STRG "I" CLS "I[" MEM ")I", FN_PTR(MHN_getMembers)},
  1538   {CC "getMembers",                CC "(" CLS "" STRG "" STRG "I" CLS "I[" MEM ")I", FN_PTR(MHN_getMembers)},