Chromium Code Reviews| Index: src/isolate.cc |
| diff --git a/src/isolate.cc b/src/isolate.cc |
| index 3a9b93a42d0645fd7edb6f582708fd8b8f2ad658..502ee7f28426ac70ebd76e0396a64642939571da 100644 |
| --- a/src/isolate.cc |
| +++ b/src/isolate.cc |
| @@ -346,21 +346,16 @@ class StackTraceHelper { |
| break; |
| } |
| encountered_strict_function_ = false; |
| - sloppy_frames_ = 0; |
| } |
| // The stack trace API should not expose receivers and function |
| // objects on frames deeper than the top-most one with a strict mode |
| - // function. The number of sloppy frames is stored as first element in |
| - // the result array. |
| - void CountSloppyFrames(JSFunction* fun) { |
| + // function. |
| + bool IsStrictFrame(JSFunction* fun) { |
| if (!encountered_strict_function_) { |
| - if (is_strict(fun->shared()->language_mode())) { |
| - encountered_strict_function_ = true; |
| - } else { |
| - sloppy_frames_++; |
| - } |
| + encountered_strict_function_ = is_strict(fun->shared()->language_mode()); |
|
Toon Verwaest
2016/08/24 14:36:39
this should just be return fun->shared()->language
jgruber
2016/08/24 15:12:19
That behavior goes back to https://chromiumcoderev
|
| } |
| + return encountered_strict_function_; |
| } |
| // Determines whether the given stack frame should be displayed in a stack |
| @@ -370,8 +365,6 @@ class StackTraceHelper { |
| IsInSameSecurityContext(fun); |
| } |
| - int sloppy_frames() const { return sloppy_frames_; } |
| - |
| private: |
| // This mechanism excludes a number of uninteresting frames from the stack |
| // trace. This can be be the first frame (which will be a builtin-exit frame |
| @@ -417,7 +410,6 @@ class StackTraceHelper { |
| const Handle<Object> caller_; |
| bool skip_next_frame_; |
| - int sloppy_frames_; |
| bool encountered_strict_function_; |
| }; |
| @@ -475,23 +467,27 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object, |
| // Filter out internal frames that we do not want to show. |
| if (!helper.IsVisibleInStackTrace(*fun)) continue; |
| - helper.CountSloppyFrames(*fun); |
| Handle<Object> recv = frames[i].receiver(); |
| Handle<AbstractCode> abstract_code = frames[i].abstract_code(); |
| + const int offset = frames[i].code_offset(); |
| + |
| + bool force_constructor = false; |
| if (frame->type() == StackFrame::BUILTIN) { |
| // Help CallSite::IsConstructor correctly detect hand-written |
| // construct stubs. |
| - Code* code = Code::cast(*abstract_code); |
| - if (code->is_construct_stub()) { |
| - recv = handle(heap()->call_site_constructor_symbol(), this); |
| + if (Code::cast(*abstract_code)->is_construct_stub()) { |
| + force_constructor = true; |
| } |
| } |
| - const int offset = frames[i].code_offset(); |
| - elements = FrameArray::AppendJSFrame(elements, |
| - TheHoleToUndefined(this, recv), |
| - fun, abstract_code, offset); |
| + int flags = 0; |
| + if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; |
| + if (force_constructor) flags |= FrameArray::kForceConstructor; |
| + |
| + elements = FrameArray::AppendJSFrame( |
| + elements, TheHoleToUndefined(this, recv), fun, abstract_code, |
| + offset, flags); |
| } |
| } break; |
| @@ -501,32 +497,27 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object, |
| // Filter out internal frames that we do not want to show. |
| if (!helper.IsVisibleInStackTrace(*fun)) continue; |
| - helper.CountSloppyFrames(*fun); |
| - Handle<Code> code = handle(exit_frame->LookupCode(), this); |
| + Handle<Object> recv(exit_frame->receiver(), this); |
| + Handle<Code> code(exit_frame->LookupCode(), this); |
| int offset = |
| static_cast<int>(exit_frame->pc() - code->instruction_start()); |
| - // In order to help CallSite::IsConstructor detect builtin constructors, |
| - // we reuse the receiver field to pass along a special symbol. |
| - Handle<Object> recv; |
| - if (exit_frame->IsConstructor()) { |
| - recv = factory()->call_site_constructor_symbol(); |
| - } else { |
| - recv = handle(exit_frame->receiver(), this); |
| - } |
| + int flags = 0; |
| + if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; |
| + if (exit_frame->IsConstructor()) flags |= FrameArray::kForceConstructor; |
| - elements = FrameArray::AppendJSFrame( |
| - elements, recv, fun, Handle<AbstractCode>::cast(code), offset); |
| + elements = FrameArray::AppendJSFrame(elements, recv, fun, |
| + Handle<AbstractCode>::cast(code), |
| + offset, flags); |
| } break; |
| case StackFrame::WASM: { |
| WasmFrame* wasm_frame = WasmFrame::cast(frame); |
| - Handle<Object> wasm_object = handle(wasm_frame->wasm_obj(), this); |
| + Handle<Object> wasm_object(wasm_frame->wasm_obj(), this); |
| const int wasm_function_index = wasm_frame->function_index(); |
| Code* code = wasm_frame->unchecked_code(); |
| - Handle<AbstractCode> abstract_code = |
| - Handle<AbstractCode>(AbstractCode::cast(code), this); |
| + Handle<AbstractCode> abstract_code(AbstractCode::cast(code), this); |
| const int offset = |
| static_cast<int>(wasm_frame->pc() - code->instruction_start()); |
| @@ -536,7 +527,8 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object, |
| wasm_object->IsUndefined(this)); |
| elements = FrameArray::AppendWasmFrame( |
| - elements, wasm_object, wasm_function_index, abstract_code, offset); |
| + elements, wasm_object, wasm_function_index, abstract_code, offset, |
| + FrameArray::kIsWasmFrame); |
| } break; |
| default: |
| @@ -544,7 +536,6 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object, |
| } |
| } |
| - elements->SetSloppyFrameCount(helper.sloppy_frames()); |
| elements->ShrinkToFit(); |
| // TODO(yangguo): Queue this structured stack trace for preprocessing on GC. |