Index: runtime/vm/stack_frame.cc |
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc |
index ebfe69ef7a39f9ecfccec78c91a2b7598bfc0eab..aac196b171d3fe197c0b02e68bf0f820d74aa89c 100644 |
--- a/runtime/vm/stack_frame.cc |
+++ b/runtime/vm/stack_frame.cc |
@@ -69,6 +69,7 @@ void ExitFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
+#if !defined(TARGET_ARCH_DBC) |
ASSERT(thread() == Thread::Current()); |
// Visit objects between SP and (FP - callee_save_area). |
ASSERT(visitor != NULL); |
@@ -76,10 +77,17 @@ void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
RawObject** last = reinterpret_cast<RawObject**>( |
fp() + (kExitLinkSlotFromEntryFp - 1) * kWordSize); |
visitor->VisitPointers(first, last); |
+#else |
+ // On DBC stack is growing upwards which implies fp() <= sp(). |
+ RawObject** first = reinterpret_cast<RawObject**>(fp()); |
+ RawObject** last = reinterpret_cast<RawObject**>(sp()); |
+ visitor->VisitPointers(first, last); |
+#endif |
} |
void StackFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
+#if !defined(TARGET_ARCH_DBC) |
// NOTE: This code runs while GC is in progress and runs within |
// a NoHandleScope block. Hence it is not ok to use regular Zone or |
// Scope handles. We use direct stack handles, the raw pointers in |
@@ -159,6 +167,13 @@ void StackFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
RawObject** last = reinterpret_cast<RawObject**>( |
fp() + (kFirstObjectSlotFromFp * kWordSize)); |
visitor->VisitPointers(first, last); |
+#else |
+ // On DBC stack grows upwards: fp() <= sp(). |
+ RawObject** first = reinterpret_cast<RawObject**>( |
+ fp() + (kFirstObjectSlotFromFp * kWordSize)); |
+ RawObject** last = reinterpret_cast<RawObject**>(sp()); |
+ visitor->VisitPointers(first, last); |
+#endif // !defined(TARGET_ARCH_DBC) |
} |
@@ -319,6 +334,7 @@ StackFrameIterator::StackFrameIterator(uword last_fp, bool validate, |
} |
+#if !defined(TARGET_ARCH_DBC) |
StackFrameIterator::StackFrameIterator(uword fp, uword sp, uword pc, |
bool validate, Thread* thread) |
: validate_(validate), |
@@ -333,6 +349,7 @@ StackFrameIterator::StackFrameIterator(uword fp, uword sp, uword pc, |
frames_.sp_ = sp; |
frames_.pc_ = pc; |
} |
+#endif |
StackFrame* StackFrameIterator::NextFrame() { |
@@ -353,6 +370,7 @@ StackFrame* StackFrameIterator::NextFrame() { |
return NULL; |
} |
UnpoisonStack(frames_.fp_); |
+#if !defined(TARGET_ARCH_DBC) |
if (frames_.pc_ == 0) { |
// Iteration starts from an exit frame given by its fp. |
current_frame_ = NextExitFrame(); |
@@ -364,6 +382,12 @@ StackFrame* StackFrameIterator::NextFrame() { |
// Iteration starts from a Dart or stub frame given by its fp, sp, and pc. |
current_frame_ = frames_.NextFrame(validate_); |
} |
+#else |
+ // Iteration starts from an exit frame given by its fp. This is the only |
+ // mode supported on DBC. |
+ ASSERT(frames_.pc_ == 0); |
+ current_frame_ = NextExitFrame(); |
+#endif // !defined(TARGET_ARCH_DBC) |
return current_frame_; |
} |
ASSERT((validate_ == kDontValidateFrames) || current_frame_->IsValid()); |