[ VM ] Don't check if an interpreted frame is marked for lazy deopt

Checking if an interpreted frame is marked for lazy deopt while
preparing to handle an exception was causing an assert to be hit. We
can skip this check for interpreted frames.

Fixes https://github.com/dart-lang/sdk/issues/38003.

Change-Id: Icea65868c6291864df93920fa25236bcc36fded5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115268
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
This commit is contained in:
Ben Konyi 2019-09-04 00:09:27 +00:00 committed by commit-bot@chromium.org
parent 8e63413fff
commit 1dfba01a3e
2 changed files with 8 additions and 4 deletions

View file

@ -515,12 +515,16 @@ static void ClearLazyDeopts(Thread* thread, uword frame_pointer) {
{
DartFrameIterator frames(thread,
StackFrameIterator::kNoCrossThreadIteration);
StackFrame* frame = frames.NextFrame();
while ((frame != NULL) && (frame->fp() < frame_pointer)) {
for (StackFrame* frame = frames.NextFrame(); frame != nullptr;
frame = frames.NextFrame()) {
if (frame->is_interpreted()) {
continue;
} else if (frame->fp() >= frame_pointer) {
break;
}
if (frame->IsMarkedForLazyDeopt()) {
frame->UnmarkForLazyDeopt();
}
frame = frames.NextFrame();
}
}

View file

@ -56,7 +56,7 @@ class StackFrame : public ValueObject {
return 0;
}
uword IsMarkedForLazyDeopt() const {
bool IsMarkedForLazyDeopt() const {
ASSERT(!is_interpreted());
uword raw_pc =
*reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));