From ee1ba6114921065ff4629cdaee207e2960dadd63 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Tue, 9 Sep 2014 13:48:19 -0700 Subject: Add Reference.getReferent for reference intrinsic. Reference intrinsic was incorrectly inlining PhantomReference.get(). We get around this by adding a layer of indirection. Reference.get() now calls getReferent() which is intrinsified and inlined. Bug: 17429865 Change-Id: I39803506c7bd800500ca3632a6cdf1077e382bff --- libart/src/main/java/java/lang/ref/Reference.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'libart') diff --git a/libart/src/main/java/java/lang/ref/Reference.java b/libart/src/main/java/java/lang/ref/Reference.java index 31ea588..70967b5 100644 --- a/libart/src/main/java/java/lang/ref/Reference.java +++ b/libart/src/main/java/java/lang/ref/Reference.java @@ -199,7 +199,19 @@ public abstract class Reference { * @return the referent to which reference refers, or {@code null} if the * object has been cleared. */ - public native T get(); + public T get() { + return getReferent(); + } + + /** + * Returns the referent of the reference object. + * + * @return the referent to which reference refers, or {@code null} if the + * object has been cleared. Required since the compiler + * intrisifies getReferent() since we can't intrinsify Reference.get() + * due to incorrect devirtualization (and inlining) of PhantomReference.get(). + */ + private final native T getReferent(); /** * Checks whether the reference object has been enqueued. -- cgit v1.1