Chromium Code Reviews| 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 { |