| // 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 ArrayOfInt { | |
| 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() { | |
| System.out.println("testGet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[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)); | |
| try { | |
| System.out.println((boolean) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((boolean) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.get(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.get(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testGetVolatile() { | |
| System.out.println("testGetVolatile"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[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)); | |
| try { | |
| System.out.println((boolean) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((boolean) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((byte) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((short) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((char) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.getVolatile(array, 0)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| try { | |
| System.out.println((String) arrayVarHandle.getVolatile(array, 1)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| } | |
| } | |
| public static void testSet() { | |
| System.out.println("testSet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[2]; | |
| // int and Integer values. | |
| arrayVarHandle.set(array, 0, 1); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, 2); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, Integer.valueOf(3)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, Integer.valueOf(4)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer compatible values. | |
| arrayVarHandle.set(array, 0, (byte) 5); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, (byte) 6); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, Byte.valueOf((byte) 7)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, Byte.valueOf((byte) 8)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, '0'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, '1'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, Character.valueOf('2')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, Character.valueOf('3')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, (short) 9); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, (short) 10); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 0, Short.valueOf((short) 11)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.set(array, 1, Short.valueOf((short) 12)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer non-compatible values. | |
| try { | |
| arrayVarHandle.set(array, 0, true); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, 13L); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, Long.valueOf(13L)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, 1.3f); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, Float.valueOf(1.3f)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, 1.4); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, Double.valueOf(1.4)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, new Object()); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } catch (RuntimeException e) { | |
| // The Art and desugaring throws WrongMethodTypeException. | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.set(array, 0, "X"); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| } | |
| public static void testSetVolatile() { | |
| System.out.println("testSetVolatile"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[2]; | |
| // int and Integer values. | |
| arrayVarHandle.setVolatile(array, 0, 1); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, 2); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, Integer.valueOf(3)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, Integer.valueOf(4)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer compatible values. | |
| arrayVarHandle.setVolatile(array, 0, (byte) 5); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, (byte) 6); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, Byte.valueOf((byte) 7)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, Byte.valueOf((byte) 8)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, '0'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, '1'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, Character.valueOf('2')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, Character.valueOf('3')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, (short) 9); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, (short) 10); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 0, Short.valueOf((short) 11)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setVolatile(array, 1, Short.valueOf((short) 12)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer non-compatible values. | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, true); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, 13L); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, Long.valueOf(13L)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, 1.3f); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, Float.valueOf(1.3f)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, 1.4); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, Double.valueOf(1.4)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, new Object()); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } catch (RuntimeException e) { | |
| // The Art and desugaring throws WrongMethodTypeException. | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setVolatile(array, 0, "X"); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| } | |
| public static void testSetRelease() { | |
| System.out.println("testSetRelease"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[2]; | |
| // int and Integer values. | |
| arrayVarHandle.setRelease(array, 0, 1); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, 2); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, Integer.valueOf(3)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, Integer.valueOf(4)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer compatible values. | |
| arrayVarHandle.setRelease(array, 0, (byte) 5); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, (byte) 6); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, Byte.valueOf((byte) 7)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, Byte.valueOf((byte) 8)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, '0'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, '1'); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, Character.valueOf('2')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, Character.valueOf('3')); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, (short) 9); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, (short) 10); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 0, Short.valueOf((short) 11)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.setRelease(array, 1, Short.valueOf((short) 12)); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // int and Integer non-compatible values. | |
| try { | |
| arrayVarHandle.setRelease(array, 0, true); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, 13L); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, Long.valueOf(13L)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, 1.3f); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, Float.valueOf(1.3f)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, 1.4); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, Double.valueOf(1.4)); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, new Object()); | |
| System.out.println("Unexpected success"); | |
| } catch (ClassCastException e) { | |
| // The reference implementation throws ClassCastException. | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } catch (RuntimeException e) { | |
| // The Art and desugaring throws WrongMethodTypeException. | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| try { | |
| arrayVarHandle.setRelease(array, 0, "X"); | |
| System.out.println("Unexpected success"); | |
| } catch (RuntimeException e) { | |
| checkJavaLangInvokeWrongMethodTypeException(e); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| } | |
| public static void testCompareAndSet() { | |
| System.out.println("testCompareAndSet"); | |
| VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); | |
| int[] array = new int[2]; | |
| arrayVarHandle.set(array, 0, 1); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.compareAndSet(array, 1, 1, 3); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.compareAndSet(array, 1, 0, 2); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // TODO(b/247076137): Handle boxed. | |
| // arrayVarHandle.compareAndSet(array, 1, 2, box(3)); | |
| arrayVarHandle.compareAndSet(array, 1, 2, 3); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| // 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(int[].class); | |
| int[] array = new int[2]; | |
| arrayVarHandle.set(array, 0, 1); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.weakCompareAndSet(array, 1, 1, 3); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| arrayVarHandle.weakCompareAndSet(array, 1, 0, 2); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| // TODO(b/247076137): Handle boxed. | |
| // arrayVarHandle.waekCompareAndSet(array, 1, 2, box(3)); | |
| arrayVarHandle.weakCompareAndSet(array, 1, 2, 3); | |
| System.out.println((int) arrayVarHandle.get(array, 0)); | |
| System.out.println((int) arrayVarHandle.get(array, 1)); | |
| } | |
| public static void testArrayVarHandleForNonSingleDimension() { | |
| System.out.println("testArrayVarHandleForNonSingleDimension"); | |
| try { | |
| MethodHandles.arrayElementVarHandle(int.class); | |
| System.out.println("Unexpected success"); | |
| } catch (IllegalArgumentException e) { | |
| System.out.println("IllegalArgumentException"); | |
| } | |
| try { | |
| MethodHandles.arrayElementVarHandle(int[][].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(); | |
| } | |
| } |