Reduce target Java version and add some more Unsafe APIs
This commit is contained in:
parent
f003075d28
commit
2fd7e45ee8
2 changed files with 76 additions and 24 deletions
|
@ -21,7 +21,7 @@ test {
|
|||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
def targetJavaVersion = 19
|
||||
def targetJavaVersion = 17
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
it.options.release.set(targetJavaVersion)
|
||||
}
|
||||
|
|
|
@ -5,45 +5,65 @@ import java.lang.invoke.MethodHandles;
|
|||
import java.lang.reflect.Field;
|
||||
|
||||
import static dev.pfaff.unfettered.Unfettered.theJdkTrustedLookup;
|
||||
import static dev.pfaff.unfettered.Unfettered.theUnsafe;
|
||||
import static java.lang.invoke.MethodType.methodType;
|
||||
|
||||
public final class UnsafeWrapper {
|
||||
public static final MethodHandle MH_objectFieldOffsetF, MH_staticFieldOffsetF;
|
||||
public static final MethodHandle MH_objectFieldOffset;
|
||||
public static final MethodHandle MH_getIntP, MH_getLongP;
|
||||
public static final MethodHandle MH_getIntBO, MH_getLongBO, MH_getReferenceBO;
|
||||
public static final MethodHandle MH_putInt, MH_putLong;
|
||||
|
||||
public static final MethodHandle MH_getIntP, MH_getIntBO, MH_putIntBO;
|
||||
public static final MethodHandle MH_getLongP, MH_getLongBO, MH_putLongBO;
|
||||
public static final MethodHandle MH_getFloatP, MH_getFloatBO, MH_putFloatBO;
|
||||
public static final MethodHandle MH_getReferenceBO, MH_putReferenceBO;
|
||||
|
||||
public static final MethodHandle MH_allocateUninitializedArray;
|
||||
|
||||
public static final int ADDRESS_SIZE = sun.misc.Unsafe.ADDRESS_SIZE;
|
||||
public static final int ARRAY_OBJECT_INDEX_SCALE = sun.misc.Unsafe.ARRAY_OBJECT_INDEX_SCALE;
|
||||
public static final int ARRAY_OBJECT_BASE_OFFSET = sun.misc.Unsafe.ARRAY_OBJECT_BASE_OFFSET;
|
||||
|
||||
private static MethodHandle MH_getP(String name, Class<?> clazz) throws ReflectiveOperationException {
|
||||
return theJdkTrustedLookup.bind(theUnsafe, name, methodType(clazz, long.class));
|
||||
}
|
||||
|
||||
private static MethodHandle MH_getBO(String name, Class<?> clazz) throws ReflectiveOperationException {
|
||||
return theJdkTrustedLookup.bind(theUnsafe, name, methodType(clazz, Object.class, long.class));
|
||||
}
|
||||
|
||||
private static MethodHandle MH_putBO(String name, Class<?> clazz) throws ReflectiveOperationException {
|
||||
return theJdkTrustedLookup.bind(theUnsafe, name, methodType(void.class, Object.class, long.class, clazz));
|
||||
}
|
||||
|
||||
static {
|
||||
try {
|
||||
var l = theJdkTrustedLookup;
|
||||
MH_objectFieldOffsetF = l.bind(Unfettered.theUnsafe,
|
||||
MH_objectFieldOffsetF = l.bind(theUnsafe,
|
||||
"objectFieldOffset",
|
||||
methodType(long.class, Field.class));
|
||||
MH_objectFieldOffset = l.bind(Unfettered.theUnsafe,
|
||||
MH_objectFieldOffset = l.bind(theUnsafe,
|
||||
"objectFieldOffset",
|
||||
methodType(long.class, Class.class, String.class));
|
||||
MH_staticFieldOffsetF = l.bind(Unfettered.theUnsafe,
|
||||
MH_staticFieldOffsetF = l.bind(theUnsafe,
|
||||
"staticFieldOffset",
|
||||
methodType(long.class, Field.class));
|
||||
MH_getIntP = l.bind(Unfettered.theUnsafe, "getInt", methodType(int.class, long.class));
|
||||
MH_getLongP = l.bind(Unfettered.theUnsafe, "getLong", methodType(long.class, long.class));
|
||||
MH_getIntBO = l.bind(Unfettered.theUnsafe, "getInt", methodType(int.class, Object.class, long.class));
|
||||
MH_getLongBO = l.bind(Unfettered.theUnsafe, "getLong", methodType(long.class, Object.class, long.class));
|
||||
MH_getReferenceBO = l.bind(Unfettered.theUnsafe,
|
||||
"getReference",
|
||||
methodType(Object.class, Object.class, long.class));
|
||||
MH_putInt = l.bind(Unfettered.theUnsafe,
|
||||
"putInt",
|
||||
methodType(void.class, Object.class, long.class, int.class));
|
||||
MH_putLong = l.bind(Unfettered.theUnsafe, "putLong", methodType(void.class, Object.class, long.class,
|
||||
long.class));
|
||||
MH_allocateUninitializedArray = l.bind(Unfettered.theUnsafe,
|
||||
|
||||
MH_getIntP = MH_getP("getInt", int.class);
|
||||
MH_getIntBO = MH_getBO("getInt", int.class);
|
||||
MH_putIntBO = MH_putBO("putInt", int.class);
|
||||
|
||||
MH_getLongP = MH_getP("getLong", long.class);
|
||||
MH_getLongBO = MH_getBO("getLong", long.class);
|
||||
MH_putLongBO = MH_putBO("putLong", long.class);
|
||||
|
||||
MH_getFloatP = MH_getP("getFloat", float.class);
|
||||
MH_getFloatBO = MH_getBO("getFloat", float.class);
|
||||
MH_putFloatBO = MH_putBO("putFloat", float.class);
|
||||
|
||||
MH_getReferenceBO = MH_getBO("getReference", Object.class);
|
||||
MH_putReferenceBO = MH_putBO("putReference", Object.class);
|
||||
|
||||
MH_allocateUninitializedArray = l.bind(theUnsafe,
|
||||
"allocateUninitializedArray",
|
||||
methodType(Object.class, Class.class, int.class));
|
||||
|
||||
|
@ -93,6 +113,14 @@ public final class UnsafeWrapper {
|
|||
}
|
||||
}
|
||||
|
||||
public static float getFloat(long ptr) {
|
||||
try {
|
||||
return (float) MH_getFloatP.invokeExact(ptr);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static int getInt(Object base, long offset) {
|
||||
try {
|
||||
return (int) MH_getIntBO.invokeExact(base, offset);
|
||||
|
@ -109,7 +137,15 @@ public final class UnsafeWrapper {
|
|||
}
|
||||
}
|
||||
|
||||
public static Object getReference(Object base, int offset) {
|
||||
public static float getFloat(Object base, long offset) {
|
||||
try {
|
||||
return (float) MH_getFloatBO.invokeExact(base, offset);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static Object getReference(Object base, long offset) {
|
||||
try {
|
||||
return MH_getReferenceBO.invokeExact(base, offset);
|
||||
} catch (Throwable e) {
|
||||
|
@ -119,15 +155,31 @@ public final class UnsafeWrapper {
|
|||
|
||||
public static void putInt(Object base, long offset, int i) {
|
||||
try {
|
||||
MH_putInt.invokeExact(base, offset, i);
|
||||
MH_putIntBO.invokeExact(base, offset, i);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void putLong(Object base, long offset, long l) {
|
||||
public static void putLong(Object base, long offset, long value) {
|
||||
try {
|
||||
MH_putLong.invokeExact(base, offset, l);
|
||||
MH_putLongBO.invokeExact(base, offset, value);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void putFloat(Object base, long offset, float value) {
|
||||
try {
|
||||
MH_putFloatBO.invokeExact(base, offset, value);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void putReference(Object base, long offset, Object value) {
|
||||
try {
|
||||
MH_putReferenceBO.invokeExact(base, offset, value);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue