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

Unified Diff: src/isolate.cc

Issue 2619353006: Refactor FrameSummary for JS and Wasm frames (Closed)
Patch Set: Address comment Created 3 years, 11 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 | « src/frames-inl.h ('k') | src/list.h » ('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 f620897922f3088458139ddcd5e7acaad22644d0..f4a6a0a14510cb0e4af6a78976c084d1294b1f7f 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -461,13 +461,14 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object,
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
js_frame->Summarize(&frames);
for (int i = frames.length() - 1; i >= 0; i--) {
- Handle<JSFunction> fun = frames[i].function();
+ const auto& summ = frames[i].AsJavaScript();
+ Handle<JSFunction> fun = summ.function();
// Filter out internal frames that we do not want to show.
if (!helper.IsVisibleInStackTrace(*fun)) continue;
Handle<Object> recv = frames[i].receiver();
- Handle<AbstractCode> abstract_code = frames[i].abstract_code();
+ Handle<AbstractCode> abstract_code = summ.abstract_code();
const int offset = frames[i].code_offset();
bool force_constructor = false;
@@ -627,21 +628,22 @@ class CaptureStackTraceHelper {
}
Handle<JSObject> NewStackFrameObject(FrameSummary& summ) {
- int position = summ.abstract_code()->SourcePosition(summ.code_offset());
- return NewStackFrameObject(summ.function(), position,
- summ.is_constructor());
+ if (summ.IsJavaScript()) return NewStackFrameObject(summ.AsJavaScript());
+ if (summ.IsWasm()) return NewStackFrameObject(summ.AsWasm());
+ UNREACHABLE();
+ return Handle<JSObject>::null();
}
- Handle<JSObject> NewStackFrameObject(Handle<JSFunction> fun, int position,
- bool is_constructor) {
+ Handle<JSObject> NewStackFrameObject(
+ const FrameSummary::JavaScriptFrameSummary& summ) {
Handle<JSObject> stack_frame =
factory()->NewJSObject(isolate_->object_function());
- Handle<Script> script(Script::cast(fun->shared()->script()), isolate_);
+ Handle<Script> script = Handle<Script>::cast(summ.script());
if (!line_key_.is_null()) {
Script::PositionInfo info;
- bool valid_pos =
- Script::GetPositionInfo(script, position, &info, Script::WITH_OFFSET);
+ bool valid_pos = Script::GetPositionInfo(script, summ.SourcePosition(),
+ &info, Script::WITH_OFFSET);
if (!column_key_.is_null() && valid_pos) {
JSObject::AddProperty(stack_frame, column_key_,
@@ -676,12 +678,13 @@ class CaptureStackTraceHelper {
}
if (!function_key_.is_null()) {
- Handle<Object> fun_name = JSFunction::GetDebugName(fun);
+ Handle<String> fun_name = summ.FunctionName();
JSObject::AddProperty(stack_frame, function_key_, fun_name, NONE);
}
if (!constructor_key_.is_null()) {
- Handle<Object> is_constructor_obj = factory()->ToBoolean(is_constructor);
+ Handle<Object> is_constructor_obj =
+ factory()->ToBoolean(summ.is_constructor());
JSObject::AddProperty(stack_frame, constructor_key_, is_constructor_obj,
NONE);
}
@@ -703,29 +706,28 @@ class CaptureStackTraceHelper {
return stack_frame;
}
- Handle<JSObject> NewStackFrameObject(WasmCompiledFrame* frame) {
+ Handle<JSObject> NewStackFrameObject(
+ const FrameSummary::WasmFrameSummary& summ) {
Handle<JSObject> stack_frame =
factory()->NewJSObject(isolate_->object_function());
if (!function_key_.is_null()) {
Handle<WasmCompiledModule> compiled_module(
- frame->wasm_instance()->compiled_module(), isolate_);
+ summ.wasm_instance()->compiled_module(), isolate_);
Handle<String> name = WasmCompiledModule::GetFunctionName(
- isolate_, compiled_module, frame->function_index());
+ isolate_, compiled_module, summ.function_index());
JSObject::AddProperty(stack_frame, function_key_, name, NONE);
}
// Encode the function index as line number (1-based).
if (!line_key_.is_null()) {
JSObject::AddProperty(
stack_frame, line_key_,
- isolate_->factory()->NewNumberFromInt(frame->function_index() + 1),
+ isolate_->factory()->NewNumberFromInt(summ.function_index() + 1),
NONE);
}
// Encode the byte offset as column (1-based).
if (!column_key_.is_null()) {
- Code* code = frame->LookupCode();
- int offset = static_cast<int>(frame->pc() - code->instruction_start());
- int position = AbstractCode::cast(code)->SourcePosition(offset);
+ int position = summ.byte_offset();
// Make position 1-based.
if (position >= 0) ++position;
JSObject::AddProperty(stack_frame, column_key_,
@@ -733,7 +735,7 @@ class CaptureStackTraceHelper {
NONE);
}
if (!script_id_key_.is_null()) {
- int script_id = frame->script()->id();
+ int script_id = summ.script()->id();
JSObject::AddProperty(stack_frame, script_id_key_,
handle(Smi::FromInt(script_id), isolate_), NONE);
}
@@ -770,25 +772,16 @@ Handle<JSArray> Isolate::CaptureCurrentStackTrace(
for (StackTraceFrameIterator it(this); !it.done() && (frames_seen < limit);
it.Advance()) {
StandardFrame* frame = it.frame();
- if (frame->is_java_script()) {
- // Set initial size to the maximum inlining level + 1 for the outermost
- // function.
- List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
- JavaScriptFrame::cast(frame)->Summarize(&frames);
- for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) {
- Handle<JSFunction> fun = frames[i].function();
- // Filter frames from other security contexts.
- if (!(options & StackTrace::kExposeFramesAcrossSecurityOrigins) &&
- !this->context()->HasSameSecurityTokenAs(fun->context()))
- continue;
- Handle<JSObject> new_frame_obj = helper.NewStackFrameObject(frames[i]);
- stack_trace_elems->set(frames_seen, *new_frame_obj);
- frames_seen++;
- }
- } else {
- DCHECK(frame->is_wasm());
- WasmCompiledFrame* wasm_frame = WasmCompiledFrame::cast(frame);
- Handle<JSObject> new_frame_obj = helper.NewStackFrameObject(wasm_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 && frames_seen < limit; i--) {
+ // Filter frames from other security contexts.
+ if (!(options & StackTrace::kExposeFramesAcrossSecurityOrigins) &&
+ !this->context()->HasSameSecurityTokenAs(*frames[i].native_context()))
+ continue;
+ Handle<JSObject> new_frame_obj = helper.NewStackFrameObject(frames[i]);
stack_trace_elems->set(frames_seen, *new_frame_obj);
frames_seen++;
}
@@ -1345,7 +1338,7 @@ HandlerTable::CatchPrediction PredictException(JavaScriptFrame* frame) {
List<FrameSummary> summaries;
frame->Summarize(&summaries);
for (const FrameSummary& summary : summaries) {
- Handle<AbstractCode> code = summary.abstract_code();
+ Handle<AbstractCode> code = summary.AsJavaScript().abstract_code();
if (code->IsCode() && code->kind() == AbstractCode::BUILTIN) {
if (code->GetCode()->is_promise_rejection()) {
return HandlerTable::PROMISE;
@@ -1359,7 +1352,7 @@ HandlerTable::CatchPrediction PredictException(JavaScriptFrame* frame) {
}
if (code->kind() == AbstractCode::OPTIMIZED_FUNCTION) {
- DCHECK(summary.function()->shared()->asm_function());
+ DCHECK(summary.AsJavaScript().function()->shared()->asm_function());
// asm code cannot contain try-catch.
continue;
}
@@ -1503,23 +1496,27 @@ bool Isolate::ComputeLocation(MessageLocation* target) {
StackTraceFrameIterator it(this);
if (it.done()) return false;
StandardFrame* frame = it.frame();
- // TODO(clemensh): handle wasm frames
- if (!frame->is_java_script()) return false;
- JSFunction* fun = JavaScriptFrame::cast(frame)->function();
- Object* script = fun->shared()->script();
- if (!script->IsScript() ||
- (Script::cast(script)->source()->IsUndefined(this))) {
- return false;
- }
- Handle<Script> casted_script(Script::cast(script), this);
// Compute the location from the function and the relocation info of the
// baseline code. For optimized code this will use the deoptimization
// information to get canonical location information.
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
- JavaScriptFrame::cast(frame)->Summarize(&frames);
+ frame->Summarize(&frames);
FrameSummary& summary = frames.last();
- int pos = summary.abstract_code()->SourcePosition(summary.code_offset());
- *target = MessageLocation(casted_script, pos, pos + 1, handle(fun, this));
+ int pos = summary.SourcePosition();
+ Handle<JSFunction> fun;
+ Handle<Object> script = summary.script();
+ if (!script->IsScript() ||
+ (Script::cast(*script)->source()->IsUndefined(this))) {
+ return false;
+ }
+
+ // TODO(wasm): Remove this once trap-if is always on.
+ // Background: Without trap-if, the information on the stack trace is
+ // incomplete (see bug v8:5007).
+ if (summary.IsWasmCompiled() && !FLAG_wasm_trap_if) return false;
+
+ if (summary.IsJavaScript()) fun = summary.AsJavaScript().function();
+ *target = MessageLocation(Handle<Script>::cast(script), pos, pos + 1, fun);
return true;
}
« no previous file with comments | « src/frames-inl.h ('k') | src/list.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698