blob: 231ee6a94cf0557c4aa76822b338694d00aa0c13 [file] [log] [blame]
// 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 InstanceStringField {
private Object field;
private static void println(String s) {
System.out.println(s);
}
public static void testGet(VarHandle varHandle) {
System.out.println("testGet");
InstanceStringField instance = new InstanceStringField();
// Then polymorphic invoke will remove the cast and make that as the return type of the get.
System.out.println((String) varHandle.get(instance));
varHandle.set(instance, "1");
System.out.println(varHandle.get(instance));
System.out.println((Object) varHandle.get(instance));
System.out.println((String) varHandle.get(instance));
System.out.println((CharSequence) varHandle.get(instance));
try {
System.out.println((Byte) varHandle.get(instance));
System.out.println("Unexpected success");
} catch (ClassCastException e) {
}
}
public static void testSet(VarHandle varHandle) {
System.out.println("testSet");
InstanceStringField instance = new InstanceStringField();
// Then polymorphic invoke will remove the cast and make that as the return type of the get.
println((String) varHandle.get(instance));
varHandle.set(instance, "1");
println((String) varHandle.get(instance));
}
public static void testCompareAndSet(VarHandle varHandle) {
System.out.println("testCompareAndSet");
InstanceStringField instance = new InstanceStringField();
varHandle.compareAndSet(instance, 0, "1");
println((String) varHandle.get(instance));
varHandle.compareAndSet(instance, null, "1");
println((String) varHandle.get(instance));
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
VarHandle varHandle =
MethodHandles.lookup().findVarHandle(InstanceStringField.class, "field", Object.class);
testGet(varHandle);
testSet(varHandle);
testCompareAndSet(varHandle);
}
}