// 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;
import java.lang.invoke.WrongMethodTypeException;

public class InstanceObjectField {

  private Object field;

  public static class A {

    private final int i;

    public A(int i) {
      this.i = i;
    }

    public String toString() {
      return "A(" + i + ")";
    }
  }

  public static void testSetGet(VarHandle varHandle) {
    System.out.println("testSetGet");

    InstanceObjectField instance = new InstanceObjectField();

    System.out.println(varHandle.get(instance));
    A a1 = new A(1);
    varHandle.set(instance, a1);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    A a2 = new A(2);
    varHandle.set(instance, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    Object o;
    {
      int i;
      varHandle.set(instance, 1);
      System.out.println(varHandle.get(instance));
      System.out.println((int) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Integer);
      i = (int) varHandle.get(instance);
      System.out.println(i == 1);
      varHandle.set(instance, Integer.valueOf(2));
      System.out.println(varHandle.get(instance));
      System.out.println((int) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Integer);
      i = (int) varHandle.get(instance);
      System.out.println(i == 2);
    }
    {
      long l;
      varHandle.set(instance, 3L);
      System.out.println(varHandle.get(instance));
      System.out.println((long) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Long);
      l = (long) varHandle.get(instance);
      System.out.println(l == 3L);
      varHandle.set(instance, Long.valueOf(4L));
      System.out.println(varHandle.get(instance));
      System.out.println((long) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Long);
      l = (long) varHandle.get(instance);
      System.out.println(l == 4L);
    }
    {
      byte b;
      varHandle.set(instance, (byte) 5);
      System.out.println(varHandle.get(instance));
      System.out.println((byte) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Byte);
      b = (byte) varHandle.get(instance);
      System.out.println(b == (byte) 5);
      varHandle.set(instance, Byte.valueOf((byte) 6));
      System.out.println(varHandle.get(instance));
      System.out.println((byte) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Byte);
      b = (byte) varHandle.get(instance);
      System.out.println(b == 6);
    }
    {
      short s;
      varHandle.set(instance, (short) 7);
      System.out.println(varHandle.get(instance));
      System.out.println((short) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Short);
      s = (short) varHandle.get(instance);
      System.out.println(s == (short) 7);
      varHandle.set(instance, Short.valueOf((short) 8));
      System.out.println(varHandle.get(instance));
      System.out.println((short) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Short);
      s = (short) varHandle.get(instance);
      System.out.println(s == 8);
    }
    {
      float f;
      varHandle.set(instance, (float) 9.0f);
      System.out.println(varHandle.get(instance));
      System.out.println((float) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Float);
      f = (float) varHandle.get(instance);
      System.out.println(f == (float) 9.0f);
      varHandle.set(instance, Float.valueOf(10.0f));
      System.out.println(varHandle.get(instance));
      System.out.println((float) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Float);
      f = (float) varHandle.get(instance);
      System.out.println(f == 10.0f);
    }
    {
      double d;
      varHandle.set(instance, (double) 11.0);
      System.out.println(varHandle.get(instance));
      System.out.println((double) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Double);
      d = (double) varHandle.get(instance);
      System.out.println(d == (double) 11.0);
      varHandle.set(instance, Double.valueOf(12.0));
      System.out.println(varHandle.get(instance));
      System.out.println((double) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Double);
      d = (double) varHandle.get(instance);
      System.out.println(d == 12.0);
    }
    {
      char c;
      varHandle.set(instance, 'A');
      System.out.println(varHandle.get(instance));
      System.out.println((char) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Character);
      c = (char) varHandle.get(instance);
      System.out.println(c == 'A');
      varHandle.set(instance, Character.valueOf('B'));
      System.out.println(varHandle.get(instance));
      System.out.println((char) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Character);
      c = (char) varHandle.get(instance);
      System.out.println(c == 'B');
    }
  }

  public static void testSetVolatileGetVolatile(VarHandle varHandle) {
    System.out.println("testSetVolatileGetVolatile");

    InstanceObjectField instance = new InstanceObjectField();

    System.out.println(varHandle.getVolatile(instance));
    A a1 = new A(1);
    varHandle.setVolatile(instance, a1);
    System.out.println(varHandle.getVolatile(instance));
    System.out.println(varHandle.getVolatile(instance) == a1);
    A a2 = new A(2);
    varHandle.setVolatile(instance, a2);
    System.out.println(varHandle.getVolatile(instance));
    System.out.println(varHandle.getVolatile(instance) == a2);

    Object o;
    {
      int i;
      varHandle.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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.setVolatile(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 testSetReleaseGet(VarHandle varHandle) {
    System.out.println("testSetReleaseGet");

    InstanceObjectField instance = new InstanceObjectField();

    System.out.println(varHandle.get(instance));
    A a1 = new A(1);
    varHandle.setRelease(instance, a1);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    A a2 = new A(2);
    varHandle.setRelease(instance, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    Object o;
    {
      int i;
      varHandle.setRelease(instance, 1);
      System.out.println(varHandle.get(instance));
      System.out.println((int) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Integer);
      i = (int) varHandle.get(instance);
      System.out.println(i == 1);
      varHandle.setRelease(instance, Integer.valueOf(2));
      System.out.println(varHandle.get(instance));
      System.out.println((int) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Integer);
      i = (int) varHandle.get(instance);
      System.out.println(i == 2);
    }
    {
      long l;
      varHandle.setRelease(instance, 3L);
      System.out.println(varHandle.get(instance));
      System.out.println((long) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Long);
      l = (long) varHandle.get(instance);
      System.out.println(l == 3L);
      varHandle.setRelease(instance, Long.valueOf(4L));
      System.out.println(varHandle.get(instance));
      System.out.println((long) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Long);
      l = (long) varHandle.get(instance);
      System.out.println(l == 4L);
    }
    {
      byte b;
      varHandle.setRelease(instance, (byte) 5);
      System.out.println(varHandle.get(instance));
      System.out.println((byte) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Byte);
      b = (byte) varHandle.get(instance);
      System.out.println(b == (byte) 5);
      varHandle.setRelease(instance, Byte.valueOf((byte) 6));
      System.out.println(varHandle.get(instance));
      System.out.println((byte) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Byte);
      b = (byte) varHandle.get(instance);
      System.out.println(b == 6);
    }
    {
      short s;
      varHandle.setRelease(instance, (short) 7);
      System.out.println(varHandle.get(instance));
      System.out.println((short) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Short);
      s = (short) varHandle.get(instance);
      System.out.println(s == (short) 7);
      varHandle.setRelease(instance, Short.valueOf((short) 8));
      System.out.println(varHandle.get(instance));
      System.out.println((short) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Short);
      s = (short) varHandle.get(instance);
      System.out.println(s == 8);
    }
    {
      float f;
      varHandle.setRelease(instance, (float) 9.0f);
      System.out.println(varHandle.get(instance));
      System.out.println((float) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Float);
      f = (float) varHandle.get(instance);
      System.out.println(f == (float) 9.0f);
      varHandle.setRelease(instance, Float.valueOf(10.0f));
      System.out.println(varHandle.get(instance));
      System.out.println((float) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Float);
      f = (float) varHandle.get(instance);
      System.out.println(f == 10.0f);
    }
    {
      double d;
      varHandle.setRelease(instance, (double) 11.0);
      System.out.println(varHandle.get(instance));
      System.out.println((double) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Double);
      d = (double) varHandle.get(instance);
      System.out.println(d == (double) 11.0);
      varHandle.setRelease(instance, Double.valueOf(12.0));
      System.out.println(varHandle.get(instance));
      System.out.println((double) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Double);
      d = (double) varHandle.get(instance);
      System.out.println(d == 12.0);
    }
    {
      char c;
      varHandle.setRelease(instance, 'A');
      System.out.println(varHandle.get(instance));
      System.out.println((char) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Character);
      c = (char) varHandle.get(instance);
      System.out.println(c == 'A');
      varHandle.setRelease(instance, Character.valueOf('B'));
      System.out.println(varHandle.get(instance));
      System.out.println((char) varHandle.get(instance));
      o = varHandle.get(instance);
      System.out.println(o instanceof Character);
      c = (char) varHandle.get(instance);
      System.out.println(c == 'B');
    }
  }

  public static void testCompareAndSet(VarHandle varHandle) {
    System.out.println("testCompareAndSet");

    InstanceObjectField instance = new InstanceObjectField();

    A a1 = new A(1);
    varHandle.compareAndSet(instance, 0, a1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, null, a1);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    A a2 = new A(2);
    varHandle.compareAndSet(instance, a1, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    varHandle.compareAndSet(instance, a2, 1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(1), 2);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(3), 4);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 4L, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 4, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 4, 5);
    System.out.println(varHandle.get(instance));

    varHandle.compareAndSet(instance, 4, 5L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(5), 6L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(7), 8L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 8, 9L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 8, 9);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 8, 9);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    varHandle.compareAndSet(instance, a1, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    varHandle.compareAndSet(instance, a2, 1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(1), 2);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(3), 4);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 4L, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 4, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 4, 5);
    System.out.println(varHandle.get(instance));

    varHandle.compareAndSet(instance, 4, 5L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(5), 6L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(7), 8L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 8, 9L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 8, 9);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 8, 9);
    System.out.println(varHandle.get(instance));
  }

  // 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(VarHandle varHandle) {
    System.out.println("testWeakCompareAndSet");

    InstanceObjectField instance = new InstanceObjectField();

    A a1 = new A(1);
    varHandle.compareAndSet(instance, 0, a1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, null, a1);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    A a2 = new A(2);
    varHandle.compareAndSet(instance, a1, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    varHandle.compareAndSet(instance, a2, 1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(1), 2);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(3), 4);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 4L, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 4, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 4, 5);
    System.out.println(varHandle.get(instance));

