Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Unified Diff: src/isolate.cc

Issue 2274823002: Add flags to FrameArray (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@frame-array
Patch Set: Rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/messages.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/isolate.cc
diff --git a/src/isolate.cc b/src/isolate.cc
index 3a9b93a42d0645fd7edb6f582708fd8b8f2ad658..10835256ccc9d2e021de96cd5a9c8917c7f911ed 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -346,21 +346,17 @@ class StackTraceHelper {
break;
}
encountered_strict_function_ = false;
- sloppy_frames_ = 0;
}
+ // Poison stack frames below the first strict mode frame.
// 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());
}
+ return encountered_strict_function_;
}
// Determines whether the given stack frame should be displayed in a stack
@@ -370,8 +366,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 +411,6 @@ class StackTraceHelper {
const Handle<Object> caller_;
bool skip_next_frame_;
- int sloppy_frames_;
bool encountered_strict_function_;
};
@@ -475,23 +468,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 +498,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 +528,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 +537,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.
« no previous file with comments | « no previous file | src/messages.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698