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