diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-05-15 12:39:19 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-05-22 10:47:44 -0700 |
commit | e09ae0920be57760fb390b6944bce420fa0b5582 (patch) | |
tree | acc40266093df4289ffb6728c979cafd6b5114d2 /runtime/handle.h | |
parent | b8033db2a8dc6f7c7e29b1552177542964f56e44 (diff) | |
download | art-e09ae0920be57760fb390b6944bce420fa0b5582.zip art-e09ae0920be57760fb390b6944bce420fa0b5582.tar.gz art-e09ae0920be57760fb390b6944bce420fa0b5582.tar.bz2 |
Fix an outstanding compaction bug in interpreter.
Fixed a bug in DoFieldPut where the FieldHelper GetType could cause
thread suspension which would result in a stale obj.
Added more handles in the class linker to facilitate moving fiels
and methods in the future.
Removed un-necessarly passing handle references since these are value
types and don't need to be passed by reference.
Added a special NullHandle type which allows null handles without a
handle scope.
Change-Id: I1b51723920a2e4f4f8b2907066f578a3e879fd5b
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 3127864..c4e9285 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_ |