Add VarHandle#toString and Reference#clone methods. These are not new methods and their behaviour does not change. Bug: 270698072 Test: m Change-Id: I68c2ad3cbe5638ed762171ea12f97a21f121c0fe
diff --git a/api/current.txt b/api/current.txt index d53de4e..9b43f12 100644 --- a/api/current.txt +++ b/api/current.txt
@@ -4789,6 +4789,7 @@ method public final native void setVolatile(java.lang.Object...); method public static void storeStoreFence(); method public final java.lang.invoke.MethodHandle toMethodHandle(java.lang.invoke.VarHandle.AccessMode); + method @FlaggedApi("com.android.libcore.v_apis") public final String toString(); method public final Class<?> varType(); method public final native boolean weakCompareAndSet(java.lang.Object...); method public final native boolean weakCompareAndSetAcquire(java.lang.Object...);
diff --git a/luni/src/test/java/libcore/java/lang/invoke/VarHandleTest.java b/luni/src/test/java/libcore/java/lang/invoke/VarHandleTest.java index ffd6df3..34576db 100644 --- a/luni/src/test/java/libcore/java/lang/invoke/VarHandleTest.java +++ b/luni/src/test/java/libcore/java/lang/invoke/VarHandleTest.java
@@ -16,14 +16,21 @@ package libcore.java.lang.invoke; -import java.lang.invoke.VarHandle; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + @RunWith(JUnit4.class) public class VarHandleTest { + + private int field = 0; + @Test public void fences() { // In theory, these should log coverage for these fences, but they are implemented @@ -34,4 +41,18 @@ VarHandle.loadLoadFence(); VarHandle.storeStoreFence(); } + + @Test + public void toString_describes_variable_and_its_coordinates_plain_field() throws Throwable { + VarHandle vh = MethodHandles.lookup().findVarHandle( + VarHandleTest.class, "field", int.class); + + String str = vh.toString(); + + // Type of field is int. + assertTrue(str + " does not mention int", str.contains("int")); + assertTrue(str + " does not mention VarHandleTest", str.contains("VarHandleTest")); + // Just to make errorprone happy. + assertEquals(0, field); + } }
diff --git a/ojluni/annotations/flagged_api/java/lang/invoke/VarHandle.annotated.java b/ojluni/annotations/flagged_api/java/lang/invoke/VarHandle.annotated.java new file mode 100644 index 0000000..c187643 --- /dev/null +++ b/ojluni/annotations/flagged_api/java/lang/invoke/VarHandle.annotated.java
@@ -0,0 +1,158 @@ +/* + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package java.lang.invoke; + +@SuppressWarnings({"unchecked", "deprecation", "all"}) +public abstract class VarHandle { + +VarHandle() { throw new RuntimeException("Stub!"); } + +public final native java.lang.Object get(java.lang.Object... args); + +public final native void set(java.lang.Object... args); + +public final native java.lang.Object getVolatile(java.lang.Object... args); + +public final native void setVolatile(java.lang.Object... args); + +public final native java.lang.Object getOpaque(java.lang.Object... args); + +public final native void setOpaque(java.lang.Object... args); + +public final native java.lang.Object getAcquire(java.lang.Object... args); + +public final native void setRelease(java.lang.Object... args); + +public final native boolean compareAndSet(java.lang.Object... args); + +public final native java.lang.Object compareAndExchange(java.lang.Object... args); + +public final native java.lang.Object compareAndExchangeAcquire(java.lang.Object... args); + +public final native java.lang.Object compareAndExchangeRelease(java.lang.Object... args); + +public final native boolean weakCompareAndSetPlain(java.lang.Object... args); + +public final native boolean weakCompareAndSet(java.lang.Object... args); + +public final native boolean weakCompareAndSetAcquire(java.lang.Object... args); + +public final native boolean weakCompareAndSetRelease(java.lang.Object... args); + +public final native java.lang.Object getAndSet(java.lang.Object... args); + +public final native java.lang.Object getAndSetAcquire(java.lang.Object... args); + +public final native java.lang.Object getAndSetRelease(java.lang.Object... args); + +public final native java.lang.Object getAndAdd(java.lang.Object... args); + +public final native java.lang.Object getAndAddAcquire(java.lang.Object... args); + +public final native java.lang.Object getAndAddRelease(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseOr(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseOrAcquire(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseOrRelease(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseAnd(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseAndAcquire(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseAndRelease(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseXor(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseXorAcquire(java.lang.Object... args); + +public final native java.lang.Object getAndBitwiseXorRelease(java.lang.Object... args); + +@android.annotation.FlaggedApi(com.android.libcore.Flags.FLAG_V_APIS) +public final java.lang.String toString() { throw new RuntimeException("Stub!"); } + +public final java.lang.Class<?> varType() { throw new RuntimeException("Stub!"); } + +public final java.util.List<java.lang.Class<?>> coordinateTypes() { throw new RuntimeException("Stub!"); } + +public final java.lang.invoke.MethodType accessModeType(java.lang.invoke.VarHandle.AccessMode accessMode) { throw new RuntimeException("Stub!"); } + +public final boolean isAccessModeSupported(java.lang.invoke.VarHandle.AccessMode accessMode) { throw new RuntimeException("Stub!"); } + +public final java.lang.invoke.MethodHandle toMethodHandle(java.lang.invoke.VarHandle.AccessMode accessMode) { throw new RuntimeException("Stub!"); } + +public static void fullFence() { throw new RuntimeException("Stub!"); } + +public static void acquireFence() { throw new RuntimeException("Stub!"); } + +public static void releaseFence() { throw new RuntimeException("Stub!"); } + +public static void loadLoadFence() { throw new RuntimeException("Stub!"); } + +public static void storeStoreFence() { throw new RuntimeException("Stub!"); } +@SuppressWarnings({"unchecked", "deprecation", "all"}) +public enum AccessMode { +GET, +SET, +GET_VOLATILE, +SET_VOLATILE, +GET_ACQUIRE, +SET_RELEASE, +GET_OPAQUE, +SET_OPAQUE, +COMPARE_AND_SET, +COMPARE_AND_EXCHANGE, +COMPARE_AND_EXCHANGE_ACQUIRE, +COMPARE_AND_EXCHANGE_RELEASE, +WEAK_COMPARE_AND_SET_PLAIN, +WEAK_COMPARE_AND_SET, +WEAK_COMPARE_AND_SET_ACQUIRE, +WEAK_COMPARE_AND_SET_RELEASE, +GET_AND_SET, +GET_AND_SET_ACQUIRE, +GET_AND_SET_RELEASE, +GET_AND_ADD, +GET_AND_ADD_ACQUIRE, +GET_AND_ADD_RELEASE, +GET_AND_BITWISE_OR, +GET_AND_BITWISE_OR_RELEASE, +GET_AND_BITWISE_OR_ACQUIRE, +GET_AND_BITWISE_AND, +GET_AND_BITWISE_AND_RELEASE, +GET_AND_BITWISE_AND_ACQUIRE, +GET_AND_BITWISE_XOR, +GET_AND_BITWISE_XOR_RELEASE, +GET_AND_BITWISE_XOR_ACQUIRE; + +public java.lang.String methodName() { throw new RuntimeException("Stub!"); } + +public static java.lang.invoke.VarHandle.AccessMode valueFromMethodName(java.lang.String methodName) { throw new RuntimeException("Stub!"); } +} + +} +
diff --git a/ojluni/src/main/java/java/lang/invoke/VarHandle.java b/ojluni/src/main/java/java/lang/invoke/VarHandle.java index e11d617..9bd81b4 100644 --- a/ojluni/src/main/java/java/lang/invoke/VarHandle.java +++ b/ojluni/src/main/java/java/lang/invoke/VarHandle.java
@@ -1885,6 +1885,19 @@ // END Android-removed: AccessDescriptor not used in Android implementation. /** + * Returns a compact textual description of this {@linkplain VarHandle}, + * including the type of variable described, and a description of its coordinates. + * + * @return A compact textual description of this {@linkplain VarHandle} + */ + @Override + public final String toString() { + return String.format("VarHandle[varType=%s, coord=%s]", + varType().getName(), + coordinateTypes()); + } + + /** * Returns the variable type of variables referenced by this VarHandle. * * @return the variable type of variables referenced by this VarHandle
diff --git a/ojluni/src/main/java/java/lang/ref/Reference.java b/ojluni/src/main/java/java/lang/ref/Reference.java index cfbb620..aa5b7c4 100644 --- a/ojluni/src/main/java/java/lang/ref/Reference.java +++ b/ojluni/src/main/java/java/lang/ref/Reference.java
@@ -204,6 +204,20 @@ return queue != null && queue.enqueue(this); } + /** + * Throws {@link CloneNotSupportedException}. A {@code Reference} cannot be + * meaningfully cloned. Construct a new {@code Reference} instead. + * + * @return never returns normally + * @throws CloneNotSupportedException always + * + * @since 11 + */ + @Override + protected Object clone() throws CloneNotSupportedException { + throw new CloneNotSupportedException(); + } + /* -- Constructors -- */ Reference(T referent) {