| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import java.lang.invoke.MethodHandles; |
| import java.lang.invoke.VarHandle; |
| import java.lang.invoke.WrongMethodTypeException; |
| import java.nio.ByteBuffer; |
| import java.nio.ByteOrder; |
| |
| public class VarHandleTypeConversionTests { |
| public static class VoidReturnTypeTest extends VarHandleUnitTest { |
| private int i; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = VoidReturnTypeTest.class; |
| vh = MethodHandles.lookup().findVarHandle(cls, "i", int.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| // Void is always okay for a return type. |
| vh.setVolatile(this, 33); |
| vh.get(this); |
| vh.compareAndSet(this, 33, 44); |
| vh.compareAndSet(this, 27, 16); |
| vh.weakCompareAndSet(this, 17, 19); |
| vh.getAndSet(this, 200000); |
| vh.getAndBitwiseXor(this, 0x5a5a5a5a); |
| vh.getAndAdd(this, 99); |
| } |
| |
| public static void main(String[] args) { |
| new VoidReturnTypeTest().run(); |
| } |
| } |
| |
| // |
| // Tests that a null reference as a boxed primitive type argument |
| // throws a NullPointerException. These vary the VarHandle type |
| // with each primitive for coverage. |
| // |
| |
| public static class BoxedNullBooleanThrowsNPETest extends VarHandleUnitTest { |
| private static boolean z; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = BoxedNullBooleanThrowsNPETest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "z", boolean.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| Boolean newValue = null; |
| try { |
| vh.getAndSet(newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullBooleanThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullByteThrowsNPETest extends VarHandleUnitTest { |
| private byte b; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = BoxedNullByteThrowsNPETest.class; |
| vh = MethodHandles.lookup().findVarHandle(cls, "b", byte.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| Byte newValue = null; |
| try { |
| vh.getAndSet(this, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullByteThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullCharacterThrowsNPETest extends VarHandleUnitTest { |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| vh = MethodHandles.arrayElementVarHandle(char[].class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| char[] values = new char[3]; |
| Character newValue = null; |
| try { |
| vh.getAndSet(values, 0, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullCharacterThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullShortThrowsNPETest extends VarHandleUnitTest { |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = BoxedNullShortThrowsNPETest.class; |
| vh = MethodHandles.byteArrayViewVarHandle(short[].class, ByteOrder.LITTLE_ENDIAN); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| byte[] bytes = new byte[2 * Short.SIZE]; |
| int index = VarHandleUnitTestHelpers.alignedOffset_short(bytes, 0); |
| Short newValue = null; |
| try { |
| vh.set(bytes, index, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullShortThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullIntegerThrowsNPETest extends VarHandleUnitTest { |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| vh = MethodHandles.byteArrayViewVarHandle(int[].class, ByteOrder.BIG_ENDIAN); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| byte[] bytes = new byte[2 * Integer.SIZE]; |
| int index = VarHandleUnitTestHelpers.alignedOffset_int(bytes, 0); |
| Integer newValue = null; |
| try { |
| vh.setVolatile(bytes, index, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullIntegerThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullLongThrowsNPETest extends VarHandleUnitTest { |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = BoxedNullLongThrowsNPETest.class; |
| vh = MethodHandles.byteBufferViewVarHandle(long[].class, ByteOrder.LITTLE_ENDIAN); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| ByteBuffer bb = ByteBuffer.allocateDirect(2 * Long.SIZE); |
| int index = VarHandleUnitTestHelpers.alignedOffset_long(bb, 0); |
| Long newValue = null; |
| try { |
| vh.getAndAdd(bb, index, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullLongThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullFloatThrowsNPETest extends VarHandleUnitTest { |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = BoxedNullFloatThrowsNPETest.class; |
| vh = MethodHandles.byteBufferViewVarHandle(float[].class, ByteOrder.BIG_ENDIAN); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| ByteBuffer bb = ByteBuffer.allocate(2 * Float.SIZE); |
| int index = VarHandleUnitTestHelpers.alignedOffset_float(bb, 0); |
| Float newValue = null; |
| try { |
| vh.set(bb, index, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullFloatThrowsNPETest().run(); |
| } |
| } |
| |
| public static class BoxedNullDoubleThrowsNPETest extends VarHandleUnitTest { |
| private double d; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| vh = MethodHandles.byteBufferViewVarHandle(double[].class, ByteOrder.LITTLE_ENDIAN); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| byte[] bytes = new byte[3 * Double.SIZE]; |
| int offset = 1; |
| ByteBuffer bb = ByteBuffer.wrap(bytes, offset, bytes.length - offset); |
| int index = VarHandleUnitTestHelpers.alignedOffset_double(bb, 0); |
| Double newValue = null; |
| try { |
| vh.set(bb, index, newValue); |
| failUnreachable(); |
| } catch (NullPointerException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new BoxedNullDoubleThrowsNPETest().run(); |
| } |
| } |
| |
| public static class WideningBooleanArgumentTest extends VarHandleUnitTest { |
| private static boolean v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningBooleanArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", boolean.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(true); |
| try { |
| vh.set((byte) 3); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set('c'); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((short) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((int) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((long) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningBooleanArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningByteArgumentTest extends VarHandleUnitTest { |
| private static byte v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningByteArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", byte.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| try { |
| vh.set('c'); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((short) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((int) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((long) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningByteArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningCharacterArgumentTest extends VarHandleUnitTest { |
| private static char v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningCharacterArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", char.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((byte) 3); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set('c'); |
| try { |
| vh.set((short) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((int) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((long) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningCharacterArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningShortArgumentTest extends VarHandleUnitTest { |
| private static short v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningShortArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", short.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| try { |
| vh.set('c'); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((short) 1); |
| try { |
| vh.set((int) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((long) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningShortArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningIntegerArgumentTest extends VarHandleUnitTest { |
| private static int v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningIntegerArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", int.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| vh.set('c'); |
| vh.set((char) 0x8fff); |
| assertEquals(0x8fff, v); |
| vh.set((short) 1); |
| vh.set((int) 1); |
| try { |
| vh.set((long) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningIntegerArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningLongArgumentTest extends VarHandleUnitTest { |
| private static long v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningLongArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", long.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| vh.set('c'); |
| vh.set((short) 1); |
| vh.set((int) 1); |
| vh.set((long) 1); |
| try { |
| vh.set((float) 1.0f); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningLongArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningFloatArgumentTest extends VarHandleUnitTest { |
| private static float v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningFloatArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", float.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| vh.set('c'); |
| vh.set((short) 1); |
| vh.set((int) 1); |
| vh.set((long) 1); |
| vh.set((float) 1.0f); |
| try { |
| vh.set((double) 1.0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningFloatArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningDoubleArgumentTest extends VarHandleUnitTest { |
| private static double v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningDoubleArgumentTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", double.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| vh.set((byte) 3); |
| vh.set('c'); |
| vh.set((short) 1); |
| vh.set((int) 1); |
| vh.set((long) 1); |
| vh.set((double) 1.0f); |
| vh.set((double) 1.0); |
| } |
| |
| public static void main(String[] args) { |
| new WideningDoubleArgumentTest().run(); |
| } |
| } |
| |
| public static class WideningBooleanReturnValueTest extends VarHandleUnitTest { |
| private static boolean v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningBooleanReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", boolean.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(true); |
| vh.get(); |
| boolean z = (boolean) vh.get(); |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| int i = (int) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| long j = (long) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| float f = (float) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| double d = (double) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningBooleanReturnValueTest().run(); |
| } |
| } |
| |
| public static class WideningByteReturnValueTest extends VarHandleUnitTest { |
| private static byte v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningByteReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", byte.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set((byte) 3); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| |
| byte b = (byte) vh.get(); |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| short s = (short) vh.get(); |
| int i = (int) vh.get(); |
| long j = (long) vh.get(); |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| |
| public static void main(String[] args) { |
| new WideningByteReturnValueTest().run(); |
| } |
| } |
| |
| public static class WideningCharacterReturnValueTest extends VarHandleUnitTest { |
| private static char v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningCharacterReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", char.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningCharacterReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set('c'); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| char c = (char) vh.get(); |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| int i = (int) vh.get(); |
| long j = (long) vh.get(); |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class WideningShortReturnValueTest extends VarHandleUnitTest { |
| private static short v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningShortReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", short.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningShortReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set((short) 8888); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| short s = (short) vh.get(); |
| int i = (int) vh.get(); |
| long j = (long) vh.get(); |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class WideningIntegerReturnValueTest extends VarHandleUnitTest { |
| private static int v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningIntegerReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", int.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningIntegerReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(0x1234fedc); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| int i = (int) vh.get(); |
| long j = (long) vh.get(); |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class WideningLongReturnValueTest extends VarHandleUnitTest { |
| private static long v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningLongReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", long.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningLongReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(0xfedcba987654321l); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| int i = (int) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| long j = (long) vh.get(); |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class WideningFloatReturnValueTest extends VarHandleUnitTest { |
| private static float v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningFloatReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", float.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningFloatReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(7.77e20f); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| int i = (int) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| long j = (long) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| float f = (float) vh.get(); |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class WideningDoubleReturnValueTest extends VarHandleUnitTest { |
| private static double v; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| Class<?> cls = WideningDoubleReturnValueTest.class; |
| vh = MethodHandles.lookup().findStaticVarHandle(cls, "v", double.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new WideningDoubleReturnValueTest().run(); |
| } |
| |
| @Override |
| protected void doTest() { |
| vh.set(Math.E); |
| vh.get(); |
| try { |
| boolean z = (boolean) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| byte b = (byte) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| char c = (char) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| short s = (short) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| int i = (int) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| long j = (long) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| try { |
| float f = (float) vh.get(); |
| failUnreachable(); |
| } catch (WrongMethodTypeException ex) { |
| } |
| double d = (double) vh.get(); |
| } |
| } |
| |
| public static class SubtypeTest extends VarHandleUnitTest { |
| private static final Widget INITIAL_VALUE = Widget.ONE; |
| private static final VarHandle vh; |
| private Widget w = INITIAL_VALUE; |
| |
| static { |
| try { |
| vh = MethodHandles.lookup().findVarHandle(SubtypeTest.class, "w", Widget.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new SubtypeTest().run(); |
| } |
| |
| // A sub-type of the Widget class |
| public static class WidgetChild extends Widget { |
| private int weight; |
| |
| public WidgetChild(int requistionNumber, int weight) { |
| super(requistionNumber); |
| this.weight = weight; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) { |
| return true; |
| } |
| if (o instanceof WidgetChild == false) { |
| return false; |
| } |
| WidgetChild wc = (WidgetChild) o; |
| return (requisitionNumber == wc.requisitionNumber && weight == wc.weight); |
| } |
| |
| public static final WidgetChild ONE = new WidgetChild(1, 100); |
| public static final WidgetChild TWO = new WidgetChild(2, 2000); |
| } |
| |
| @Override |
| public void doTest() { |
| assertEquals(INITIAL_VALUE, vh.getVolatile(this)); |
| vh.setVolatile(this, null); |
| Widget rw = (Widget) vh.compareAndExchange(this, null, WidgetChild.ONE); |
| assertEquals(null, rw); |
| assertEquals(WidgetChild.ONE, this.w); |
| WidgetChild rwc = |
| (WidgetChild) |
| vh.compareAndExchangeRelease(this, WidgetChild.ONE, WidgetChild.TWO); |
| assertEquals(WidgetChild.TWO, w); |
| rwc = (WidgetChild) vh.compareAndExchangeAcquire(this, WidgetChild.TWO, Widget.ONE); |
| assertEquals(Widget.ONE, w); |
| assertEquals(false, (boolean) vh.compareAndSet(this, null, null)); |
| assertEquals(true, vh.compareAndSet(this, Widget.ONE, Widget.TWO)); |
| assertEquals(Widget.TWO, w); |
| vh.set(this, null); |
| assertEquals(null, (Widget) vh.get(this)); |
| vh.setRelease(this, WidgetChild.ONE); |
| assertEquals(WidgetChild.ONE, (WidgetChild) vh.getAcquire(this)); |
| assertEquals(WidgetChild.ONE, w); |
| vh.setOpaque(this, WidgetChild.TWO); |
| assertEquals(WidgetChild.TWO, vh.getOpaque(this)); |
| assertEquals(WidgetChild.TWO, w); |
| vh.setVolatile(this, null); |
| assertEquals(null, (Widget) vh.getVolatile(this)); |
| assertEquals(null, w); |
| assertEquals(null, (WidgetChild) vh.getAndSet(this, WidgetChild.ONE)); |
| assertEquals(WidgetChild.ONE, w); |
| assertEquals(WidgetChild.ONE, (WidgetChild) vh.getAndSetRelease(this, WidgetChild.TWO)); |
| assertEquals(WidgetChild.TWO, (WidgetChild) vh.getAndSetAcquire(this, WidgetChild.ONE)); |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndAdd(this, WidgetChild.ONE); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndAddAcquire(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndAddRelease(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseAnd(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseAndAcquire(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseAndRelease(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseOr(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseOrAcquire(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseOrRelease(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseXor(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseXorAcquire(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| try { |
| WidgetChild result = (WidgetChild) vh.getAndBitwiseXorRelease(this, 1); |
| failUnreachable(); |
| } catch (UnsupportedOperationException e) { |
| } |
| } |
| } |
| |
| public static class SupertypeTest extends VarHandleUnitTest { |
| private Widget w = null; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| vh = MethodHandles.lookup().findVarHandle(SupertypeTest.class, "w", Widget.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new SupertypeTest().run(); |
| } |
| |
| @Override |
| public void doTest() { |
| assertEquals(null, (Object) vh.get(this)); |
| vh.set(this, Widget.ONE); |
| assertEquals(Widget.ONE, vh.getVolatile(this)); |
| try { |
| vh.setVolatile(this, new Object()); |
| } catch (ClassCastException e) { |
| } |
| } |
| } |
| |
| public static class ImplicitBoxingIntegerTest extends VarHandleUnitTest { |
| private static Integer field; |
| private static final VarHandle vh; |
| |
| static { |
| try { |
| vh = |
| MethodHandles.lookup() |
| .findStaticVarHandle( |
| ImplicitBoxingIntegerTest.class, "field", Integer.class); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public static void main(String[] args) { |
| new ImplicitBoxingIntegerTest().run(); |
| } |
| |
| @Override |
| public void doTest() { |
| try { |
| vh.set(true); |
| failUnreachable(); |
| } catch (WrongMethodTypeException e) { |
| } |
| try { |
| vh.set((byte) 0); |
| failUnreachable(); |
| } catch (WrongMethodTypeException e) { |
| } |
| try { |
| vh.set((short) 1); |
| failUnreachable(); |
| } catch (WrongMethodTypeException e) { |
| } |
| try { |
| vh.set('A'); |
| failUnreachable(); |
| } catch (WrongMethodTypeException e) { |
| } |
| vh.set(2); |
| try { |
| vh.setRelease(Long.MAX_VALUE); |
| } catch (WrongMethodTypeException e) { |
| } |
| try { |
| vh.setRelease(Float.MAX_VALUE); |
| } catch (WrongMethodTypeException e) { |
| } |
| try { |
| vh.setRelease(Double.MAX_VALUE); |
| } catch (WrongMethodTypeException e) { |
| } |
| vh.set(null); |
| vh.set(Integer.valueOf(Integer.MAX_VALUE)); |
| } |
| } |
| |
| public static void main(String[] args) { |
| VoidReturnTypeTest.main(args); |
| |
| BoxedNullBooleanThrowsNPETest.main(args); |
| BoxedNullByteThrowsNPETest.main(args); |
| BoxedNullCharacterThrowsNPETest.main(args); |
| BoxedNullShortThrowsNPETest.main(args); |
| BoxedNullIntegerThrowsNPETest.main(args); |
| BoxedNullLongThrowsNPETest.main(args); |
| BoxedNullFloatThrowsNPETest.main(args); |
| BoxedNullDoubleThrowsNPETest.main(args); |
| |
| WideningBooleanArgumentTest.main(args); |
| WideningByteArgumentTest.main(args); |
| WideningCharacterArgumentTest.main(args); |
| WideningShortArgumentTest.main(args); |
| WideningIntegerArgumentTest.main(args); |
| WideningLongArgumentTest.main(args); |
| WideningFloatArgumentTest.main(args); |
| WideningDoubleArgumentTest.main(args); |
| |
| WideningBooleanReturnValueTest.main(args); |
| WideningByteReturnValueTest.main(args); |
| WideningCharacterReturnValueTest.main(args); |
| WideningShortReturnValueTest.main(args); |
| WideningIntegerReturnValueTest.main(args); |
| WideningLongReturnValueTest.main(args); |
| WideningFloatReturnValueTest.main(args); |
| WideningDoubleReturnValueTest.main(args); |
| |
| SubtypeTest.main(args); |
| SupertypeTest.main(args); |
| |
| ImplicitBoxingIntegerTest.main(args); |
| } |
| } |