Skip to content

Commit

Permalink
[VM runtime] Fix gc traversal of interpreted entry frame.
Browse files Browse the repository at this point in the history
Change-Id: I9cb5e217bef49c882b6826db2f17b03a77adc345
Reviewed-on: https://dart-review.googlesource.com/70165
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
  • Loading branch information
crelier authored and commit-bot@chromium.org committed Aug 16, 2018
1 parent 90440ad commit b76749d
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions runtime/vm/stack_frame.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,15 @@ const char* StackFrame::ToCString() const {
}

void ExitFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
// Visit pc marker and saved pool pointer.
RawObject** last_fixed =
reinterpret_cast<RawObject**>(fp()) + kFirstObjectSlotFromFp;
RawObject** first_fixed =
reinterpret_cast<RawObject**>(fp()) + kLastFixedObjectSlotFromFp;
ASSERT(visitor != NULL);
// Visit pc marker and saved pool pointer, or, for interpreted frame, code
// object and function object.
RawObject** last_fixed = reinterpret_cast<RawObject**>(fp()) +
(is_interpreted() ? kKBCLastFixedObjectSlotFromFp
: kFirstObjectSlotFromFp);
RawObject** first_fixed = reinterpret_cast<RawObject**>(fp()) +
(is_interpreted() ? kKBCFirstObjectSlotFromFp
: kLastFixedObjectSlotFromFp);
#if !defined(TARGET_ARCH_DBC)
ASSERT(first_fixed <= last_fixed);
visitor->VisitPointers(first_fixed, last_fixed);
Expand All @@ -107,17 +111,22 @@ void ExitFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
}

void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
// Visit objects between SP and (FP - callee_save_area).
ASSERT(visitor != NULL);
// Visit objects between SP and (FP - callee_save_area).
#if !defined(TARGET_ARCH_DBC)
RawObject** first = reinterpret_cast<RawObject**>(sp());
RawObject** last = reinterpret_cast<RawObject**>(
fp() + (kExitLinkSlotFromEntryFp - 1) * kWordSize);
RawObject** first = is_interpreted() ? reinterpret_cast<RawObject**>(fp()) +
kKBCSavedArgDescSlotFromEntryFp
: reinterpret_cast<RawObject**>(sp());
RawObject** last = is_interpreted() ? reinterpret_cast<RawObject**>(sp())
: reinterpret_cast<RawObject**>(fp()) +
kExitLinkSlotFromEntryFp - 1;
// There may not be any pointer to visit; in this case, first > last.
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());
ASSERT(first <= last);
visitor->VisitPointers(first, last);
#endif
}
Expand Down

0 comments on commit b76749d

Please sign in to comment.