Bug 1134198 - Don't call Debugger::slowPathOnLeaveFrame on frames no longer in Debugger frame maps. (r=jimb)

This commit is contained in:
Shu-yu Guo 2015-04-02 17:28:02 -07:00
Родитель 086b9abe47
Коммит 94ccbb0332
1 изменённых файлов: 9 добавлений и 2 удалений

Просмотреть файл

@ -606,6 +606,13 @@ Debugger::slowPathOnLeaveFrame(JSContext* cx, AbstractFramePtr frame, bool frame
{ {
Handle<GlobalObject*> global = cx->global(); Handle<GlobalObject*> global = cx->global();
// The onPop handler and associated clean up logic should not run multiple
// times on the same frame. If slowPathOnLeaveFrame has already been
// called, the frame will not be present in the Debugger frame maps.
FrameRange frameRange(frame, global);
if (frameRange.empty())
return frameOk;
/* Save the frame's completion value. */ /* Save the frame's completion value. */
JSTrapStatus status; JSTrapStatus status;
RootedValue value(cx); RootedValue value(cx);
@ -618,8 +625,8 @@ Debugger::slowPathOnLeaveFrame(JSContext* cx, AbstractFramePtr frame, bool frame
if (!cx->isThrowingOverRecursed() && !cx->isThrowingOutOfMemory()) { if (!cx->isThrowingOverRecursed() && !cx->isThrowingOutOfMemory()) {
/* Build a list of the recipients. */ /* Build a list of the recipients. */
AutoObjectVector frames(cx); AutoObjectVector frames(cx);
for (FrameRange r(frame, global); !r.empty(); r.popFront()) { for (; !frameRange.empty(); frameRange.popFront()) {
if (!frames.append(r.frontFrame())) { if (!frames.append(frameRange.frontFrame())) {
cx->clearPendingException(); cx->clearPendingException();
return false; return false;
} }