Chromium Code Reviews| Index: src/isolate.cc |
| diff --git a/src/isolate.cc b/src/isolate.cc |
| index e9a237b412c7434c5ac30313c4b4e81c8e1987f2..c60c161a7585cfccea72198ffa19647d04cfb8ab 100644 |
| --- a/src/isolate.cc |
| +++ b/src/isolate.cc |
| @@ -338,6 +338,20 @@ static bool IsVisibleInStackTrace(JSFunction* fun, |
| return true; |
| } |
| +static Handle<FixedArray> maybeGrow(Isolate* isolate, Handle<FixedArray> e, |
| + int cur_position, int new_size) { |
| + if (new_size > e->length()) { |
| + int new_capacity = JSObject::NewElementsCapacity(e->length()); |
| + Handle<FixedArray> new_e = |
|
titzer
2016/02/19 10:50:30
I guess it's ok to spell out new_elements here, si
JF
2016/02/19 16:53:58
Done.
|
| + isolate->factory()->NewFixedArrayWithHoles(new_capacity); |
| + for (int i = 0; i < cur_position; i++) { |
| + new_e->set(i, e->get(i)); |
| + } |
| + e = new_e; |
| + } |
| + DCHECK(new_size <= e->length()); |
| + return e; |
| +} |
| Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, |
| Handle<Object> caller) { |
| @@ -364,51 +378,64 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, |
| int frames_seen = 0; |
| int sloppy_frames = 0; |
| bool encountered_strict_function = false; |
| - for (JavaScriptFrameIterator iter(this); |
| - !iter.done() && frames_seen < limit; |
| + for (VisibleFrameIterator iter(this); !iter.done() && frames_seen < limit; |
| iter.Advance()) { |
| - JavaScriptFrame* frame = iter.frame(); |
| - // Set initial size to the maximum inlining level + 1 for the outermost |
| - // function. |
| - List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
| - frame->Summarize(&frames); |
| - for (int i = frames.length() - 1; i >= 0; i--) { |
| - Handle<JSFunction> fun = frames[i].function(); |
| - Handle<Object> recv = frames[i].receiver(); |
| - // Filter out internal frames that we do not want to show. |
| - if (!IsVisibleInStackTrace(*fun, *caller, *recv, &seen_caller)) continue; |
| - // Filter out frames from other security contexts. |
| - if (!this->context()->HasSameSecurityTokenAs(fun->context())) continue; |
| - if (cursor + 4 > elements->length()) { |
| - int new_capacity = JSObject::NewElementsCapacity(elements->length()); |
| - Handle<FixedArray> new_elements = |
| - factory()->NewFixedArrayWithHoles(new_capacity); |
| - for (int i = 0; i < cursor; i++) { |
| - new_elements->set(i, elements->get(i)); |
| - } |
| - elements = new_elements; |
| - } |
| - DCHECK(cursor + 4 <= elements->length()); |
| - |
| - Handle<AbstractCode> abstract_code = frames[i].abstract_code(); |
| - |
| - Handle<Smi> offset(Smi::FromInt(frames[i].code_offset()), this); |
| - // 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. |
| - if (!encountered_strict_function) { |
| - if (is_strict(fun->shared()->language_mode())) { |
| - encountered_strict_function = true; |
| - } else { |
| - sloppy_frames++; |
| + VisibleFrame* frame = iter.frame(); |
| + |
| + switch (frame->type()) { |
| + case StackFrame::JAVA_SCRIPT: |
| + case StackFrame::OPTIMIZED: |
| + case StackFrame::INTERPRETED: { |
| + // Set initial size to the maximum inlining level + 1 for the outermost |
| + // function. |
| + List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
| + frame->Summarize(&frames); |
| + for (int i = frames.length() - 1; i >= 0; i--) { |
| + Handle<JSFunction> fun = frames[i].function(); |
| + Handle<Object> recv = frames[i].receiver(); |
| + // Filter out internal frames that we do not want to show. |
| + if (!IsVisibleInStackTrace(*fun, *caller, *recv, &seen_caller)) |
| + continue; |
| + // Filter out frames from other security contexts. |
| + if (!this->context()->HasSameSecurityTokenAs(fun->context())) |
| + continue; |
| + elements = maybeGrow(this, elements, cursor, cursor + 4); |
| + |
| + Handle<AbstractCode> abstract_code = frames[i].abstract_code(); |
| + |
| + Handle<Smi> offset(Smi::FromInt(frames[i].code_offset()), this); |
| + // 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. |
| + if (!encountered_strict_function) { |
| + if (is_strict(fun->shared()->language_mode())) { |
| + encountered_strict_function = true; |
| + } else { |
| + sloppy_frames++; |
| + } |
| + } |
| + elements->set(cursor++, *recv); |
| + elements->set(cursor++, *fun); |
| + elements->set(cursor++, *abstract_code); |
| + elements->set(cursor++, *offset); |
| + frames_seen++; |
| } |
| - } |
| - elements->set(cursor++, *recv); |
| - elements->set(cursor++, *fun); |
| - elements->set(cursor++, *abstract_code); |
| - elements->set(cursor++, *offset); |
| - frames_seen++; |
| + } break; |
| + |
| + case StackFrame::WASM: { |
| + elements = maybeGrow(this, elements, cursor, cursor + 4); |
| + elements->set(cursor++, *caller); |
|
titzer
2016/02/19 10:50:30
I'm not sure it's OK to put in the caller as the r
JF
2016/02/19 16:53:58
I wasn't sure about that :-)
I left as-is for now,
titzer
2016/02/19 17:00:41
Please make it undefined; it will explode more rea
JF
2016/02/19 20:57:42
Ah I had misunderstood what you meant by "undefine
|
| + elements->set(cursor++, |
| + *factory()->NewFunction( |
| + factory()->NewStringFromAsciiChecked("<WASM>"))); |
| + elements->set(cursor++, Internals::IntToSmi(0)); |
| + elements->set(cursor++, Internals::IntToSmi(0)); |
| + frames_seen++; |
| + } break; |
| + |
| + default: |
| + DCHECK(false && "unknown frame type"); |
|
titzer
2016/02/19 10:50:30
We usually just use UNREACHABLE();
JF
2016/02/19 16:53:58
Done.
|
| } |
| } |
| elements->set(0, Smi::FromInt(sloppy_frames)); |