2920 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks |
2920 // TO DO: expand at least some of the MemberNames, to avoid massive callbacks |
2921 return res; |
2921 return res; |
2922 } |
2922 } |
2923 JVM_END |
2923 JVM_END |
2924 |
2924 |
|
2925 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv *env, jobject igmh, jobjectArray igargs)) { |
|
2926 TempNewSymbol UOE_name = SymbolTable::new_symbol("java/lang/UnsupportedOperationException", CHECK_NULL); |
|
2927 THROW_MSG_NULL(UOE_name, "MethodHandle.invoke cannot be invoked reflectively"); |
|
2928 return NULL; |
|
2929 } |
|
2930 JVM_END |
|
2931 |
|
2932 JVM_ENTRY(jobject, MH_invokeExact_UOE(JNIEnv *env, jobject igmh, jobjectArray igargs)) { |
|
2933 TempNewSymbol UOE_name = SymbolTable::new_symbol("java/lang/UnsupportedOperationException", CHECK_NULL); |
|
2934 THROW_MSG_NULL(UOE_name, "MethodHandle.invokeExact cannot be invoked reflectively"); |
|
2935 return NULL; |
|
2936 } |
|
2937 JVM_END |
|
2938 |
2925 |
2939 |
2926 /// JVM_RegisterMethodHandleMethods |
2940 /// JVM_RegisterMethodHandleMethods |
2927 |
2941 |
2928 #define LANG "Ljava/lang/" |
2942 #define LANG "Ljava/lang/" |
2929 #define JLINV "Ljava/lang/invoke/" |
2943 #define JLINV "Ljava/lang/invoke/" |
2958 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
2972 // static native int getMembers(Class<?> defc, String matchName, String matchSig, |
2959 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
2973 // int matchFlags, Class<?> caller, int skip, MemberName[] results); |
2960 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)} |
2974 {CC"getMembers", CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)} |
2961 }; |
2975 }; |
2962 |
2976 |
|
2977 static JNINativeMethod invoke_methods[] = { |
|
2978 // void init(MemberName self, AccessibleObject ref) |
|
2979 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)}, |
|
2980 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)} |
|
2981 }; |
|
2982 |
2963 // This one function is exported, used by NativeLookup. |
2983 // This one function is exported, used by NativeLookup. |
2964 |
2984 |
2965 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
2985 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
2966 assert(MethodHandles::spot_check_entry_names(), "entry enum is OK"); |
2986 assert(MethodHandles::spot_check_entry_names(), "entry enum is OK"); |
2967 |
2987 |
2974 |
2994 |
2975 { |
2995 { |
2976 ThreadToNativeFromVM ttnfv(thread); |
2996 ThreadToNativeFromVM ttnfv(thread); |
2977 |
2997 |
2978 int status = env->RegisterNatives(MHN_class, methods, sizeof(methods)/sizeof(JNINativeMethod)); |
2998 int status = env->RegisterNatives(MHN_class, methods, sizeof(methods)/sizeof(JNINativeMethod)); |
|
2999 if (!env->ExceptionOccurred()) { |
|
3000 const char* L_MH_name = (JLINV "MethodHandle"); |
|
3001 const char* MH_name = L_MH_name+1; |
|
3002 jclass MH_class = env->FindClass(MH_name); |
|
3003 status = env->RegisterNatives(MH_class, invoke_methods, sizeof(invoke_methods)/sizeof(JNINativeMethod)); |
|
3004 } |
2979 if (env->ExceptionOccurred()) { |
3005 if (env->ExceptionOccurred()) { |
2980 MethodHandles::set_enabled(false); |
3006 MethodHandles::set_enabled(false); |
2981 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
3007 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
2982 enable_MH = false; |
3008 enable_MH = false; |
2983 env->ExceptionClear(); |
3009 env->ExceptionClear(); |