diff options
Diffstat (limited to 'runtime/handle.h')
-rw-r--r-- | runtime/handle.h | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/runtime/handle.h b/runtime/handle.h index 3127864e19..c4e92851e2 100644 --- a/runtime/handle.h +++ b/runtime/handle.h @@ -53,29 +53,43 @@ 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_)) { } + private: 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_ |