| Index: src/isolate.cc
|
| diff --git a/src/isolate.cc b/src/isolate.cc
|
| index 632ecdc50a32b569ba3224c9428a165ef10deccb..15a99dd2bf5f55569a0b9ab196bb4039ff43d009 100644
|
| --- a/src/isolate.cc
|
| +++ b/src/isolate.cc
|
| @@ -617,8 +617,11 @@ Handle<JSArray> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object,
|
| // If the caller parameter is a function we skip frames until we're
|
| // under it before starting to collect.
|
| bool seen_caller = !caller->IsJSFunction();
|
| - int cursor = 0;
|
| + // First element is reserved to store the number of non-strict frames.
|
| + int cursor = 1;
|
| int frames_seen = 0;
|
| + int non_strict_frames = 0;
|
| + bool encountered_strict_function = false;
|
| for (StackFrameIterator iter(this);
|
| !iter.done() && frames_seen < limit;
|
| iter.Advance()) {
|
| @@ -646,6 +649,17 @@ Handle<JSArray> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object,
|
| Handle<JSFunction> fun = frames[i].function();
|
| Handle<Code> code = frames[i].code();
|
| Handle<Smi> offset(Smi::FromInt(frames[i].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 non-strict frames is stored as
|
| + // first element in the result array.
|
| + if (!encountered_strict_function) {
|
| + if (!fun->shared()->is_classic_mode()) {
|
| + encountered_strict_function = true;
|
| + } else {
|
| + non_strict_frames++;
|
| + }
|
| + }
|
| elements->set(cursor++, *recv);
|
| elements->set(cursor++, *fun);
|
| elements->set(cursor++, *code);
|
| @@ -653,6 +667,7 @@ Handle<JSArray> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object,
|
| }
|
| }
|
| }
|
| + elements->set(0, Smi::FromInt(non_strict_frames));
|
| Handle<JSArray> result = factory()->NewJSArrayWithElements(elements);
|
| result->set_length(Smi::FromInt(cursor));
|
| return result;
|
|
|