diff options
author | Jason Chiu <chiujason@google.com> | 2022-02-23 17:13:07 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-02-23 17:13:07 +0000 |
commit | c750255d59976aa7c3611ef3d1ef8758ec8338cc (patch) | |
tree | 6722221b033b0cdcc873b0ae8f7b8c3c628d4ef1 | |
parent | 16fa2e76325304fcdde1ccb3fb494ac5d1f69917 (diff) | |
parent | 556e6752660e89f63a3445f439659850232e547c (diff) | |
download | robolectric-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.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( |