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