src/share/vm/oops/method.cpp

Print this page




1340   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath):
1341     // Second chance: check in regular Math.
1342     switch (name_id) {
1343     case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name):
1344     case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name):
1345     case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name):
1346       // pretend it is the corresponding method in the non-strict class:
1347       klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
1348       id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
1349       break;
1350     }
1351     break;
1352 
1353   // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*.
1354   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle):
1355     if (!is_native())  break;
1356     id = MethodHandles::signature_polymorphic_name_id(method_holder(), name());
1357     if (is_static() != MethodHandles::is_signature_polymorphic_static(id))
1358       id = vmIntrinsics::_none;
1359     break;








1360   }
1361 
1362   if (id != vmIntrinsics::_none) {
1363     // Set up its iid.  It is an alias method.
1364     set_intrinsic_id(id);
1365     return;
1366   }
1367 }
1368 



































































1369 // These two methods are static since a GC may move the Method
1370 bool Method::load_signature_classes(methodHandle m, TRAPS) {
1371   if (!THREAD->can_call_java()) {
1372     // There is nothing useful this routine can do from within the Compile thread.
1373     // Hopefully, the signature contains only well-known classes.
1374     // We could scan for this and return true/false, but the caller won't care.
1375     return false;
1376   }
1377   bool sig_is_loaded = true;
1378   Handle class_loader(THREAD, m->method_holder()->class_loader());
1379   Handle protection_domain(THREAD, m->method_holder()->protection_domain());
1380   ResourceMark rm(THREAD);
1381   Symbol*  signature = m->signature();
1382   for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
1383     if (ss.is_object()) {
1384       Symbol* sym = ss.as_symbol(CHECK_(false));
1385       Symbol*  name  = sym;
1386       Klass* klass = SystemDictionary::resolve_or_null(name, class_loader,
1387                                              protection_domain, THREAD);
1388       // We are loading classes eagerly. If a ClassNotFoundException or




1340   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath):
1341     // Second chance: check in regular Math.
1342     switch (name_id) {
1343     case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name):
1344     case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name):
1345     case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name):
1346       // pretend it is the corresponding method in the non-strict class:
1347       klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
1348       id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
1349       break;
1350     }
1351     break;
1352 
1353   // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*.
1354   case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle):
1355     if (!is_native())  break;
1356     id = MethodHandles::signature_polymorphic_name_id(method_holder(), name());
1357     if (is_static() != MethodHandles::is_signature_polymorphic_static(id))
1358       id = vmIntrinsics::_none;
1359     break;
1360 
1361   case vmSymbols::VM_SYMBOL_ENUM_NAME(sun_misc_Unsafe):
1362     // Map sun.misc.Unsafe to jdk.internal.misc.Unsafe
1363     if (!is_unsafe_alias(name_id))  break;
1364     // pretend it is the corresponding method in the internal Unsafe class:
1365     klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_misc_Unsafe);
1366     id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
1367     break;
1368   }
1369 
1370   if (id != vmIntrinsics::_none) {
1371     // Set up its iid.  It is an alias method.
1372     set_intrinsic_id(id);
1373     return;
1374   }
1375 }
1376 
1377 bool Method::is_unsafe_alias(vmSymbols::SID name_id) {
1378   // All 70 intrinsic candidate methods from sun.misc.Unsafe in 1.8.
1379   // Some have the same method name but different signature, e.g.
1380   // getByte(long), getByte(Object,long)
1381   switch (name_id) {
1382     case vmSymbols::VM_SYMBOL_ENUM_NAME(allocateInstance_name):
1383     case vmSymbols::VM_SYMBOL_ENUM_NAME(copyMemory_name):
1384     case vmSymbols::VM_SYMBOL_ENUM_NAME(loadFence_name):
1385     case vmSymbols::VM_SYMBOL_ENUM_NAME(storeFence_name):
1386     case vmSymbols::VM_SYMBOL_ENUM_NAME(fullFence_name):
1387     case vmSymbols::VM_SYMBOL_ENUM_NAME(getObject_name):
1388     case vmSymbols::VM_SYMBOL_ENUM_NAME(getBoolean_name):
1389     case vmSymbols::VM_SYMBOL_ENUM_NAME(getByte_name):
1390     case vmSymbols::VM_SYMBOL_ENUM_NAME(getShort_name):
1391     case vmSymbols::VM_SYMBOL_ENUM_NAME(getChar_name):
1392     case vmSymbols::VM_SYMBOL_ENUM_NAME(getInt_name):
1393     case vmSymbols::VM_SYMBOL_ENUM_NAME(getLong_name):
1394     case vmSymbols::VM_SYMBOL_ENUM_NAME(getFloat_name):
1395     case vmSymbols::VM_SYMBOL_ENUM_NAME(getDouble_name):
1396     case vmSymbols::VM_SYMBOL_ENUM_NAME(putObject_name):
1397     case vmSymbols::VM_SYMBOL_ENUM_NAME(putBoolean_name):
1398     case vmSymbols::VM_SYMBOL_ENUM_NAME(putByte_name):
1399     case vmSymbols::VM_SYMBOL_ENUM_NAME(putShort_name):
1400     case vmSymbols::VM_SYMBOL_ENUM_NAME(putChar_name):
1401     case vmSymbols::VM_SYMBOL_ENUM_NAME(putInt_name):
1402     case vmSymbols::VM_SYMBOL_ENUM_NAME(putLong_name):
1403     case vmSymbols::VM_SYMBOL_ENUM_NAME(putFloat_name):
1404     case vmSymbols::VM_SYMBOL_ENUM_NAME(putDouble_name):
1405     case vmSymbols::VM_SYMBOL_ENUM_NAME(getObjectVolatile_name):
1406     case vmSymbols::VM_SYMBOL_ENUM_NAME(getBooleanVolatile_name):
1407     case vmSymbols::VM_SYMBOL_ENUM_NAME(getByteVolatile_name):
1408     case vmSymbols::VM_SYMBOL_ENUM_NAME(getShortVolatile_name):
1409     case vmSymbols::VM_SYMBOL_ENUM_NAME(getCharVolatile_name):
1410     case vmSymbols::VM_SYMBOL_ENUM_NAME(getIntVolatile_name):
1411     case vmSymbols::VM_SYMBOL_ENUM_NAME(getLongVolatile_name):
1412     case vmSymbols::VM_SYMBOL_ENUM_NAME(getFloatVolatile_name):
1413     case vmSymbols::VM_SYMBOL_ENUM_NAME(getDoubleVolatile_name):
1414     case vmSymbols::VM_SYMBOL_ENUM_NAME(putObjectVolatile_name):
1415     case vmSymbols::VM_SYMBOL_ENUM_NAME(putBooleanVolatile_name):
1416     case vmSymbols::VM_SYMBOL_ENUM_NAME(putByteVolatile_name):
1417     case vmSymbols::VM_SYMBOL_ENUM_NAME(putShortVolatile_name):
1418     case vmSymbols::VM_SYMBOL_ENUM_NAME(putCharVolatile_name):
1419     case vmSymbols::VM_SYMBOL_ENUM_NAME(putIntVolatile_name):
1420     case vmSymbols::VM_SYMBOL_ENUM_NAME(putLongVolatile_name):
1421     case vmSymbols::VM_SYMBOL_ENUM_NAME(putFloatVolatile_name):
1422     case vmSymbols::VM_SYMBOL_ENUM_NAME(putDoubleVolatile_name):
1423     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAddress_name):
1424     case vmSymbols::VM_SYMBOL_ENUM_NAME(putAddress_name):
1425     case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapObject_name):
1426     case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapLong_name):
1427     case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapInt_name):
1428     case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedObject_name):
1429     case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedLong_name):
1430     case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedInt_name):
1431     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndAddInt_name):
1432     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndAddLong_name):
1433     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetInt_name):
1434     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetLong_name):
1435     case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetObject_name):
1436     case vmSymbols::VM_SYMBOL_ENUM_NAME(park_name):
1437     case vmSymbols::VM_SYMBOL_ENUM_NAME(unpark_name):
1438       return true;
1439   }
1440 
1441   return false;
1442 }
1443 
1444 // These two methods are static since a GC may move the Method
1445 bool Method::load_signature_classes(methodHandle m, TRAPS) {
1446   if (!THREAD->can_call_java()) {
1447     // There is nothing useful this routine can do from within the Compile thread.
1448     // Hopefully, the signature contains only well-known classes.
1449     // We could scan for this and return true/false, but the caller won't care.
1450     return false;
1451   }
1452   bool sig_is_loaded = true;
1453   Handle class_loader(THREAD, m->method_holder()->class_loader());
1454   Handle protection_domain(THREAD, m->method_holder()->protection_domain());
1455   ResourceMark rm(THREAD);
1456   Symbol*  signature = m->signature();
1457   for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
1458     if (ss.is_object()) {
1459       Symbol* sym = ss.as_symbol(CHECK_(false));
1460       Symbol*  name  = sym;
1461       Klass* klass = SystemDictionary::resolve_or_null(name, class_loader,
1462                                              protection_domain, THREAD);
1463       // We are loading classes eagerly. If a ClassNotFoundException or