1296 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
1296 java_lang_invoke_CallSite::set_target_volatile(call_site(), target()); |
1297 } |
1297 } |
1298 } |
1298 } |
1299 JVM_END |
1299 JVM_END |
1300 |
1300 |
|
1301 /** |
|
1302 * Throws a java/lang/UnsupportedOperationException unconditionally. |
|
1303 * This is required by the specification of MethodHandle.invoke if |
|
1304 * invoked directly. |
|
1305 */ |
|
1306 JVM_ENTRY(jobject, MH_invoke_UOE(JNIEnv* env, jobject mh, jobjectArray args)) { |
|
1307 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invoke cannot be invoked reflectively"); |
|
1308 return NULL; |
|
1309 } |
|
1310 JVM_END |
|
1311 |
|
1312 /** |
|
1313 * Throws a java/lang/UnsupportedOperationException unconditionally. |
|
1314 * This is required by the specification of MethodHandle.invokeExact if |
|
1315 * invoked directly. |
|
1316 */ |
|
1317 JVM_ENTRY(jobject, MH_invokeExact_UOE(JNIEnv* env, jobject mh, jobjectArray args)) { |
|
1318 THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "MethodHandle.invokeExact cannot be invoked reflectively"); |
|
1319 return NULL; |
|
1320 } |
|
1321 JVM_END |
|
1322 |
1301 /// JVM_RegisterMethodHandleMethods |
1323 /// JVM_RegisterMethodHandleMethods |
1302 |
1324 |
1303 #undef CS // Solaris builds complain |
1325 #undef CS // Solaris builds complain |
1304 |
1326 |
1305 #define LANG "Ljava/lang/" |
1327 #define LANG "Ljava/lang/" |
1315 |
1337 |
1316 #define CC (char*) /*cast a literal from (const char*)*/ |
1338 #define CC (char*) /*cast a literal from (const char*)*/ |
1317 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f) |
1339 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f) |
1318 |
1340 |
1319 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
1341 // These are the native methods on java.lang.invoke.MethodHandleNatives. |
1320 static JNINativeMethod required_methods_JDK8[] = { |
1342 static JNINativeMethod MHN_methods[] = { |
1321 {CC"init", CC"("MEM""OBJ")V", FN_PTR(MHN_init_Mem)}, |
1343 {CC"init", CC"("MEM""OBJ")V", FN_PTR(MHN_init_Mem)}, |
1322 {CC"expand", CC"("MEM")V", FN_PTR(MHN_expand_Mem)}, |
1344 {CC"expand", CC"("MEM")V", FN_PTR(MHN_expand_Mem)}, |
1323 {CC"resolve", CC"("MEM""CLS")"MEM, FN_PTR(MHN_resolve_Mem)}, |
1345 {CC"resolve", CC"("MEM""CLS")"MEM, FN_PTR(MHN_resolve_Mem)}, |
1324 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)}, |
1346 {CC"getConstant", CC"(I)I", FN_PTR(MHN_getConstant)}, |
1325 // static native int getNamedCon(int which, Object[] name) |
1347 // static native int getNamedCon(int which, Object[] name) |
1333 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1355 {CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)}, |
1334 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1356 {CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)}, |
1335 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1357 {CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)} |
1336 }; |
1358 }; |
1337 |
1359 |
1338 // This one function is exported, used by NativeLookup. |
1360 static JNINativeMethod MH_methods[] = { |
1339 |
1361 // UnsupportedOperationException throwers |
|
1362 {CC"invoke", CC"(["OBJ")"OBJ, FN_PTR(MH_invoke_UOE)}, |
|
1363 {CC"invokeExact", CC"(["OBJ")"OBJ, FN_PTR(MH_invokeExact_UOE)} |
|
1364 }; |
|
1365 |
|
1366 /** |
|
1367 * Helper method to register native methods. |
|
1368 */ |
|
1369 static bool register_natives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) { |
|
1370 int status = env->RegisterNatives(clazz, methods, nMethods); |
|
1371 if (status != JNI_OK || env->ExceptionOccurred()) { |
|
1372 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
|
1373 env->ExceptionClear(); |
|
1374 return false; |
|
1375 } |
|
1376 return true; |
|
1377 } |
|
1378 |
|
1379 /** |
|
1380 * This one function is exported, used by NativeLookup. |
|
1381 */ |
1340 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
1382 JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { |
1341 if (!EnableInvokeDynamic) { |
1383 if (!EnableInvokeDynamic) { |
1342 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |
1384 warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); |
1343 return; // bind nothing |
1385 return; // bind nothing |
1344 } |
1386 } |
1352 } else { |
1394 } else { |
1353 oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); |
1395 oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); |
1354 MH_class = (jclass) JNIHandles::make_local(env, mirror); |
1396 MH_class = (jclass) JNIHandles::make_local(env, mirror); |
1355 } |
1397 } |
1356 |
1398 |
1357 int status; |
|
1358 |
|
1359 if (enable_MH) { |
1399 if (enable_MH) { |
1360 ThreadToNativeFromVM ttnfv(thread); |
1400 ThreadToNativeFromVM ttnfv(thread); |
1361 |
1401 |
1362 status = env->RegisterNatives(MHN_class, required_methods_JDK8, sizeof(required_methods_JDK8)/sizeof(JNINativeMethod)); |
1402 if (enable_MH) { |
1363 if (status != JNI_OK || env->ExceptionOccurred()) { |
1403 enable_MH = register_natives(env, MHN_class, MHN_methods, sizeof(MHN_methods)/sizeof(JNINativeMethod)); |
1364 warning("JSR 292 method handle code is mismatched to this JVM. Disabling support."); |
1404 } |
1365 enable_MH = false; |
1405 if (enable_MH) { |
1366 env->ExceptionClear(); |
1406 enable_MH = register_natives(env, MH_class, MH_methods, sizeof(MH_methods)/sizeof(JNINativeMethod)); |
1367 } |
1407 } |
1368 } |
1408 } |
1369 |
1409 |
1370 if (TraceInvokeDynamic) { |
1410 if (TraceInvokeDynamic) { |
1371 tty->print_cr("MethodHandle support loaded (using LambdaForms)"); |
1411 tty->print_cr("MethodHandle support loaded (using LambdaForms)"); |