| // 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 ArrayOfObject { | |
| public static class A { | |
| private final int i; | |
| public A(int i) { | |
| this.i = i; | |
| } | |
| public String toString() { | |
| return "A(" + i + ")"; | |
| } | |
| } | |
| 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 unsupportedGetConversion(VarHandle arrayVarHandle, Object[] array) { | |
| try { | |
| System.out.println((boolean) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((boolean) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testGet() { | |
| System.out.println("testGet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| arrayVarHandle.set(array, 0, 1); | |
| arrayVarHandle.set(array, 1, 2); | |
| System.out.println(arrayVarHandle.get(array, 0)); | |
| System.out.println(arrayVarHandle.get(array, 1)); | |
| System.out.println((Object) arrayVarHandle.get(array, 0)); | |
| System.out.println((Object) arrayVarHandle.get(array, 1)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| System.out.println((long) arrayVarHandle.get(array, 0)); | |
| System.out.println((long) arrayVarHandle.get(array, 1)); | |
| System.out.println((float) arrayVarHandle.get(array, 0)); | |
| System.out.println((float) arrayVarHandle.get(array, 1)); | |
| System.out.println((double) arrayVarHandle.get(array, 0)); | |
| System.out.println((double) arrayVarHandle.get(array, 1)); | |
| unsupportedGetConversion(arrayVarHandle, array); | |
| arrayVarHandle.set(array, 0, 3L); | |
| arrayVarHandle.set(array, 1, 4L); | |
| System.out.println(arrayVarHandle.get(array, 0)); | |
| System.out.println(arrayVarHandle.get(array, 1)); | |
| System.out.println((Object) arrayVarHandle.get(array, 0)); | |
| System.out.println((Object) arrayVarHandle.get(array, 1)); | |
| System.out.println((long) arrayVarHandle.get(array, 0)); | |
| System.out.println((long) arrayVarHandle.get(array, 1)); | |
| System.out.println((float) arrayVarHandle.get(array, 0)); | |
| System.out.println((float) arrayVarHandle.get(array, 1)); | |
| System.out.println((double) arrayVarHandle.get(array, 0)); | |
| System.out.println((double) arrayVarHandle.get(array, 1)); | |
| unsupportedGetConversion(arrayVarHandle, array); | |
| try { | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void unsupportedGetVolatileConversion(VarHandle arrayVarHandle, Object[] array) { | |
| try { | |
| System.out.println((boolean) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((boolean) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testGetVolatile() { | |
| System.out.println("testGetVolatile"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| arrayVarHandle.set(array, 0, 1); | |
| arrayVarHandle.set(array, 1, 2); | |
| System.out.println(arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println(arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((Object) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((Object) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((int) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((int) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((long) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((long) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((float) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((float) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((double) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((double) arrayVarHandle.getVolatile(array, 1)); | |
| unsupportedGetVolatileConversion(arrayVarHandle, array); | |
| arrayVarHandle.set(array, 0, 3L); | |
| arrayVarHandle.set(array, 1, 4L); | |
| System.out.println(arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println(arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((Object) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((Object) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((long) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((long) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((float) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((float) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println((double) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println((double) arrayVarHandle.getVolatile(array, 1)); | |
| unsupportedGetVolatileConversion(arrayVarHandle, array); | |
| try { | |
| System.out.println((int) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((int) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testSet() { | |
| System.out.println("testSet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| Object o; | |
| { | |
| int index = 0; | |
| byte b; | |
| arrayVarHandle.set(array, index, (byte) 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == (byte) 5); | |
| arrayVarHandle.set(array, index, Byte.valueOf((byte) 6)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| int index = 0; | |
| short s; | |
| arrayVarHandle.set(array, index, (short) 7); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == (short) 7); | |
| arrayVarHandle.set(array, index, Short.valueOf((short) 8)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| int index = 0; | |
| float f; | |
| arrayVarHandle.set(array, index, (float) 9.0f); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == (float) 9.0f); | |
| arrayVarHandle.set(array, index, Float.valueOf(10.0f)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| int index = 0; | |
| double d; | |
| arrayVarHandle.set(array, index, (double) 11.0); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == (double) 11.0); | |
| arrayVarHandle.set(array, index, Double.valueOf(12.0)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| int index = 0; | |
| char c; | |
| arrayVarHandle.set(array, index, 'A'); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'A'); | |
| arrayVarHandle.set(array, index, Character.valueOf('B')); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testSetVolatile() { | |
| System.out.println("testSetVolatile"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| Object o; | |
| { | |
| int index = 0; | |
| byte b; | |
| arrayVarHandle.setVolatile(array, index, (byte) 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == (byte) 5); | |
| arrayVarHandle.setVolatile(array, index, Byte.valueOf((byte) 6)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| int index = 0; | |
| short s; | |
| arrayVarHandle.setVolatile(array, index, (short) 7); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == (short) 7); | |
| arrayVarHandle.setVolatile(array, index, Short.valueOf((short) 8)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| int index = 0; | |
| float f; | |
| arrayVarHandle.setVolatile(array, index, (float) 9.0f); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == (float) 9.0f); | |
| arrayVarHandle.setVolatile(array, index, Float.valueOf(10.0f)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| int index = 0; | |
| double d; | |
| arrayVarHandle.setVolatile(array, index, (double) 11.0); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == (double) 11.0); | |
| arrayVarHandle.setVolatile(array, index, Double.valueOf(12.0)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| int index = 0; | |
| char c; | |
| arrayVarHandle.setVolatile(array, index, 'A'); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'A'); | |
| arrayVarHandle.setVolatile(array, index, Character.valueOf('B')); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testSetRelease() { | |
| System.out.println("testSetRelease"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| Object o; | |
| { | |
| int index = 0; | |
| byte b; | |
| arrayVarHandle.setRelease(array, index, (byte) 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == (byte) 5); | |
| arrayVarHandle.setRelease(array, index, Byte.valueOf((byte) 6)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((byte) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Byte); | |
| b = (byte) arrayVarHandle.get(array, index); | |
| System.out.println(b == 6); | |
| } | |
| { | |
| int index = 0; | |
| short s; | |
| arrayVarHandle.setRelease(array, index, (short) 7); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == (short) 7); | |
| arrayVarHandle.setRelease(array, index, Short.valueOf((short) 8)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((short) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Short); | |
| s = (short) arrayVarHandle.get(array, index); | |
| System.out.println(s == 8); | |
| } | |
| { | |
| int index = 0; | |
| float f; | |
| arrayVarHandle.setRelease(array, index, (float) 9.0f); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == (float) 9.0f); | |
| arrayVarHandle.setRelease(array, index, Float.valueOf(10.0f)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((float) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Float); | |
| f = (float) arrayVarHandle.get(array, index); | |
| System.out.println(f == 10.0f); | |
| } | |
| { | |
| int index = 0; | |
| double d; | |
| arrayVarHandle.setRelease(array, index, (double) 11.0); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == (double) 11.0); | |
| arrayVarHandle.setRelease(array, index, Double.valueOf(12.0)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((double) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Double); | |
| d = (double) arrayVarHandle.get(array, index); | |
| System.out.println(d == 12.0); | |
| } | |
| { | |
| int index = 0; | |
| char c; | |
| arrayVarHandle.setRelease(array, index, 'A'); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'A'); | |
| arrayVarHandle.setRelease(array, index, Character.valueOf('B')); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println((char) arrayVarHandle.get(array, index)); | |
| o = arrayVarHandle.get(array, index); | |
| System.out.println(o instanceof Character); | |
| c = (char) arrayVarHandle.get(array, index); | |
| System.out.println(c == 'B'); | |
| } | |
| } | |
| public static void testCompareAndSet() { | |
| System.out.println("testCompareAndSet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| int index = 0; | |
| A a1 = new A(1); | |
| arrayVarHandle.compareAndSet(array, index, 0, a1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, null, a1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a1); | |
| A a2 = new A(2); | |
| arrayVarHandle.compareAndSet(array, index, a1, a2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a2); | |
| arrayVarHandle.compareAndSet(array, index, a2, 1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(1), 2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(3), 4); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 4L, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (byte) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (short) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 4, 5L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(5), 6L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(7), 8L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 8, 9L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (byte) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (short) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a1); | |
| arrayVarHandle.compareAndSet(array, index, a1, a2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a2); | |
| arrayVarHandle.compareAndSet(array, index, a2, 1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(1), 2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Integer.valueOf(3), 4); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 4L, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (byte) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (short) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 4, 5L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(5), 6L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, Long.valueOf(7), 8L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, 8, 9L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (byte) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.compareAndSet(array, index, (short) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| } | |
| // 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() { | |
| System.out.println("testWeakCompareAndSet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class); | |
| Object[] array = new Object[2]; | |
| int index = 0; | |
| A a1 = new A(1); | |
| arrayVarHandle.weakCompareAndSet(array, index, 0, a1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, null, a1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a1); | |
| A a2 = new A(2); | |
| arrayVarHandle.weakCompareAndSet(array, index, a1, a2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a2); | |
| arrayVarHandle.weakCompareAndSet(array, index, a2, 1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(1), 2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(3), 4); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 4L, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (byte) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (short) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 4, 5L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(5), 6L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(7), 8L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 8, 9L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (byte) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (short) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a1); | |
| arrayVarHandle.weakCompareAndSet(array, index, a1, a2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| System.out.println(arrayVarHandle.get(array, index) == a2); | |
| arrayVarHandle.weakCompareAndSet(array, index, a2, 1); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(1), 2); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(2), Integer.valueOf(3)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Integer.valueOf(3), 4); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 4L, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (byte) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (short) 4, 5); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 4, 5L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(5), 6L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(6), Long.valueOf(7)); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, Long.valueOf(7), 8L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, 8, 9L); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (byte) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| arrayVarHandle.weakCompareAndSet(array, index, (short) 8, 9); | |
| System.out.println(arrayVarHandle.get(array, index)); | |
| } | |
| public static void testArrayVarHandleForNonSingleDimension() { | |
| System.out.println("testArrayVarHandleForNonSingleDimension"); | |
| try { | |
| MethodHandles.arrayElementVarHandle(Object.class); | |
| System.out.println("Unexpected success"); | |
| } catch (IllegalArgumentException e) { | |
| System.out.println("IllegalArgumentException"); | |
| } | |
| try { | |
| MethodHandles.arrayElementVarHandle(Object[][].class); | |
| System.out.println("Got array element VarHandle"); | |
| } catch (UnsupportedOperationException e) { | |
| System.out.println("UnsupportedOperationException"); | |
| } | |
| } | |
| public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { | |
| testGet(); | |
| testGetVolatile(); | |
| testSet(); | |
| testSetVolatile(); | |
| testSetRelease(); | |
| testCompareAndSet(); | |
| testWeakCompareAndSet(); | |
| testArrayVarHandleForNonSingleDimension(); | |
| } | |
| } |