diff options
| -rw-r--r-- | runtime/stack.h | 20 | ||||
| -rw-r--r-- | runtime/thread.cc | 9 |
2 files changed, 22 insertions, 7 deletions
diff --git a/runtime/stack.h b/runtime/stack.h index 963983a7a6..2e32f51343 100644 --- a/runtime/stack.h +++ b/runtime/stack.h @@ -306,6 +306,11 @@ class ShadowFrame { return method_; } + mirror::ArtMethod** GetMethodAddress() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + DCHECK(method_ != nullptr); + return &method_; + } + mirror::Object* GetThisObject() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); mirror::Object* GetThisObject(uint16_t num_ins) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -389,12 +394,7 @@ class ShadowFrame { #endif // Link to previous shadow frame or NULL. ShadowFrame* link_; -#if defined(ART_USE_PORTABLE_COMPILER) - // TODO: make const in the portable case. mirror::ArtMethod* method_; -#else - mirror::ArtMethod* const method_; -#endif uint32_t dex_pc_; uint32_t vregs_[0]; @@ -518,6 +518,16 @@ class StackVisitor { } } + mirror::ArtMethod** GetMethodAddress() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + if (cur_shadow_frame_ != nullptr) { + return cur_shadow_frame_->GetMethodAddress(); + } else if (cur_quick_frame_ != nullptr) { + return cur_quick_frame_; + } else { + return nullptr; + } + } + bool IsShadowFrame() const { return cur_shadow_frame_ != nullptr; } diff --git a/runtime/thread.cc b/runtime/thread.cc index d535118485..085a8e7f37 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -1962,7 +1962,10 @@ class ReferenceMapVisitor : public StackVisitor { } void VisitShadowFrame(ShadowFrame* shadow_frame) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - mirror::ArtMethod* m = shadow_frame->GetMethod(); + mirror::ArtMethod** method_addr = shadow_frame->GetMethodAddress(); + visitor_(reinterpret_cast<mirror::Object**>(method_addr), 0 /*ignored*/, this); + mirror::ArtMethod* m = *method_addr; + DCHECK(m != nullptr); size_t num_regs = shadow_frame->NumberOfVRegs(); if (m->IsNative() || shadow_frame->HasReferenceArray()) { // handle scope for JNI or References for interpreter. @@ -2003,7 +2006,9 @@ class ReferenceMapVisitor : public StackVisitor { private: void VisitQuickFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - mirror::ArtMethod* m = GetMethod(); + mirror::ArtMethod** method_addr = GetMethodAddress(); + visitor_(reinterpret_cast<mirror::Object**>(method_addr), 0 /*ignored*/, this); + mirror::ArtMethod* m = *method_addr; // Process register map (which native and runtime methods don't have) if (!m->IsNative() && !m->IsRuntimeMethod() && !m->IsProxyMethod()) { const uint8_t* native_gc_map = m->GetNativeGcMap(); |