| // 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; | |
| public class InstanceLongField { | |
| private long field; | |
| private static void checkJavaLangInvokeWrongMethodTypeException(RuntimeException e) { | |
| if (e.getClass().getCanonicalName().equals("java.lang.invoke.WrongMethodTypeException") | |
| || e.getMessage().equals("java.lang.invoke.WrongMethodTypeException")) { | |
| return; | |
| } | |
| throw e; | |
| } | |
| public static void testGet(VarHandle varHandle) { | |
| System.out.println("testGet"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| varHandle.set(instance, 1L); | |
| System.out.println(varHandle.get(instance)); | |
| System.out.println((Object) varHandle.get(instance)); | |
| System.out.println((long) varHandle.get(instance)); | |
| System.out.println((float) varHandle.get(instance)); | |
| System.out.println((double) varHandle.get(instance)); | |
| try { | |
| System.out.println((boolean) varHandle.get(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) varHandle.get(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) varHandle.get(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) varHandle.get(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((int) varHandle.get(instance)); | |
| System.out.println("Unexpected success 5"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) varHandle.get(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testGetVolatile(VarHandle varHandle) { | |
| System.out.println("testGetVolatile"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| varHandle.set(instance, 1); | |
| System.out.println(varHandle.getVolatile(instance)); | |
| System.out.println((Object) varHandle.getVolatile(instance)); | |
| System.out.println((long) varHandle.getVolatile(instance)); | |
| System.out.println((float) varHandle.getVolatile(instance)); | |
| System.out.println((double) varHandle.getVolatile(instance)); | |
| try { | |
| System.out.println((boolean) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((int) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) varHandle.getVolatile(instance)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testSet(VarHandle varHandle) { | |
| System.out.println("testSet"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long value. | |
| varHandle.set(instance, (long) 1); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, Long.valueOf(2)); | |
| System.out.println(varHandle.get(instance)); | |
| // Long compatible values. | |
| varHandle.set(instance, (byte) 3); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, Byte.valueOf((byte) 4)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, '0'); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, Character.valueOf('1')); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, (short) 5); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, Short.valueOf((short) 6)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, (int) 7); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.set(instance, Integer.valueOf(8)); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long non-compatible values. | |
| try { | |
| varHandle.set(instance, true); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.set(instance, "3"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.set(instance, 3.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.set(instance, 3.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| } | |
| public static void testSetVolatile(VarHandle varHandle) { | |
| System.out.println("testSetVolatile"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long value. | |
| varHandle.setVolatile(instance, (long) 1); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, Long.valueOf(2)); | |
| System.out.println(varHandle.get(instance)); | |
| // Long compatible values. | |
| varHandle.setVolatile(instance, (byte) 3); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, Byte.valueOf((byte) 4)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, '0'); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, Character.valueOf('1')); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, (short) 5); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, Short.valueOf((short) 6)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, (int) 7); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setVolatile(instance, Integer.valueOf(8)); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long non-compatible values. | |
| try { | |
| varHandle.setVolatile(instance, true); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setVolatile(instance, "3"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setVolatile(instance, 3.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setVolatile(instance, 3.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| } | |
| public static void testSetRelease(VarHandle varHandle) { | |
| System.out.println("testSetRelease"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long value. | |
| varHandle.setRelease(instance, (long) 1); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, Long.valueOf(2)); | |
| System.out.println(varHandle.get(instance)); | |
| // Long compatible values. | |
| varHandle.setRelease(instance, (byte) 3); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, Byte.valueOf((byte) 4)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, '0'); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, Character.valueOf('1')); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, (short) 5); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, Short.valueOf((short) 6)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, (int) 7); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.setRelease(instance, Integer.valueOf(8)); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long non-compatible values. | |
| try { | |
| varHandle.setRelease(instance, true); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setRelease(instance, "3"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setRelease(instance, 3.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.setRelease(instance, 3.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| } | |
| public static void testCompareAndSet(VarHandle varHandle) { | |
| System.out.println("testCompareAndSet"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| // Long value. | |
| varHandle.compareAndSet(instance, 1L, 2L); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 0L, 1L); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(1), 2); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 2, Long.valueOf(3)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Long.valueOf(3), Long.valueOf(4)); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long compatible values. | |
| varHandle.compareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 5, (byte) 6); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 6, (byte) 7); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Byte.valueOf((byte) 7), (byte) 8); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 8, Byte.valueOf((byte) 9)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Byte.valueOf((byte) 9), Byte.valueOf((byte) 10)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, 10, '0'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, '0', 49); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, '1', '2'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (byte) 50, '3'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, '3', (byte) 52); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, '4', '5'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, '5', (int) 11); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (int) 11, (int) 12); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, (int) 12, Integer.valueOf(13)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.compareAndSet(instance, Integer.valueOf(13), Integer.valueOf(14)); | |
| System.out.println(varHandle.get(instance)); | |
| // Long non-compatible values. | |
| try { | |
| varHandle.compareAndSet(instance, 6, 7.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6.0f, 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6.0f, 7.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6, 7.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6.0, 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6.0, 7.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, 6, "7"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, "6", 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.compareAndSet(instance, "6", "7"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| 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"); | |
| InstanceLongField instance = new InstanceLongField(); | |
| // Long value. | |
| varHandle.weakCompareAndSet(instance, 1L, 2L); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, 0L, 1L); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, Long.valueOf(1), 2); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, 2, Long.valueOf(3)); | |
| System.out.println((long) varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, Long.valueOf(3), Long.valueOf(4)); | |
| System.out.println((long) varHandle.get(instance)); | |
| // Long compatible values. | |
| varHandle.weakCompareAndSet(instance, (byte) 4, 5); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, 5, (byte) 6); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, (byte) 6, (byte) 7); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, Byte.valueOf((byte) 7), (byte) 8); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, (byte) 8, Byte.valueOf((byte) 9)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, Byte.valueOf((byte) 9), Byte.valueOf((byte) 10)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, 10, '0'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, '0', 49); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, '1', '2'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, (byte) 50, '3'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, '3', (byte) 52); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, '4', '5'); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, '5', (int) 11); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, (int) 11, (int) 12); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, (int) 12, Integer.valueOf(13)); | |
| System.out.println(varHandle.get(instance)); | |
| varHandle.weakCompareAndSet(instance, Integer.valueOf(13), Integer.valueOf(14)); | |
| System.out.println(varHandle.get(instance)); | |
| // Long non-compatible values. | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6, 7.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6.0f, 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6.0f, 7.0f); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6, 7.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6.0, 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6.0, 7.0); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, 6, "7"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, "6", 7); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| try { | |
| varHandle.weakCompareAndSet(instance, "6", "7"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println(varHandle.get(instance)); | |
| } | |
| } | |
| public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { | |
| VarHandle varHandle = | |
| MethodHandles.lookup().findVarHandle(InstanceLongField.class, "field", long.class); | |
| testGet(varHandle); | |
| testGetVolatile(varHandle); | |
| testSet(varHandle); | |
| testSetVolatile(varHandle); | |
| testSetRelease(varHandle); | |
| testCompareAndSet(varHandle); | |
| testWeakCompareAndSet(varHandle); | |
| } | |
| } |