summaryrefslogtreecommitdiffstats
path: root/runtime/stack.h
diff options
context:
space:
mode:
authorHiroshi Yamauchi <yamauchi@google.com>2014-05-15 21:43:59 -0700
committerHiroshi Yamauchi <yamauchi@google.com>2014-05-16 13:37:45 -0700
commit92d1a666534aa98b173bb33dc5dba86b2d48aedb (patch)
tree864887bc5e1220152998874d3be861b31a49b0fa /runtime/stack.h
parent3b2bcbf9daf39f4cece7fde1186f3fa494000ed9 (diff)
downloadart-92d1a666534aa98b173bb33dc5dba86b2d48aedb.zip
art-92d1a666534aa98b173bb33dc5dba86b2d48aedb.tar.gz
art-92d1a666534aa98b173bb33dc5dba86b2d48aedb.tar.bz2
Visit methods in stack frames during root visits.
This is necessary for a Baker-style read barrier to-space invariant to hold. That is, an object either needs to be marked/forwarded as root or it must be accessed only through a read barrier by mutators. Since stack frames have direct pointers to methods that a mutator can access without a read barrier, stack frame methods have to be visited as root, which makes sense as stack frames are thread roots. This is the case even if methods do not move as they have to be marked 'gray' for the objects pointed to by them, which can move, to be recursively marked/forwarded. This also puts us in the right direction toward moving methods (and fields) in the future. Bug: 12687968 Change-Id: Id32b913c021a140073deea9149a8782e8f308303
Diffstat (limited to 'runtime/stack.h')
-rw-r--r--runtime/stack.h20
1 files changed, 15 insertions, 5 deletions
diff --git a/runtime/stack.h b/runtime/stack.h
index 963983a..2e32f51 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;
}