More Unsafe support for Java 11

This commit is contained in:
Volker Berlin 2023-02-28 23:05:19 +01:00
parent 16d04beeff
commit 57f0c9ceb9
No known key found for this signature in database
GPG Key ID: 988423EF815BE4CB

View File

@ -182,6 +182,8 @@ class UnsafeManager {
case "sun/misc/Unsafe.getObjectVolatile(Ljava/lang/Object;J)Ljava/lang/Object;":
case "sun/misc/Unsafe.getInt(Ljava/lang/Object;J)I":
case "sun/misc/Unsafe.getLong(Ljava/lang/Object;J)J":
case "jdk/internal/misc/Unsafe.getInt(Ljava/lang/Object;J)I":
case "jdk/internal/misc/Unsafe.getLong(Ljava/lang/Object;J)J":
patchFieldFunction( instructions, idx, callInst, name, 1 );
break;
case "sun/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I":
@ -199,12 +201,15 @@ class UnsafeManager {
case "jdk/internal/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I":
case "jdk/internal/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I":
case "jdk/internal/misc/Unsafe.putIntRelease(Ljava/lang/Object;JI)V":
case "jdk/internal/misc/Unsafe.putInt(Ljava/lang/Object;JI)V":
case "jdk/internal/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J":
case "jdk/internal/misc/Unsafe.getAndSetLong(Ljava/lang/Object;JJ)J":
case "jdk/internal/misc/Unsafe.putLongRelease(Ljava/lang/Object;JJ)V":
case "jdk/internal/misc/Unsafe.putLongVolatile(Ljava/lang/Object;JJ)V":
case "jdk/internal/misc/Unsafe.putLong(Ljava/lang/Object;JJ)V":
case "jdk/internal/misc/Unsafe.putObject(Ljava/lang/Object;JLjava/lang/Object;)V":
case "jdk/internal/misc/Unsafe.getObjectAcquire(Ljava/lang/Object;J)Ljava/lang/Object;":
case "jdk/internal/misc/Unsafe.putObjectRelease(Ljava/lang/Object;JLjava/lang/Object;)V":
patchFieldFunction( instructions, idx, callInst, name, 2 );
break;
case "sun/misc/Unsafe.compareAndSwapInt(Ljava/lang/Object;JII)Z":
@ -533,8 +538,11 @@ class UnsafeManager {
AnyType[] paramTypes = callInst.getPopValueTypes();
switch( name.methodName ) {
case "compareAndSwapInt":
case "compareAndSetInt":
case "compareAndSwapLong":
case "compareAndSetLong":
case "compareAndSwapObject":
case "compareAndSetObject":
case "compareAndSet": // AtomicReferenceFieldUpdater
AnyType type = paramTypes[3];
if( type.isRefType() ) {
@ -603,9 +611,11 @@ class UnsafeManager {
case "putInt":
case "putOrderedLong":
case "putLong":
case "putLongVolatile":
case "putOrderedObject":
case "putObjectVolatile":
case "putObject":
case "putObjectRelease":
if( state.fieldName != null ) {
// field access
return "local.get 1" // THIS