diff options
author | Jason Chiu <chiujason@google.com> | 2022-02-10 16:53:52 +0800 |
---|---|---|
committer | Jason Chiu <chiujason@google.com> | 2022-02-17 13:48:53 +0800 |
commit | fefe490752e28c937da21145cebc62a8b6b181b9 (patch) | |
tree | 0102b497b25b08c3d476d60af5c6e44866174fd9 | |
parent | bcb2f16fcad321d4e6dafd60e18ef67af4a41988 (diff) | |
download | robolectric-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.java | 31 |
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( |