import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
class Main {
void getInt() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
VarHandle handle = lookup.findVarHandle(Test.class, "n", int.class);
Test instance = new Test();
Object nullArg = null;
int exact = (int) handle.get(instance);
Integer boxed = (Integer) handle.get(instance);
Object object = (Object) handle.get(instance);
String incompatible = (String) handle.get(instance);
handle.get(instance, 1);
handle.get();
handle.get(nullArg);
handle.get(123);
int exactV = (int) handle.getVolatile(instance);
Integer boxedV = (Integer) handle.getVolatile(instance);
Object objectV = (Object) handle.getVolatile(instance);
String incompatibleV = (String) handle.getVolatile(instance);
handle.getVolatile(instance, 1);
handle.getVolatile();
handle.getVolatile(nullArg);
handle.getVolatile(123);
int exactO = (int) handle.getOpaque(instance);
Integer boxedO = (Integer) handle.getOpaque(instance);
Object objectO = (Object) handle.getOpaque(instance);
String incompatibleO = (String) handle.getOpaque(instance);
handle.getOpaque(instance, 1);
handle.getOpaque();
handle.getOpaque(nullArg);
handle.getOpaque(123);
int exactA = (int) handle.getAcquire(instance);
Integer boxedA = (Integer) handle.getAcquire(instance);
Object objectA = (Object) handle.getAcquire(instance);
String incompatibleA = (String) handle.getAcquire(instance);
handle.getAcquire(instance, 1);
handle.getAcquire();
handle.getAcquire(nullArg);
handle.getAcquire(123);
}
void setInt() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
VarHandle handle = lookup.findVarHandle(Test.class, "n", int.class);
Test instance = new Test();
Object nullArg = null;
Object textArg = "abc";
Object numberArg = 123;
handle.set(instance, 1);
handle.set(instance, Integer.valueOf(2));
handle.set(instance, numberArg);
handle.set(instance, textArg);
handle.set(instance);
handle.set();
handle.set(nullArg, 123);
handle.set(instance, nullArg);
handle.set(123, 42);
handle.setVolatile(instance, 1);
handle.setVolatile(instance, Integer.valueOf(2));
handle.setVolatile(instance, numberArg);
handle.setVolatile(instance, textArg);
handle.setVolatile(instance);
handle.setVolatile();
handle.setVolatile(nullArg, 123);
handle.setVolatile(instance, nullArg);
handle.setVolatile(123, 42);
handle.setOpaque(instance, 1);
handle.setOpaque(instance, Integer.valueOf(2));
handle.setOpaque(instance, numberArg);
handle.setOpaque(instance, textArg);
handle.setOpaque(instance);
handle.setOpaque();
handle.setOpaque(nullArg, 123);
handle.setOpaque(instance, nullArg);
handle.setOpaque(123, 42);
handle.setRelease(instance, 1);
handle.setRelease(instance, Integer.valueOf(2));
handle.setRelease(instance, numberArg);
handle.setRelease(instance, textArg);
handle.setRelease(instance);
handle.setRelease();
handle.setRelease(nullArg, 123);
handle.setRelease(instance, nullArg);
handle.setRelease(123, 42);
}
void getStr() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
final VarHandle handle = lookup.findVarHandle(Test.class, "s", String.class);
final Test instance = new Test();
final Object nullArg = null;
String exact = (String) handle.get(instance);
CharSequence parent = (CharSequence) handle.get(instance);
Object object = (Object) handle.get(instance);
Integer incompatible = (Integer) handle.get(instance);
handle.get(instance, 1);
handle.get();
handle.get(nullArg);
handle.get(123);
String exactV = (String) handle.getVolatile(instance);
CharSequence parentV = (CharSequence) handle.getVolatile(instance);
Object objectV = (Object) handle.getVolatile(instance);
Integer incompatibleV = (Integer) handle.getVolatile(instance);
handle.getVolatile(instance, 1);
handle.getVolatile();
handle.getVolatile(nullArg);
handle.getVolatile(123);
String exactO = (String) handle.getOpaque(instance);
CharSequence parentO = (CharSequence) handle.getOpaque(instance);
Object objectO = (Object) handle.getOpaque(instance);
Integer incompatibleO = (Integer) handle.getOpaque(instance);
handle.getOpaque(instance, 1);
handle.getOpaque();
handle.getOpaque(nullArg);
handle.getOpaque("abc");
String exactA = (String) handle.getAcquire(instance);
CharSequence parentA = (CharSequence) handle.getAcquire(instance);
Object objectA = (Object) handle.getAcquire(instance);
Integer incompatibleA = (Integer) handle.getAcquire(instance);
handle.getAcquire(instance, 1);
handle.getAcquire();
handle.getAcquire(nullArg);
handle.getAcquire("abc");
}
void setStr() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
final VarHandle handle = lookup.findVarHandle(Test.class, "s", String.class);
final Test instance = new Test();
final Object nullArg = null;
final Object textArg = "abc";
final Object numberArg = 3;
handle.set(instance, "a");
handle.set(instance, charSequence());
handle.set(instance, textArg);
handle.set(instance, nullArg);
handle.set(instance, numberArg);
handle.set(instance);
handle.set();
handle.set(nullArg);
handle.set("abc", "d");
handle.setVolatile(instance, "a");
handle.setVolatile(instance, charSequence());
handle.setVolatile(instance, textArg);
handle.setVolatile(instance, nullArg);
handle.setVolatile(instance, numberArg);
handle.setVolatile(instance);
handle.setVolatile();
handle.setVolatile(nullArg);
handle.setVolatile("abc", "d");
handle.setOpaque(instance, "a");
handle.setOpaque(instance, charSequence());
handle.setOpaque(instance, textArg);
handle.setOpaque(instance, nullArg);
handle.setOpaque(instance, numberArg);
handle.setOpaque(instance);
handle.setOpaque();
handle.setOpaque(nullArg);
handle.setOpaque("abc", "d");
handle.setRelease(instance, "a");
handle.setRelease(instance, charSequence());
handle.setRelease(instance, textArg);
handle.setRelease(instance, nullArg);
handle.setRelease(instance, numberArg);
handle.setRelease(instance);
handle.setRelease();
handle.setRelease(nullArg);
handle.setRelease("abc", "d");
}
private void getAndAddInt() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
VarHandle handle = lookup.findVarHandle(Test.class, "n", int.class);
Test instance = new Test();
Object nullArg = null;
int exact = (int) handle.getAndAdd(instance, 1);
Integer boxed = (Integer) handle.getAndAdd(instance, 2);
Object object = (Object) handle.getAndAdd(instance, 3);
handle.getAndAdd(instance, 4);
String incompatible = (String) handle.getAndAdd(instance, 0);
int incompatibleArg = (int) handle.getAndSet(instance, "abc");
handle.getAndAdd(instance);
handle.getAndAdd();
handle.getAndAdd(nullArg, 0);
int wrongReceiver = (int)handle.getAndAdd(123, 42);
int exactA = (int) handle.getAndAddAcquire(instance, 1); ;
Integer boxedA = (Integer) handle.getAndAddAcquire(instance, 2);
Object objectA = (Object) handle.getAndAddAcquire(instance, 3);
handle.getAndAddAcquire(instance, 4);
String incompatibleA = (String) handle.getAndAddAcquire(instance, 0);
int incompatibleArgA = (int) handle.getAndSetAcquire(instance, "abc");
handle.getAndAddAcquire(instance);
handle.getAndAddAcquire();
handle.getAndAddAcquire(nullArg, 0);
int wrongReceiver = (int)handle.getAndAddAcquire(123, 42);
int exactR = (int) handle.getAndAddRelease(instance, 1); ;
Integer boxedR = (Integer) handle.getAndAddRelease(instance, 2);
Object objectR = (Object) handle.getAndAddRelease(instance, 3);
handle.getAndAddRelease(instance, 4);
String incompatibleR = (String) handle.getAndAdd(instance, 0);
int incompatibleArgR = (int) handle.getAndSetRelease(instance, "abc");
handle.getAndAddRelease(instance);
handle.getAndAddRelease();
handle.getAndAddRelease(nullArg, 0);
int wrongReceiverR = (int)handle.getAndAddRelease(123, 42);
}
private void getAndSetStr() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
final VarHandle handle = lookup.findVarHandle(Test.class, "s", String.class);
final Test instance = new Test();
final Object nullArg = null;
String exact = (String) handle.getAndSet(instance, "a");
CharSequence parent = (CharSequence) handle.getAndSet(instance, "b");
Object object = (Object) handle.getAndSet(instance, "c");
String subclassArg = (String) handle.getAndSet(instance, charSequence());
String withNullArg = (String) handle.getAndSet(instance, nullArg);
handle.getAndSet(instance, "d");
Integer incompatible = (Integer) handle.getAndSet(instance, "e");
String incompatibleArg = (String) handle.getAndSet(instance, 123);
handle.getAndSet(instance);
handle.getAndSet();
handle.getAndSet(nullArg, "abc");
int wrongReceiver = (int)handle.getAndSet("abc", "e");
String exactA = (String) handle.getAndSetAcquire(instance, "a");
CharSequence parentA = (CharSequence) handle.getAndSetAcquire(instance, "b");
Object objectA = (Object) handle.getAndSetAcquire(instance, "c");;
String subclassArgA = (String) handle.getAndSetAcquire(instance, charSequence());
String withNullArgA = (String) handle.getAndSetAcquire(instance, nullArg);
handle.getAndSetAcquire(instance, "d");
Integer incompatibleA = (Integer) handle.getAndSetAcquire(instance, "e");
String incompatibleArgA = (String) handle.getAndSetAcquire(instance, 123);
handle.getAndSetAcquire(instance);
handle.getAndSetAcquire();
handle.getAndSetAcquire(nullArg, "abc");
int wrongReceiverA = (int)handle.getAndSetAcquire("abc", "e");
String exactR = (String) handle.getAndSetRelease(instance, "a");
CharSequence parentR = (CharSequence) handle.getAndSetRelease(instance, "b");
Object objectR = (Object) handle.getAndSetRelease(instance, "c");;
String subclassArgR = (String) handle.getAndSetRelease(instance, charSequence());
String withNullArgR = (String) handle.getAndSetRelease(instance, nullArg);
handle.getAndSetRelease(instance, "d");
Integer incompatibleR = (Integer) handle.getAndSetRelease(instance, "e");
String incompatibleArgR = (String) handle.getAndSetRelease(instance, 123);
handle.getAndSetRelease(instance);
handle.getAndSetRelease();
handle.getAndSetRelease(nullArg, "abc");
int wrongReceiverR = (int)handle.getAndSetRelease("abc", "e");
}
void getAndBitwise() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
VarHandle handle = lookup.findVarHandle(Test.class, "n", int.class);
Test instance = new Test();
int exactBitwiseAnd = (int) handle.getAndBitwiseAnd(instance, 1);
int exactBitwiseAndA = (int) handle.getAndBitwiseAndAcquire(instance, 2);
int exactBitwiseAndR = (int) handle.getAndBitwiseAndRelease(instance, 3);
int wrongArgBitwiseAnd = (int) handle.getAndBitwiseAnd(instance, "a");
int wrongArgBitwiseAndA = (int) handle.getAndBitwiseAndAcquire(instance, "b");
int wrongArgBitwiseAndR = (int) handle.getAndBitwiseAndRelease(instance, "c");
String wrongResultBitwiseAnd = (String) handle.getAndBitwiseAnd(instance, 1);
String wrongResultBitwiseAndA = (String) handle.getAndBitwiseAndAcquire(instance, 2);
String wrongResultBitwiseAndR = (String) handle.getAndBitwiseAndRelease(instance, 3);
int exactBitwiseOr = (int) handle.getAndBitwiseOr(instance, 1);
int exactBitwiseOrA = (int) handle.getAndBitwiseOrAcquire(instance, 2);
int exactBitwiseOrR = (int) handle.getAndBitwiseOrRelease(instance, 3);
int wrongArgBitwiseOr = (int) handle.getAndBitwiseOr(instance, "a");
int wrongArgBitwiseOrA = (int) handle.getAndBitwiseOrAcquire(instance, "b");
int wrongArgBitwiseOrR = (int) handle.getAndBitwiseOrRelease(instance, "c");
String wrongResultBitwiseOr = (String) handle.getAndBitwiseOr(instance, 1);
String wrongResultBitwiseOrA = (String) handle.getAndBitwiseOrAcquire(instance, 2);
String wrongResultBitwiseOrR = (String) handle.getAndBitwiseOrRelease(instance, 3);
int exactBitwiseXor = (int) handle.getAndBitwiseXor(instance, 1);
int exactBitwiseXorA = (int) handle.getAndBitwiseXorAcquire(instance, 2);
int exactBitwiseXorR = (int) handle.getAndBitwiseXorRelease(instance, 3);
int wrongArgBitwiseXor = (int) handle.getAndBitwiseXor(instance, "a");
int wrongArgBitwiseXorA = (int) handle.getAndBitwiseXorAcquire(instance, "b");
int wrongArgBitwiseXorR = (int) handle.getAndBitwiseXorRelease(instance, "c");
String wrongResultBitwiseXor = (String) handle.getAndBitwiseXor(instance, 1);
String wrongResultBitwiseXorA = (String) handle.getAndBitwiseXorAcquire(instance, 2);
String wrongResultBitwiseXorR = (String) handle.getAndBitwiseXorRelease(instance, 3);
}
void compare() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
final VarHandle handle = lookup.findVarHandle(Test.class, "s", String.class);
final Test instance = new Test();
boolean exactCAS = handle.compareAndSet(instance, "a", "b");
String exactCAE = (String)handle.compareAndExchange(instance, "a", "b");
String exactCAEA = (String)handle.compareAndExchangeAcquire(instance, "a", "b");
String exactCAER = (String)handle.compareAndExchangeRelease(instance, "a", "b");
boolean badArg2CAS = handle.compareAndSet(instance, 1, "b");
String badArg2CAE = (String)handle.compareAndExchange(instance, 2, "b");
String badArg2CAEa = (String)handle.compareAndExchangeAcquire(instance, 3, "b");
String badArg2CAEr = (String)handle.compareAndExchangeRelease(instance, 4, "b");
boolean badArg3CAS = handle.compareAndSet(instance, "a", 1);
String badArg3CAE = (String)handle.compareAndExchange(instance, "a", 2);
String badArg3CAEa = (String)handle.compareAndExchangeAcquire(instance, "a", 3);
String badArg3CAEr = (String)handle.compareAndExchangeRelease(instance, "a", 4);
Integer badResultCAE = (Integer)handle.compareAndExchange(instance, "a", "b");
Integer badResultCAEa = (Integer)handle.compareAndExchangeAcquire(instance, "a", "b");
Integer badResultCAEr = (Integer)handle.compareAndExchangeRelease(instance, "a", "b");
}
void weakCompare() throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
final VarHandle handle = lookup.findVarHandle(Test.class, "s", String.class);
final Test instance = new Test();
boolean exactCAS = handle.weakCompareAndSet(instance, "a", "b");
boolean exactCASp = handle.weakCompareAndSetPlain(instance, "a", "b");
boolean exactCASa = handle.weakCompareAndSetAcquire(instance, "a", "b");
boolean exactCASr = handle.weakCompareAndSetRelease(instance, "a", "b");
boolean badArg2CAS = handle.weakCompareAndSet(instance, 1, "b");
boolean badArg2CASp = handle.weakCompareAndSetPlain(instance, 2, "b");
boolean badArg2CASa = handle.weakCompareAndSetAcquire(instance, 3, "b");
boolean badArg2CASr = handle.weakCompareAndSetRelease(instance, 4, "b");
boolean badArg3CAS = handle.weakCompareAndSet(instance, "a", 1);
boolean badArg3CASp = handle.weakCompareAndSetPlain(instance, "a", 2);
boolean badArg3CASa = handle.weakCompareAndSetAcquire(instance, "a", 3);
boolean badArg3CASr = handle.weakCompareAndSetRelease(instance, "a", 4);
}
private static CharSequence charSequence() { return "abc"; }
}
class Test {
public int n;
public String s;
}