void ContextStack::popFrame(const FrameGuard &fg) { JS_ASSERT(fg.pushed()); JS_ASSERT(onTop()); JS_ASSERT(space().firstUnused() == fg.regs_.sp); JS_ASSERT(&fg.regs_ == &seg_->regs()); Value *oldend = seg_->end(); seg_->popRegs(fg.prevRegs_); if (fg.pushedSeg_) popSegment(); Debug_SetValueRangeToCrashOnTouch(space().firstUnused(), oldend); }
void ContextStack::popFrame(const FrameGuard &fg) { JS_ASSERT(fg.pushed()); JS_ASSERT(onTop()); JS_ASSERT(space().firstUnused() == fg.regs_.sp); JS_ASSERT(&fg.regs_ == &seg_->regs()); if (fg.regs_.fp()->isNonEvalFunctionFrame()) fg.regs_.fp()->functionEpilogue(); seg_->popRegs(fg.prevRegs_); if (fg.pushedSeg_) popSegment(); /* * NB: this code can call out and observe the stack (e.g., through GC), so * it should only be called from a consistent stack state. */ if (!hasfp()) cx_->resetCompartment(); }
void ContextStack::popFrame(const FrameGuard &fg) { JS_ASSERT(fg.pushed()); JS_ASSERT(onTop()); JS_ASSERT(space().firstUnused() == fg.regs_.sp); JS_ASSERT(&fg.regs_ == &seg_->regs()); Value *oldend = seg_->end(); seg_->popRegs(fg.prevRegs_); if (fg.pushedSeg_) popSegment(); Debug_SetValueRangeToCrashOnTouch(space().firstUnused(), oldend); /* * NB: this code can call out and observe the stack (e.g., through GC), so * it should only be called from a consistent stack state. */ if (!hasfp()) cx_->resetCompartment(); }