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

Unified Diff: src/messages.cc

Issue 2404253002: [wasm] Provide better stack traces for asm.js code (Closed)
Patch Set: Pass encoded bytes directly instead of embedding them in the module Created 4 years, 2 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
Index: src/messages.cc
diff --git a/src/messages.cc b/src/messages.cc
index cc6349d73c52cfa15b5fb7aa96250ea84ef9b549..af052124316f17a1dd4ade8c29d52390f1f9e942 100644
--- a/src/messages.cc
+++ b/src/messages.cc
@@ -211,14 +211,6 @@ Handle<Object> JSStackFrame::GetFunctionName() {
return isolate_->factory()->null_value();
}
-Handle<Object> JSStackFrame::GetScriptNameOrSourceUrl() {
- if (!HasScript()) return isolate_->factory()->null_value();
- Handle<Script> script = GetScript();
- Object* source_url = script->source_url();
- return (source_url->IsString()) ? handle(source_url, isolate_)
- : handle(script->name(), isolate_);
-}
-
namespace {
bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name,
@@ -238,8 +230,19 @@ bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name,
return false;
}
+Handle<Object> ScriptNameOrSourceUrl(Handle<Script> script, Isolate* isolate) {
+ Object* name_or_url = script->source_url();
+ if (!name_or_url->IsString()) name_or_url = script->name();
+ return handle(name_or_url, isolate);
+}
+
} // namespace
+Handle<Object> JSStackFrame::GetScriptNameOrSourceUrl() {
+ if (!HasScript()) return isolate_->factory()->null_value();
+ return ScriptNameOrSourceUrl(GetScript(), isolate_);
+}
+
Handle<Object> JSStackFrame::GetMethodName() {
if (receiver_->IsNull(isolate_) || receiver_->IsUndefined(isolate_)) {
return isolate_->factory()->null_value();
@@ -455,7 +458,7 @@ bool IsNonEmptyString(Handle<Object> object) {
return (object->IsString() && String::cast(*object)->length() > 0);
}
-void AppendFileLocation(Isolate* isolate, JSStackFrame* call_site,
+void AppendFileLocation(Isolate* isolate, StackFrameBase* call_site,
IncrementalStringBuilder* builder) {
if (call_site->IsNative()) {
builder->AppendCString("native");
@@ -667,6 +670,72 @@ Handle<Object> WasmStackFrame::Null() const {
return isolate_->factory()->null_value();
}
+Handle<Object> AsmJsWasmStackFrame::GetReceiver() const {
+ return isolate_->global_object();
jgruber 2016/10/11 19:07:40 As far I understand, the global object should neve
Clemens Hammacher 2016/10/12 07:37:18 You are right. Fixed it.
+}
+
+Handle<Object> AsmJsWasmStackFrame::GetFunction() const {
+ // TODO(clemensh): Return lazily created JSFunction.
+ return Null();
+}
+
+Handle<Object> AsmJsWasmStackFrame::GetFileName() {
+ Handle<Script> script =
+ wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
+ return handle(script->name(), isolate_);
+}
+
+Handle<Object> AsmJsWasmStackFrame::GetFunctionName() {
+ return wasm::GetWasmFunctionNameOrNull(isolate_, wasm_obj_, wasm_func_index_);
+}
+
+Handle<Object> AsmJsWasmStackFrame::GetScriptNameOrSourceUrl() {
+ Handle<Script> script =
+ wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
+ return ScriptNameOrSourceUrl(script, isolate_);
+}
+
+int AsmJsWasmStackFrame::GetPosition() const {
+ DCHECK_LE(0, offset_);
+ int byte_offset = code_->SourcePosition(offset_);
+ return wasm::GetAsmWasmSourcePosition(Handle<JSObject>::cast(wasm_obj_),
+ wasm_func_index_, byte_offset);
+}
+
+int AsmJsWasmStackFrame::GetLineNumber() {
+ DCHECK_LE(0, GetPosition());
+ Handle<Script> script =
+ wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
+ return Script::GetLineNumber(script, GetPosition()) + 1;
+}
+
+int AsmJsWasmStackFrame::GetColumnNumber() {
+ DCHECK_LE(0, GetPosition());
+ Handle<Script> script =
+ wasm::GetAsmWasmScript(Handle<JSObject>::cast(wasm_obj_));
+ return Script::GetColumnNumber(script, GetPosition()) + 1;
+}
+
+MaybeHandle<String> AsmJsWasmStackFrame::ToString() {
+ // The string should look exactly as the respective javascript frame string.
+ // Keep this method in line to JSStackFrame::ToString().
+
+ IncrementalStringBuilder builder(isolate_);
+
+ Handle<Object> function_name = GetFunctionName();
+
+ if (IsNonEmptyString(function_name)) {
+ builder.AppendString(Handle<String>::cast(function_name));
+ builder.AppendCString(" (");
+ }
+
+ AppendFileLocation(isolate_, this, &builder);
+
+ if (IsNonEmptyString(function_name)) builder.AppendCString(")");
+
+ RETURN_RESULT(isolate_, builder.Finish(), String);
+}
+
FrameArrayIterator::FrameArrayIterator(Isolate* isolate,
Handle<FrameArray> array, int frame_ix)
: isolate_(isolate), array_(array), next_frame_ix_(frame_ix) {}
@@ -684,10 +753,14 @@ StackFrameBase* FrameArrayIterator::Frame() {
if (is_js_frame) {
js_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
return &js_frame_;
- } else {
- wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
- return &wasm_frame_;
}
+ const bool is_asm_wasm_frame = (flags & FrameArray::kIsAsmWasmFrame) != 0;
jgruber 2016/10/11 19:07:40 Can we make this a switch on flags & (kIsWasmFrame
Clemens Hammacher 2016/10/12 07:37:18 Done.
+ if (is_asm_wasm_frame) {
+ asm_wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
+ return &asm_wasm_frame_;
+ }
+ wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
+ return &wasm_frame_;
}
namespace {

Powered by Google App Engine
This is Rietveld 408576698