aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chiu <chiujason@google.com>2022-02-23 17:13:07 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-02-23 17:13:07 +0000
commitc750255d59976aa7c3611ef3d1ef8758ec8338cc (patch)
tree6722221b033b0cdcc873b0ae8f7b8c3c628d4ef1
parent16fa2e76325304fcdde1ccb3fb494ac5d1f69917 (diff)
parent556e6752660e89f63a3445f439659850232e547c (diff)
downloadrobolectric-shadows-c750255d59976aa7c3611ef3d1ef8758ec8338cc.tar.gz
Add an interceptor for Reference.refersTo() am: fefe490752 am: 556e675266
Original change: https://android-review.googlesource.com/c/platform/external/robolectric-shadows/+/1987867 Change-Id: Ib628482c33d96a94a3a1894fd974121316d70031
-rw-r--r--robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java31
1 files changed, 31 insertions, 0 deletions
diff --git a/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java b/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
index 51ea2a779..c009fb0ec 100644
--- a/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
+++ b/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
@@ -9,6 +9,9 @@ import android.content.Context;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Locale;
@@ -32,6 +35,7 @@ public class AndroidInterceptors {
new SystemArrayCopyInterceptor(),
new LocaleAdjustLanguageCodeInterceptor(),
new SystemLogInterceptor(),
+ new ReferenceRefersToInterceptor(),
new NoOpInterceptor()
);
}
@@ -238,6 +242,33 @@ public class AndroidInterceptors {
}
}
+ /** AndroidInterceptor for Reference.refersTo. */
+ public static class ReferenceRefersToInterceptor extends Interceptor {
+ private static final String METHOD = "refersTo";
+
+ public ReferenceRefersToInterceptor() {
+ super(
+ new MethodRef(WeakReference.class.getName(), METHOD),
+ new MethodRef(SoftReference.class.getName(), METHOD));
+ }
+
+ static boolean refersTo(Reference ref, Object obj) {
+ return ref.get() == obj;
+ }
+
+ @Override
+ public Function<Object, Object> handle(MethodSignature methodSignature) {
+ return (theClass, value, params) -> refersTo((Reference) value, params[0]);
+ }
+
+ @Override
+ public MethodHandle getMethodHandle(String methodName, MethodType type)
+ throws NoSuchMethodException, IllegalAccessException {
+ return lookup.findStatic(getClass(), METHOD,
+ methodType(boolean.class, Reference.class, Object.class));
+ }
+ }
+
public static class NoOpInterceptor extends Interceptor {
public NoOpInterceptor() {
super(