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

Unified Diff: src/messages.cc

Issue 2404253002: [wasm] Provide better stack traces for asm.js code (Closed)
Patch Set: Address titzer's comments 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
« no previous file with comments | « src/messages.h ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/messages.cc
diff --git a/src/messages.cc b/src/messages.cc
index cc6349d73c52cfa15b5fb7aa96250ea84ef9b549..59c33abcd5d5e0d99e939f186e29ee4ea42ed975 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");
@@ -617,7 +620,8 @@ Handle<Script> JSStackFrame::GetScript() const {
void WasmStackFrame::FromFrameArray(Isolate* isolate, Handle<FrameArray> array,
int frame_ix) {
- DCHECK(array->IsWasmFrame(frame_ix));
+ // This function is called for both wasm and asm.js->wasm frames.
+ DCHECK(array->IsWasmFrame(frame_ix) || array->IsAsmJsWasmFrame(frame_ix));
isolate_ = isolate;
wasm_obj_ = handle(array->WasmObject(frame_ix), isolate);
wasm_func_index_ = array->WasmFunctionIndex(frame_ix)->value();
@@ -667,6 +671,72 @@ Handle<Object> WasmStackFrame::Null() const {
return isolate_->factory()->null_value();
}
+Handle<Object> AsmJsWasmStackFrame::GetReceiver() const {
+ return isolate_->global_proxy();
+}
+
+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) {}
@@ -680,13 +750,22 @@ void FrameArrayIterator::Next() { next_frame_ix_++; }
StackFrameBase* FrameArrayIterator::Frame() {
DCHECK(HasNext());
const int flags = array_->Flags(next_frame_ix_)->value();
- const bool is_js_frame = (flags & FrameArray::kIsWasmFrame) == 0;
- 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_;
+ switch (flags & (FrameArray::kIsWasmFrame | FrameArray::kIsAsmJsWasmFrame)) {
+ case 0:
+ // JavaScript Frame.
+ js_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
+ return &js_frame_;
+ case FrameArray::kIsWasmFrame:
+ // Wasm Frame;
+ wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
+ return &wasm_frame_;
+ case FrameArray::kIsAsmJsWasmFrame:
+ // Asm.js Wasm Frame:
+ asm_wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_);
+ return &asm_wasm_frame_;
+ default:
+ UNREACHABLE();
+ return nullptr;
}
}
« no previous file with comments | « src/messages.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698