FrameIter & FrameIter::operator++() { switch (data_.state_) { case DONE: MOZ_ASSUME_UNREACHABLE("Unexpected state"); case INTERP: if (interpFrame()->isDebuggerFrame() && interpFrame()->evalInFramePrev()) { AbstractFramePtr eifPrev = interpFrame()->evalInFramePrev(); MOZ_ASSERT(!eifPrev.isRematerializedFrame()); // Eval-in-frame can cross contexts and works across saved frame // chains. ContextOption prevContextOption = data_.contextOption_; SavedOption prevSavedOption = data_.savedOption_; data_.contextOption_ = ALL_CONTEXTS; data_.savedOption_ = GO_THROUGH_SAVED; popInterpreterFrame(); while (isIon() || abstractFramePtr() != eifPrev) { if (data_.state_ == JIT) { #ifdef JS_ION popJitFrame(); #else MOZ_ASSUME_UNREACHABLE("Invalid state"); #endif } else { popInterpreterFrame(); } } data_.contextOption_ = prevContextOption; data_.savedOption_ = prevSavedOption; data_.cx_ = data_.activations_->cx(); break; } popInterpreterFrame(); break; #ifdef JS_ION case JIT: popJitFrame(); break; case ASMJS: popAsmJSFrame(); break; #else default: MOZ_ASSUME_UNREACHABLE("Unexpected state"); #endif } return *this; }