summaryrefslogtreecommitdiffstats
path: root/libart
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-09-09 13:48:19 -0700
committerMathieu Chartier <mathieuc@google.com>2014-09-09 13:48:19 -0700
commitee1ba6114921065ff4629cdaee207e2960dadd63 (patch)
tree8b9971b5d100a73dac388967e3166930fbaa2784 /libart
parent2ead7d19c4fe15fbe4dff32866204de6d4c9835c (diff)
downloadlibcore-ee1ba6114921065ff4629cdaee207e2960dadd63.zip
libcore-ee1ba6114921065ff4629cdaee207e2960dadd63.tar.gz
libcore-ee1ba6114921065ff4629cdaee207e2960dadd63.tar.bz2
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
Diffstat (limited to 'libart')
-rw-r--r--libart/src/main/java/java/lang/ref/Reference.java14
1 files changed, 13 insertions, 1 deletions
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<T> {
* @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.