summaryrefslogtreecommitdiffstats
path: root/runtime/handle.h
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-05-22 16:48:55 -0700
committerMathieu Chartier <mathieuc@google.com>2014-05-23 12:55:45 -0700
commit0cd81352a7c06e381951cea1b104fd73516f4341 (patch)
treefcc8ff9cdeb608d0913097aa1fb64d1879f11ffa /runtime/handle.h
parentdfd301f19800a4f168283cf2d0b15b2c09071955 (diff)
downloadart-0cd81352a7c06e381951cea1b104fd73516f4341.zip
art-0cd81352a7c06e381951cea1b104fd73516f4341.tar.gz
art-0cd81352a7c06e381951cea1b104fd73516f4341.tar.bz2
Revert "Revert "Fix an outstanding compaction bug in interpreter.""
Fixed the generic trampoline to not use ToJObject when unnecessary. Bug: 15167269 This reverts commit 3bdb873122964da7937eb070cbcf2ef638a8e459. Change-Id: I0525d0e0f3afb753c770e1572070a0fa22b02271
Diffstat (limited to 'runtime/handle.h')
-rw-r--r--runtime/handle.h25
1 files changed, 22 insertions, 3 deletions
diff --git a/runtime/handle.h b/runtime/handle.h
index 3127864..b70f651 100644
--- a/runtime/handle.h
+++ b/runtime/handle.h
@@ -53,29 +53,48 @@ class Handle {
reference_->Assign(reference);
return old;
}
- jobject ToJObject() const ALWAYS_INLINE {
+ jobject ToJObject() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) ALWAYS_INLINE {
+ if (UNLIKELY(reference_->AsMirrorPtr() == nullptr)) {
+ // Special case so that we work with NullHandles.
+ return nullptr;
+ }
return reinterpret_cast<jobject>(reference_);
}
- private:
+ protected:
StackReference<T>* reference_;
template<typename S>
explicit Handle(StackReference<S>* reference)
: reference_(reinterpret_cast<StackReference<T>*>(reference)) {
}
-
template<typename S>
explicit Handle(const Handle<S>& handle)
: reference_(reinterpret_cast<StackReference<T>*>(handle.reference_)) {
}
+ StackReference<T>* GetReference() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) ALWAYS_INLINE {
+ return reference_;
+ }
+
+ private:
+ friend class BuildGenericJniFrameVisitor;
template<class S> friend class Handle;
friend class HandleScope;
template<class S> friend class HandleWrapper;
template<size_t kNumReferences> friend class StackHandleScope;
};
+template<class T>
+class NullHandle : public Handle<T> {
+ public:
+ NullHandle() : Handle<T>(&null_ref_) {
+ }
+
+ private:
+ StackReference<T> null_ref_;
+};
+
} // namespace art
#endif // ART_RUNTIME_HANDLE_H_