src/share/vm/oops/method.cpp

Print this page

        

*** 1355,1373 **** --- 1355,1448 ---- if (!is_native()) break; id = MethodHandles::signature_polymorphic_name_id(method_holder(), name()); if (is_static() != MethodHandles::is_signature_polymorphic_static(id)) id = vmIntrinsics::_none; break; + + case vmSymbols::VM_SYMBOL_ENUM_NAME(sun_misc_Unsafe): + // Map sun.misc.Unsafe to jdk.internal.misc.Unsafe + if (!is_unsafe_alias(name_id)) break; + // pretend it is the corresponding method in the internal Unsafe class: + klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_misc_Unsafe); + id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); + break; } if (id != vmIntrinsics::_none) { // Set up its iid. It is an alias method. set_intrinsic_id(id); return; } } + bool Method::is_unsafe_alias(vmSymbols::SID name_id) { + // All 70 intrinsic candidate methods from sun.misc.Unsafe in 1.8. + // Some have the same method name but different signature, e.g. + // getByte(long), getByte(Object,long) + switch (name_id) { + case vmSymbols::VM_SYMBOL_ENUM_NAME(allocateInstance_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(copyMemory_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(loadFence_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(storeFence_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(fullFence_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getObject_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getBoolean_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getByte_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getShort_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getChar_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getFloat_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getDouble_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putObject_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putBoolean_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putByte_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putShort_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putChar_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putFloat_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putDouble_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getObjectVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getBooleanVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getByteVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getShortVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getCharVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getIntVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getLongVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getFloatVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getDoubleVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putObjectVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putBooleanVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putByteVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putShortVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putCharVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putIntVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putLongVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putFloatVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putDoubleVolatile_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAddress_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putAddress_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapObject_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(compareAndSwapInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedObject_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(putOrderedInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndAddInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndAddLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetInt_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetLong_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(getAndSetObject_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(park_name): + case vmSymbols::VM_SYMBOL_ENUM_NAME(unpark_name): + return true; + } + + return false; + } + // These two methods are static since a GC may move the Method bool Method::load_signature_classes(methodHandle m, TRAPS) { if (!THREAD->can_call_java()) { // There is nothing useful this routine can do from within the Compile thread. // Hopefully, the signature contains only well-known classes.