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

Unified Diff: src/isolate.cc

Issue 2096863003: [wasm] prototype for breakpoint support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@extend-script-functionality
Patch Set: Created 4 years, 6 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/log.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 edf92eec5cb8e84f7534337a4abfce1c1cb132a7..b8c0931b20eb46eb369ee55c8e8124b793745912 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -387,60 +387,58 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object,
case StackFrame::JAVA_SCRIPT:
case StackFrame::OPTIMIZED:
case StackFrame::INTERPRETED:
- case StackFrame::BUILTIN: {
- JavaScriptFrame* js_frame = JavaScriptFrame::cast(frame);
+ case StackFrame::BUILTIN:
+ case StackFrame::WASM_COMPILED:
+ case StackFrame::WASM_INTERPRETED: {
// Set initial size to the maximum inlining level + 1 for the outermost
// function.
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
- js_frame->Summarize(&frames);
+ StandardFrame::cast(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, &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++;
+ if (frames[i].is_javascript()) {
+ 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, &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++;
+ } else {
+ DCHECK(frames[i].is_wasm());
+ elements = MaybeGrow(this, elements, cursor, cursor + 4);
+ elements->set(cursor++, *frames[i].wasm_object());
+ elements->set(cursor++,
+ Smi::FromInt(frames[i].wasm_function_index()));
+ elements->set(cursor++, *frames[i].abstract_code());
+ elements->set(cursor++, Smi::FromInt(frames[i].code_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: {
- WasmFrame* wasm_frame = WasmFrame::cast(frame);
- Code* code = wasm_frame->unchecked_code();
- Handle<AbstractCode> abstract_code =
- Handle<AbstractCode>(AbstractCode::cast(code));
- int offset =
- static_cast<int>(wasm_frame->pc() - code->instruction_start());
- elements = MaybeGrow(this, elements, cursor, cursor + 4);
- elements->set(cursor++, wasm_frame->wasm_obj());
- elements->set(cursor++, Smi::FromInt(wasm_frame->function_index()));
- elements->set(cursor++, *abstract_code);
- elements->set(cursor++, Smi::FromInt(offset));
- frames_seen++;
- } break;
-
default:
break;
}
@@ -540,9 +538,46 @@ 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.is_javascript()) {
+ int position = summ.abstract_code()->SourcePosition(summ.code_offset());
+ return NewStackFrameObject(summ.function(), position,
+ summ.is_constructor());
+ }
+
+ DCHECK(summ.is_wasm());
+ Handle<JSObject> stack_frame =
+ factory()->NewJSObject(isolate_->object_function());
+
+ if (!function_key_.is_null()) {
+ Handle<String> name = wasm::GetWasmFunctionName(
+ isolate_, summ.wasm_object(), summ.wasm_function_index());
+ JSObject::AddProperty(stack_frame, function_key_, name, NONE);
+ }
+ // Encode the function index as line number.
+ if (!line_key_.is_null()) {
+ JSObject::AddProperty(
+ stack_frame, line_key_,
+ handle(Smi::FromInt(summ.wasm_function_index()), isolate_), NONE);
+ }
+ // Encode the byte offset as column.
+ if (!column_key_.is_null()) {
+ int position =
+ summ.abstract_code()->GetCode()->SourcePosition(summ.code_offset());
+ // Make position 1-based.
+ if (position >= 0) ++position;
+ JSObject::AddProperty(stack_frame, column_key_,
+ isolate_->factory()->NewNumberFromInt(position),
+ NONE);
+ }
+ if (!script_id_key_.is_null()) {
+ Script* script = summ.script();
+ // Null pointer can only happen during testing.
+ int script_id = script ? script->id() : -1;
+ JSObject::AddProperty(stack_frame, script_id_key_,
+ handle(Smi::FromInt(script_id), isolate_), NONE);
+ }
+
+ return stack_frame;
}
Handle<JSObject> NewStackFrameObject(Handle<JSFunction> fun, int position,
@@ -601,42 +636,6 @@ class CaptureStackTraceHelper {
return stack_frame;
}
- Handle<JSObject> NewStackFrameObject(WasmFrame* frame) {
- Handle<JSObject> stack_frame =
- factory()->NewJSObject(isolate_->object_function());
-
- if (!function_key_.is_null()) {
- Handle<String> name = wasm::GetWasmFunctionName(
- isolate_, handle(frame->wasm_obj(), isolate_),
- frame->function_index());
- JSObject::AddProperty(stack_frame, function_key_, name, NONE);
- }
- // Encode the function index as line number.
- if (!line_key_.is_null()) {
- JSObject::AddProperty(
- stack_frame, line_key_,
- isolate_->factory()->NewNumberFromInt(frame->function_index()), NONE);
- }
- // Encode the byte offset as column.
- if (!column_key_.is_null()) {
- Code* code = frame->LookupCode();
- int offset = static_cast<int>(frame->pc() - code->instruction_start());
- int position = code->SourcePosition(offset);
- // Make position 1-based.
- if (position >= 0) ++position;
- JSObject::AddProperty(stack_frame, column_key_,
- isolate_->factory()->NewNumberFromInt(position),
- NONE);
- }
- if (!script_id_key_.is_null()) {
- int script_id = frame->script()->id();
- JSObject::AddProperty(stack_frame, script_id_key_,
- handle(Smi::FromInt(script_id), isolate_), NONE);
- }
-
- return stack_frame;
- }
-
private:
inline Factory* factory() { return isolate_->factory(); }
@@ -717,25 +716,18 @@ Handle<JSArray> Isolate::CaptureCurrentStackTrace(
int frames_seen = 0;
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 {
- WasmFrame* wasm_frame = WasmFrame::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);
+ it.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) &&
+ frames[i].is_javascript() &&
+ !this->context()->HasSameSecurityTokenAs(
+ frames[i].function()->context()))
+ continue;
+ Handle<JSObject> new_frame_obj = helper.NewStackFrameObject(frames[i]);
stack_trace_elems->set(frames_seen, *new_frame_obj);
frames_seen++;
}
« no previous file with comments | « src/frames-inl.h ('k') | src/log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698