VarHandle desugar: Add support for getVolatile
Bug: b/247076137
Change-Id: I57d19949199a3d07189ef8a2e6d8143eea826ed9
diff --git a/src/test/examplesJava9/varhandle/ArrayOfInt.java b/src/test/examplesJava9/varhandle/ArrayOfInt.java
index c63f79d..f3eaf8a 100644
--- a/src/test/examplesJava9/varhandle/ArrayOfInt.java
+++ b/src/test/examplesJava9/varhandle/ArrayOfInt.java
@@ -98,6 +98,88 @@
}
}
+ 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");
@@ -273,6 +355,7 @@
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
testGet();
+ testGetVolatile();
testSet();
testArrayVarHandleForNonSingleDimension();
}
diff --git a/src/test/examplesJava9/varhandle/ArrayOfLong.java b/src/test/examplesJava9/varhandle/ArrayOfLong.java
index c909319..bd6a735 100644
--- a/src/test/examplesJava9/varhandle/ArrayOfLong.java
+++ b/src/test/examplesJava9/varhandle/ArrayOfLong.java
@@ -108,6 +108,98 @@
}
}
+ public static void testGetVolatile() {
+ System.out.println("testGetVolatile");
+ VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(long[].class);
+ long[] array = new long[2];
+
+ arrayVarHandle.set(array, 0, 1L);
+ arrayVarHandle.set(array, 1, 2L);
+
+ System.out.println(arrayVarHandle.getVolatile(array, 0));
+ System.out.println(arrayVarHandle.getVolatile(array, 1));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 1));
+ 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((int) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((int) 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");
@@ -260,6 +352,7 @@
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
testGet();
+ testGetVolatile();
testSet();
testArrayVarHandleForNonSingleDimension();
}
diff --git a/src/test/examplesJava9/varhandle/ArrayOfObject.java b/src/test/examplesJava9/varhandle/ArrayOfObject.java
index ab9a6bd..508b740 100644
--- a/src/test/examplesJava9/varhandle/ArrayOfObject.java
+++ b/src/test/examplesJava9/varhandle/ArrayOfObject.java
@@ -166,6 +166,143 @@
}
}
+ public static void unsupportedGetVolatileConversion(VarHandle arrayVarHandle, Object[] array) {
+ try {
+ System.out.println((boolean) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((boolean) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((byte) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((byte) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((short) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((short) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((char) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((char) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((String) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((String) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ }
+
+ public static void testGetVolatile() {
+ System.out.println("testGetVolatile");
+ VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(Object[].class);
+ Object[] array = new Object[2];
+
+ arrayVarHandle.set(array, 0, 1);
+ arrayVarHandle.set(array, 1, 2);
+
+ System.out.println(arrayVarHandle.getVolatile(array, 0));
+ System.out.println(arrayVarHandle.getVolatile(array, 1));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((int) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((int) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 1));
+ unsupportedGetVolatileConversion(arrayVarHandle, array);
+
+ arrayVarHandle.set(array, 0, 3L);
+ arrayVarHandle.set(array, 1, 4L);
+
+ System.out.println(arrayVarHandle.getVolatile(array, 0));
+ System.out.println(arrayVarHandle.getVolatile(array, 1));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((Object) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((long) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((float) arrayVarHandle.getVolatile(array, 1));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 0));
+ System.out.println((double) arrayVarHandle.getVolatile(array, 1));
+ unsupportedGetVolatileConversion(arrayVarHandle, array);
+ try {
+ System.out.println((int) arrayVarHandle.getVolatile(array, 0));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((int) arrayVarHandle.getVolatile(array, 1));
+ System.out.println("Unexpected success");
+ } catch (ClassCastException e) {
+ // The reference implementation throws ClassCastException.
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ }
+
public static void testSet() {
System.out.println("testSet");
@@ -366,6 +503,7 @@
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
testGet();
+ testGetVolatile();
testSet();
testCompareAndSet();
testArrayVarHandleForNonSingleDimension();
diff --git a/src/test/examplesJava9/varhandle/InstanceIntField.java b/src/test/examplesJava9/varhandle/InstanceIntField.java
index aeadbcc..3b4edfb 100644
--- a/src/test/examplesJava9/varhandle/InstanceIntField.java
+++ b/src/test/examplesJava9/varhandle/InstanceIntField.java
@@ -62,6 +62,50 @@
}
}
+ public static void testGetVolatile(VarHandle varHandle) {
+ System.out.println("testGetVolatile");
+
+ InstanceIntField instance = new InstanceIntField();
+ varHandle.set(instance, 1);
+
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((Object) varHandle.getVolatile(instance));
+ System.out.println((int) varHandle.getVolatile(instance));
+ System.out.println((long) varHandle.getVolatile(instance));
+ System.out.println((float) varHandle.getVolatile(instance));
+ System.out.println((double) varHandle.getVolatile(instance));
+ try {
+ System.out.println((boolean) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((byte) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((short) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((char) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((String) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ }
+
public static void testSet(VarHandle varHandle) {
System.out.println("testSet");
@@ -262,6 +306,7 @@
VarHandle varHandle =
MethodHandles.lookup().findVarHandle(InstanceIntField.class, "field", int.class);
testGet(varHandle);
+ testGetVolatile(varHandle);
testSet(varHandle);
testCompareAndSet(varHandle);
}
diff --git a/src/test/examplesJava9/varhandle/InstanceLongField.java b/src/test/examplesJava9/varhandle/InstanceLongField.java
index b23e692..484ed87 100644
--- a/src/test/examplesJava9/varhandle/InstanceLongField.java
+++ b/src/test/examplesJava9/varhandle/InstanceLongField.java
@@ -67,6 +67,55 @@
}
}
+ public static void testGetVolatile(VarHandle varHandle) {
+ System.out.println("testGetVolatile");
+
+ InstanceLongField instance = new InstanceLongField();
+ varHandle.set(instance, 1);
+
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((Object) varHandle.getVolatile(instance));
+ System.out.println((long) varHandle.getVolatile(instance));
+ System.out.println((float) varHandle.getVolatile(instance));
+ System.out.println((double) varHandle.getVolatile(instance));
+ try {
+ System.out.println((boolean) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((byte) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((short) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((char) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((int) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ try {
+ System.out.println((String) varHandle.getVolatile(instance));
+ System.out.println("Unexpected success");
+ } catch (RuntimeException e) {
+ checkJavaLangInvokeWrongMethodTypeException(e);
+ }
+ }
+
public static void testSet(VarHandle varHandle) {
System.out.println("testSet");
@@ -237,6 +286,7 @@
VarHandle varHandle =
MethodHandles.lookup().findVarHandle(InstanceLongField.class, "field", long.class);
testGet(varHandle);
+ testGetVolatile(varHandle);
testSet(varHandle);
testCompareAndSet(varHandle);
}
diff --git a/src/test/examplesJava9/varhandle/InstanceObjectField.java b/src/test/examplesJava9/varhandle/InstanceObjectField.java
index c951ed8..bd17d04 100644
--- a/src/test/examplesJava9/varhandle/InstanceObjectField.java
+++ b/src/test/examplesJava9/varhandle/InstanceObjectField.java
@@ -24,8 +24,8 @@
}
}
- public static void testSet(VarHandle varHandle) {
- System.out.println("testSet");
+ public static void testSetGet(VarHandle varHandle) {
+ System.out.println("testSetGet");
InstanceObjectField instance = new InstanceObjectField();
@@ -161,6 +161,143 @@
}
}
+ public static void testSetGetVolatile(VarHandle varHandle) {
+ System.out.println("testSetGetVolatile");
+
+ InstanceObjectField instance = new InstanceObjectField();
+
+ System.out.println(varHandle.getVolatile(instance));
+ A a1 = new A(1);
+ varHandle.set(instance, a1);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println(varHandle.getVolatile(instance) == a1);
+ A a2 = new A(2);
+ varHandle.set(instance, a2);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println(varHandle.getVolatile(instance) == a2);
+
+ Object o;
+ {
+ int i;
+ varHandle.set(instance, 1);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((int) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Integer);
+ i = (int) varHandle.getVolatile(instance);
+ System.out.println(i == 1);
+ varHandle.set(instance, Integer.valueOf(2));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((int) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Integer);
+ i = (int) varHandle.getVolatile(instance);
+ System.out.println(i == 2);
+ }
+ {
+ long l;
+ varHandle.set(instance, 3L);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((long) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Long);
+ l = (long) varHandle.getVolatile(instance);
+ System.out.println(l == 3L);
+ varHandle.set(instance, Long.valueOf(4L));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((long) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Long);
+ l = (long) varHandle.getVolatile(instance);
+ System.out.println(l == 4L);
+ }
+ {
+ byte b;
+ varHandle.set(instance, (byte) 5);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((byte) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Byte);
+ b = (byte) varHandle.getVolatile(instance);
+ System.out.println(b == (byte) 5);
+ varHandle.set(instance, Byte.valueOf((byte) 6));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((byte) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Byte);
+ b = (byte) varHandle.getVolatile(instance);
+ System.out.println(b == 6);
+ }
+ {
+ short s;
+ varHandle.set(instance, (short) 7);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((short) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Short);
+ s = (short) varHandle.getVolatile(instance);
+ System.out.println(s == (short) 7);
+ varHandle.set(instance, Short.valueOf((short) 8));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((short) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Short);
+ s = (short) varHandle.getVolatile(instance);
+ System.out.println(s == 8);
+ }
+ {
+ float f;
+ varHandle.set(instance, (float) 9.0f);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((float) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Float);
+ f = (float) varHandle.getVolatile(instance);
+ System.out.println(f == (float) 9.0f);
+ varHandle.set(instance, Float.valueOf(10.0f));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((float) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Float);
+ f = (float) varHandle.getVolatile(instance);
+ System.out.println(f == 10.0f);
+ }
+ {
+ double d;
+ varHandle.set(instance, (double) 11.0);
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((double) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Double);
+ d = (double) varHandle.getVolatile(instance);
+ System.out.println(d == (double) 11.0);
+ varHandle.set(instance, Double.valueOf(12.0));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((double) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Double);
+ d = (double) varHandle.getVolatile(instance);
+ System.out.println(d == 12.0);
+ }
+ {
+ char c;
+ varHandle.set(instance, 'A');
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((char) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Character);
+ c = (char) varHandle.getVolatile(instance);
+ System.out.println(c == 'A');
+ varHandle.set(instance, Character.valueOf('B'));
+ System.out.println(varHandle.getVolatile(instance));
+ System.out.println((char) varHandle.getVolatile(instance));
+ o = varHandle.getVolatile(instance);
+ System.out.println(o instanceof Character);
+ c = (char) varHandle.getVolatile(instance);
+ System.out.println(c == 'B');
+ }
+ }
+
public static void testCompareAndSet(VarHandle varHandle) {
System.out.println("testCompareAndSet");
@@ -271,7 +408,8 @@
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
VarHandle varHandle =
MethodHandles.lookup().findVarHandle(InstanceObjectField.class, "field", Object.class);
- testSet(varHandle);
+ testSetGet(varHandle);
+ testSetGetVolatile(varHandle);
testCompareAndSet(varHandle);
testReturnValueClassCastException(varHandle);
}