aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chiu <chiujason@google.com>2022-02-10 16:53:52 +0800
committerJason Chiu <chiujason@google.com>2022-02-17 13:48:53 +0800
commitfefe490752e28c937da21145cebc62a8b6b181b9 (patch)
tree0102b497b25b08c3d476d60af5c6e44866174fd9
parentbcb2f16fcad321d4e6dafd60e18ef67af4a41988 (diff)
downloadrobolectric-shadows-fefe490752e28c937da21145cebc62a8b6b181b9.tar.gz
Add an interceptor for Reference.refersTo()
The method Reference.refersTo() was added since JDK 16, however, robolectric is running with a lower version. This fix adds an AndroidInterceptor for the method and implements it. Test: Run settings robotests Fix: 217717056 Merged-In: Id5888a81eccb45c634b61fa4269415f176af9eff Change-Id: I222e4c9a815c7386174d76c40fb16685c316196b
-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(