    varHandle.compareAndSet(instance, 4, 5L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(5), 6L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(7), 8L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 8, 9L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 8, 9);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 8, 9);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a1);
    varHandle.compareAndSet(instance, a1, a2);
    System.out.println(varHandle.get(instance));
    System.out.println(varHandle.get(instance) == a2);

    varHandle.compareAndSet(instance, a2, 1);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(1), 2);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(2), Integer.valueOf(3));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Integer.valueOf(3), 4);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 4L, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 4, 5);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 4, 5);
    System.out.println(varHandle.get(instance));

    varHandle.compareAndSet(instance, 4, 5L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(5), 6L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(6), Long.valueOf(7));
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, Long.valueOf(7), 8L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, 8, 9L);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (byte) 8, 9);
    System.out.println(varHandle.get(instance));
    varHandle.compareAndSet(instance, (short) 8, 9);
    System.out.println(varHandle.get(instance));
  }

  public static void testReturnValueClassCastException(VarHandle varHandle) {
    System.out.println("testReturnValueClassCastException");

    InstanceObjectField instance = new InstanceObjectField();
    A a = new A(1);

    varHandle.set(instance, a);
    try {
      System.out.println((int) varHandle.get(instance));
      System.out.println("Expected ClassCastException");
    } catch (ClassCastException e) {
      System.out.println("Reference implementation");
    } catch (WrongMethodTypeException e) {
      System.out.println("Art implementation");
    }
    varHandle.set(instance, a);
    try {
      System.out.println((int) (Integer) (int) varHandle.get(instance));
      System.out.println("Expected ClassCastException");
    } catch (ClassCastException e) {
      System.out.println("Reference implementation");
    } catch (WrongMethodTypeException e) {
      System.out.println("Art implementation");
    }
  }

  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    VarHandle varHandle =
        MethodHandles.lookup().findVarHandle(InstanceObjectField.class, "field", Object.class);
    testSetGet(varHandle);
    testSetVolatileGetVolatile(varHandle);
    testSetReleaseGet(varHandle);
    testCompareAndSet(varHandle);
    testWeakCompareAndSet(varHandle);
    testReturnValueClassCastException(varHandle);
  }
}
