| // Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package varhandle; | |
| import java.lang.invoke.MethodHandles; | |
| import java.lang.invoke.VarHandle; | |
| import java.lang.invoke.WrongMethodTypeException; | |
| public class InstanceObjectField { | |
| private Object field; | |
| public static class A { | |
| private final int i; | |
| public A(int i) { | |
| this.i = i; | |
| } | |
| public String toString() { | |
| return "A(" + i + ")"; | |
| } | |
| } | |
| public static void testSetGet(VarHandle varHandle) { | |
| System.out.println("testSetGet"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| System.out.println(varHandle.get(instance)); | |
| A a1 = new A(1); | |
| varHandle.set(instance, a1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| A a2 = new A(2); | |
| varHandle.set(instance, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| Object o; | |
| { | |
| int i; | |
| varHandle.set(instance, 1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((int) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.get(instance); | |
| System.out.println(i == 1); | |
| varHandle.set(instance, Integer.valueOf(2)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((int) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.get(instance); | |
| System.out.println(i == 2); | |
| } | |
| { | |
| long l; | |
| varHandle.set(instance, 3L); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((long) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.get(instance); | |
| System.out.println(l == 3L); | |
| varHandle.set(instance, Long.valueOf(4L)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((long) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.get(instance); | |
| System.out.println(l == 4L); | |
| } | |
| { | |
| byte b; | |
| varHandle.set(instance, (byte) 5); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((byte) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.get(instance); | |
| System.out.println(b == (byte) 5); | |
| varHandle.set(instance, Byte.valueOf((byte) 6)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((byte) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.get(instance); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| short s; | |
| varHandle.set(instance, (short) 7); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((short) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.get(instance); | |
| System.out.println(s == (short) 7); | |
| varHandle.set(instance, Short.valueOf((short) 8)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((short) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.get(instance); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| float f; | |
| varHandle.set(instance, (float) 9.0f); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((float) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.get(instance); | |
| System.out.println(f == (float) 9.0f); | |
| varHandle.set(instance, Float.valueOf(10.0f)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((float) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.get(instance); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| double d; | |
| varHandle.set(instance, (double) 11.0); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((double) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.get(instance); | |
| System.out.println(d == (double) 11.0); | |
| varHandle.set(instance, Double.valueOf(12.0)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((double) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.get(instance); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| char c; | |
| varHandle.set(instance, 'A'); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((char) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.get(instance); | |
| System.out.println(c == 'A'); | |
| varHandle.set(instance, Character.valueOf('B')); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((char) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.get(instance); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testSetVolatileGetVolatile(VarHandle varHandle) { | |
| System.out.println("testSetVolatileGetVolatile"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| A a1 = new A(1); | |
| varHandle.setVolatile(instance, a1); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println(varHandle.getVolatile(instance) == a1); | |
| A a2 = new A(2); | |
| varHandle.setVolatile(instance, a2); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println(varHandle.getVolatile(instance) == a2); | |
| Object o; | |
| { | |
| int i; | |
| varHandle.setVolatile(instance, 1); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((int) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.getVolatile(instance); | |
| System.out.println(i == 1); | |
| varHandle.setVolatile(instance, Integer.valueOf(2)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((int) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.getVolatile(instance); | |
| System.out.println(i == 2); | |
| } | |
| { | |
| long l; | |
| varHandle.setVolatile(instance, 3L); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((long) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.getVolatile(instance); | |
| System.out.println(l == 3L); | |
| varHandle.setVolatile(instance, Long.valueOf(4L)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((long) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.getVolatile(instance); | |
| System.out.println(l == 4L); | |
| } | |
| { | |
| byte b; | |
| varHandle.setVolatile(instance, (byte) 5); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((byte) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.getVolatile(instance); | |
| System.out.println(b == (byte) 5); | |
| varHandle.setVolatile(instance, Byte.valueOf((byte) 6)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((byte) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.getVolatile(instance); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| short s; | |
| varHandle.setVolatile(instance, (short) 7); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((short) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.getVolatile(instance); | |
| System.out.println(s == (short) 7); | |
| varHandle.setVolatile(instance, Short.valueOf((short) 8)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((short) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.getVolatile(instance); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| float f; | |
| varHandle.setVolatile(instance, (float) 9.0f); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((float) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.getVolatile(instance); | |
| System.out.println(f == (float) 9.0f); | |
| varHandle.setVolatile(instance, Float.valueOf(10.0f)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((float) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.getVolatile(instance); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| double d; | |
| varHandle.setVolatile(instance, (double) 11.0); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((double) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.getVolatile(instance); | |
| System.out.println(d == (double) 11.0); | |
| varHandle.setVolatile(instance, Double.valueOf(12.0)); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((double) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.getVolatile(instance); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| char c; | |
| varHandle.setVolatile(instance, 'A'); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((char) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.getVolatile(instance); | |
| System.out.println(c == 'A'); | |
| varHandle.setVolatile(instance, Character.valueOf('B')); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((char) varHandle.getVolatile(instance)); | |
| o = varHandle.getVolatile(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.getVolatile(instance); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testSetReleaseGet(VarHandle varHandle) { | |
| System.out.println("testSetReleaseGet"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| System.out.println(varHandle.get(instance)); | |
| A a1 = new A(1); | |
| varHandle.setRelease(instance, a1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| A a2 = new A(2); | |
| varHandle.setRelease(instance, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| Object o; | |
| { | |
| int i; | |
| varHandle.setRelease(instance, 1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((int) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.get(instance); | |
| System.out.println(i == 1); | |
| varHandle.setRelease(instance, Integer.valueOf(2)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((int) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Integer); | |
| i = (int) varHandle.get(instance); | |
| System.out.println(i == 2); | |
| } | |
| { | |
| long l; | |
| varHandle.setRelease(instance, 3L); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((long) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.get(instance); | |
| System.out.println(l == 3L); | |
| varHandle.setRelease(instance, Long.valueOf(4L)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((long) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Long); | |
| l = (long) varHandle.get(instance); | |
| System.out.println(l == 4L); | |
| } | |
| { | |
| byte b; | |
| varHandle.setRelease(instance, (byte) 5); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((byte) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.get(instance); | |
| System.out.println(b == (byte) 5); | |
| varHandle.setRelease(instance, Byte.valueOf((byte) 6)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((byte) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) varHandle.get(instance); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| short s; | |
| varHandle.setRelease(instance, (short) 7); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((short) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.get(instance); | |
| System.out.println(s == (short) 7); | |
| varHandle.setRelease(instance, Short.valueOf((short) 8)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((short) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Short); | |
| s = (short) varHandle.get(instance); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| float f; | |
| varHandle.setRelease(instance, (float) 9.0f); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((float) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.get(instance); | |
| System.out.println(f == (float) 9.0f); | |
| varHandle.setRelease(instance, Float.valueOf(10.0f)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((float) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Float); | |
| f = (float) varHandle.get(instance); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| double d; | |
| varHandle.setRelease(instance, (double) 11.0); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((double) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.get(instance); | |
| System.out.println(d == (double) 11.0); | |
| varHandle.setRelease(instance, Double.valueOf(12.0)); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((double) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Double); | |
| d = (double) varHandle.get(instance); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| char c; | |
| varHandle.setRelease(instance, 'A'); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((char) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.get(instance); | |
| System.out.println(c == 'A'); | |
| varHandle.setRelease(instance, Character.valueOf('B')); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((char) varHandle.get(instance)); | |
| o = varHandle.get(instance); | |
| System.out.println(o instanceof Character); | |
| c = (char) varHandle.get(instance); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testCompareAndSet(VarHandle varHandle) { | |
| System.out.println("testCompareAndSet"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| A a1 = new A(1); | |
| varHandle.compareAndSet(instance, 0, a1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, null, a1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| A a2 = new A(2); | |
| varHandle.compareAndSet(instance, a1, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| varHandle.compareAndSet(instance, a2, 1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(1), 2); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(3), 4); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4L, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4, 5L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(5), 6L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(7), 8L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 8, 9L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| varHandle.compareAndSet(instance, a1, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| varHandle.compareAndSet(instance, a2, 1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(1), 2); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(3), 4); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4L, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4, 5L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(5), 6L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(7), 8L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 8, 9L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| // This test is not testing weakCompareAndSet behaviour, but assuming it behaves like | |
| // compareAndSet, that is without any spurious failures. This is the desugaring behaviour, as | |
| // as there is no weakCompareAndSet primitive in sun.misc.Unsafe, only compareAndSwapXXX. | |
| public static void testWeakCompareAndSet(VarHandle varHandle) { | |
| System.out.println("testWeakCompareAndSet"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| A a1 = new A(1); | |
| varHandle.compareAndSet(instance, 0, a1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, null, a1); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| A a2 = new A(2); | |
| varHandle.compareAndSet(instance, a1, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| varHandle.compareAndSet(instance, a2, 1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(1), 2); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(3), 4); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4L, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4, 5L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(5), 6L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(7), 8L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 8, 9L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a1); | |
| varHandle.compareAndSet(instance, a1, a2); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println(varHandle.get(instance) == a2); | |
| varHandle.compareAndSet(instance, a2, 1); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(1), 2); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(3), 4); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4L, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 4, 5L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(5), 6L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(7), 8L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 8, 9L); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (short) 8, 9); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| public static void testReturnValueClassCastException(VarHandle varHandle) { | |
| System.out.println("testReturnValueClassCastException"); | |
| InstanceObjectField instance = new InstanceObjectField(); | |
| A a = new A(1); | |
| varHandle.set(instance, a); | |
| try { | |
| System.out.println((int) varHandle.get(instance)); | |
| System.out.println("Expected ClassCastException"); | |
| } catch (ClassCastException e) { | |
| System.out.println("Reference implementation"); | |
| } catch (WrongMethodTypeException e) { | |
| System.out.println("Art implementation"); | |
| } | |
| varHandle.set(instance, a); | |
| try { | |
| System.out.println((int) (Integer) (int) varHandle.get(instance)); | |
| System.out.println("Expected ClassCastException"); | |
| } catch (ClassCastException e) { | |
| System.out.println("Reference implementation"); | |
| } catch (WrongMethodTypeException e) { | |
| System.out.println("Art implementation"); | |
| } | |
| } | |
| public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { | |
| VarHandle varHandle = | |
| MethodHandles.lookup().findVarHandle(InstanceObjectField.class, "field", Object.class); | |
| testSetGet(varHandle); | |
| testSetVolatileGetVolatile(varHandle); | |
| testSetReleaseGet(varHandle); | |
| testCompareAndSet(varHandle); | |
| testWeakCompareAndSet(varHandle); | |
| testReturnValueClassCastException(varHandle); | |
| } | |
| } |