diff options
| author | 2015-06-16 18:09:26 +0100 | |
|---|---|---|
| committer | 2015-06-16 18:10:57 +0100 | |
| commit | ca1476ff428edc29d258a5e693d894b0f7a0f7b7 (patch) | |
| tree | 4dd5533c8d5940c004d971a4c11675fc1a6caaf0 | |
| parent | 8d86843064912299b71191eabe65ce16fa7f3099 (diff) | |
Exercise sun.misc.Unsafe.getObject.
Change-Id: I6b3c090e1db7302d6f5b81ab91d5a1dc218fae93
| -rw-r--r-- | test/004-UnsafeTest/src/Main.java | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/test/004-UnsafeTest/src/Main.java b/test/004-UnsafeTest/src/Main.java index 708f61f028..2554b76f73 100644 --- a/test/004-UnsafeTest/src/Main.java +++ b/test/004-UnsafeTest/src/Main.java @@ -36,6 +36,13 @@ public class Main { } } + private static void check(Object actual, Object expected, String msg) { + if (actual != expected) { + System.out.println(msg + " : " + actual + " != " + expected); + System.exit(1); + } + } + private static Unsafe getUnsafe() throws Exception { Class<?> unsafeClass = Class.forName("sun.misc.Unsafe"); Field f = unsafeClass.getDeclaredField("theUnsafe"); @@ -80,6 +87,7 @@ public class Main { "Unsafe.arrayIndexScale(Object[])"); TestClass t = new TestClass(); + int intValue = 12345678; Field intField = TestClass.class.getDeclaredField("intVar"); long intOffset = unsafe.objectFieldOffset(intField); @@ -87,14 +95,23 @@ public class Main { unsafe.putInt(t, intOffset, intValue); check(t.intVar, intValue, "Unsafe.putInt(Object, long, int)"); check(unsafe.getInt(t, intOffset), intValue, "Unsafe.getInt(Object, long)"); + + long longValue = 1234567887654321L; Field longField = TestClass.class.getDeclaredField("longVar"); long longOffset = unsafe.objectFieldOffset(longField); - long longValue = 1234567887654321L; check(unsafe.getLong(t, longOffset), 0, "Unsafe.getLong(Object, long) - initial"); unsafe.putLong(t, longOffset, longValue); check(t.longVar, longValue, "Unsafe.putLong(Object, long, long)"); check(unsafe.getLong(t, longOffset), longValue, "Unsafe.getLong(Object, long)"); + Object objectValue = new Object(); + Field objectField = TestClass.class.getDeclaredField("objectVar"); + long objectOffset = unsafe.objectFieldOffset(objectField); + check(unsafe.getObject(t, objectOffset), null, "Unsafe.getObject(Object, long) - initial"); + unsafe.putObject(t, objectOffset, objectValue); + check(t.objectVar, objectValue, "Unsafe.putObject(Object, long, Object)"); + check(unsafe.getObject(t, objectOffset), objectValue, "Unsafe.getObject(Object, long)"); + if (unsafe.compareAndSwapInt(t, intOffset, 0, 1)) { System.out.println("Unexpectedly succeeding compareAndSwap..."); } @@ -119,6 +136,7 @@ public class Main { private static class TestClass { public int intVar = 0; public long longVar = 0; + public Object objectVar = null; } private static native int vmArrayBaseOffset(Class clazz); |