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