Merge "VarHandles: fix missing reference for static field VarHandles"
diff --git a/libart/src/main/java/java/lang/invoke/FieldVarHandle.java b/libart/src/main/java/java/lang/invoke/FieldVarHandle.java
index 0921040..beb056a 100644
--- a/libart/src/main/java/java/lang/invoke/FieldVarHandle.java
+++ b/libart/src/main/java/java/lang/invoke/FieldVarHandle.java
@@ -20,27 +20,24 @@
 import java.lang.reflect.Modifier;
 
 /**
- * A VarHandle that's associated with an ArtField.
+ * A VarHandle that's associated with an instance field.
  * @hide
  */
-final class FieldVarHandle extends VarHandle {
+class FieldVarHandle extends VarHandle {
     private final long artField;
 
-    private FieldVarHandle(Field field, Class<?> declaringClass) {
-        super(field.getType(), Modifier.isFinal(field.getModifiers()), declaringClass);
+    private FieldVarHandle(Field field, Class<?> coordinateType0) {
+        super(field.getType(), Modifier.isFinal(field.getModifiers()), coordinateType0);
         artField = field.getArtField();
     }
 
-    private FieldVarHandle(Field field) {
+    protected FieldVarHandle(Field field) {
         super(field.getType(), Modifier.isFinal(field.getModifiers()));
         artField = field.getArtField();
     }
 
     static FieldVarHandle create(Field field) {
-        if (Modifier.isStatic(field.getModifiers())) {
-            return new FieldVarHandle(field);
-        } else {
-            return new FieldVarHandle(field, field.getDeclaringClass());
-        }
+        assert !Modifier.isStatic(field.getModifiers());
+        return new FieldVarHandle(field, field.getDeclaringClass());
     }
 }
diff --git a/libart/src/main/java/java/lang/invoke/StaticFieldVarHandle.java b/libart/src/main/java/java/lang/invoke/StaticFieldVarHandle.java
new file mode 100644
index 0000000..e5faeb7
--- /dev/null
+++ b/libart/src/main/java/java/lang/invoke/StaticFieldVarHandle.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+package java.lang.invoke;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+/**
+ * A VarHandle that's associated with a static field.
+ * @hide
+ */
+final class StaticFieldVarHandle extends FieldVarHandle {
+    private final Class declaringClass;
+
+    private StaticFieldVarHandle(Field staticField) {
+        super(staticField);
+        declaringClass = staticField.getDeclaringClass();
+    }
+
+    static StaticFieldVarHandle create(Field staticField) {
+        assert Modifier.isStatic(staticField.getModifiers());
+        return new StaticFieldVarHandle(staticField);
+    }
+}
diff --git a/non_openjdk_java_files.bp b/non_openjdk_java_files.bp
index 59a78e3..d7601bc 100755
--- a/non_openjdk_java_files.bp
+++ b/non_openjdk_java_files.bp
@@ -90,6 +90,7 @@
         "libart/src/main/java/java/lang/invoke/ByteArrayViewVarHandle.java",
         "libart/src/main/java/java/lang/invoke/ByteBufferViewVarHandle.java",
         "libart/src/main/java/java/lang/invoke/FieldVarHandle.java",
+        "libart/src/main/java/java/lang/invoke/StaticFieldVarHandle.java",
     ],
     path: "libart/src/main",
     visibility: ["//visibility:private"],
diff --git a/ojluni/src/main/java/java/lang/invoke/MethodHandles.java b/ojluni/src/main/java/java/lang/invoke/MethodHandles.java
index 1188ac6..2475f3a 100644
--- a/ojluni/src/main/java/java/lang/invoke/MethodHandles.java
+++ b/ojluni/src/main/java/java/lang/invoke/MethodHandles.java
@@ -1505,7 +1505,7 @@
             final boolean isStatic = true;
             final boolean performAccessChecks = true;
             commonFieldChecks(field, decl, type, isStatic, performAccessChecks);
-            return FieldVarHandle.create(field);
+            return StaticFieldVarHandle.create(field);
         }
         // END Android-changed: OpenJDK 9+181 VarHandle API factory method.
 
@@ -1828,7 +1828,7 @@
             final boolean isStatic = Modifier.isStatic(f.getModifiers());
             final boolean performAccessChecks = true;
             commonFieldChecks(f, f.getDeclaringClass(), f.getType(), isStatic, performAccessChecks);
-            return FieldVarHandle.create(f);
+            return isStatic ? StaticFieldVarHandle.create(f) : FieldVarHandle.create(f);
         }
         // END Android-changed: OpenJDK 9+181 VarHandle API factory method.