hotspot/src/share/vm/prims/methodHandles.cpp
changeset 17381 a53ac5bf4850
parent 17087 f0b76c4c93a0
child 17388 8193ee82efbe
equal deleted inserted replaced
17380:6246161bd4b6 17381:a53ac5bf4850
  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)");