Reduce target Java version and add some more Unsafe APIs

This commit is contained in:
Michael Pfaff 2024-08-10 13:14:49 -04:00
parent f003075d28
commit 2fd7e45ee8
2 changed files with 76 additions and 24 deletions

View file

@ -21,7 +21,7 @@ test {
useJUnitPlatform()
}
def targetJavaVersion = 19
def targetJavaVersion = 17
tasks.withType(JavaCompile).configureEach {
it.options.release.set(targetJavaVersion)
}

View file

@ -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);
}