diff options
Diffstat (limited to 'deps/v8/src/messages.cc')
-rw-r--r-- | deps/v8/src/messages.cc | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/deps/v8/src/messages.cc b/deps/v8/src/messages.cc index b5150ef400..e61ce90791 100644 --- a/deps/v8/src/messages.cc +++ b/deps/v8/src/messages.cc @@ -10,6 +10,7 @@ #include "src/execution.h" #include "src/isolate-inl.h" #include "src/keys.h" +#include "src/objects/frame-array-inl.h" #include "src/string-builder.h" #include "src/wasm/wasm-module.h" #include "src/wasm/wasm-objects.h" @@ -639,12 +640,19 @@ WasmStackFrame::WasmStackFrame() {} void WasmStackFrame::FromFrameArray(Isolate* isolate, Handle<FrameArray> array, int frame_ix) { - // This function is called for both wasm and asm.js->wasm frames. - DCHECK(array->IsWasmFrame(frame_ix) || array->IsAsmJsWasmFrame(frame_ix)); + // This function is called for compiled and interpreted wasm frames, and for + // asm.js->wasm frames. + DCHECK(array->IsWasmFrame(frame_ix) || + array->IsWasmInterpretedFrame(frame_ix) || + array->IsAsmJsWasmFrame(frame_ix)); isolate_ = isolate; wasm_instance_ = handle(array->WasmInstance(frame_ix), isolate); wasm_func_index_ = array->WasmFunctionIndex(frame_ix)->value(); - code_ = handle(array->Code(frame_ix), isolate); + if (array->IsWasmInterpretedFrame(frame_ix)) { + code_ = Handle<AbstractCode>::null(); + } else { + code_ = handle(array->Code(frame_ix), isolate); + } offset_ = array->Offset(frame_ix)->value(); } @@ -679,19 +687,21 @@ MaybeHandle<String> WasmStackFrame::ToString() { builder.AppendCString(" (<WASM>["); - Handle<Smi> ix(Smi::FromInt(wasm_func_index_), isolate_); - builder.AppendString(isolate_->factory()->NumberToString(ix)); + char buffer[16]; + SNPrintF(ArrayVector(buffer), "%u", wasm_func_index_); + builder.AppendCString(buffer); builder.AppendCString("]+"); - Handle<Object> pos(Smi::FromInt(GetPosition()), isolate_); - builder.AppendString(isolate_->factory()->NumberToString(pos)); + SNPrintF(ArrayVector(buffer), "%d", GetPosition()); + builder.AppendCString(buffer); builder.AppendCString(")"); return builder.Finish(); } int WasmStackFrame::GetPosition() const { + if (IsInterpreted()) return offset_; // TODO(wasm): Clean this up (bug 5007). return (offset_ < 0) ? (-1 - offset_) : code_->SourcePosition(offset_); } @@ -731,7 +741,7 @@ Handle<Object> AsmJsWasmStackFrame::GetFunction() const { Handle<Object> AsmJsWasmStackFrame::GetFileName() { Handle<Script> script = wasm::GetScript(Handle<JSObject>::cast(wasm_instance_)); - DCHECK_EQ(Script::TYPE_NORMAL, script->type()); + DCHECK(script->IsUserJavaScript()); return handle(script->name(), isolate_); } @@ -757,7 +767,7 @@ int AsmJsWasmStackFrame::GetLineNumber() { DCHECK_LE(0, GetPosition()); Handle<Script> script = wasm::GetScript(Handle<JSObject>::cast(wasm_instance_)); - DCHECK_EQ(Script::TYPE_NORMAL, script->type()); + DCHECK(script->IsUserJavaScript()); return Script::GetLineNumber(script, GetPosition()) + 1; } @@ -765,7 +775,7 @@ int AsmJsWasmStackFrame::GetColumnNumber() { DCHECK_LE(0, GetPosition()); Handle<Script> script = wasm::GetScript(Handle<JSObject>::cast(wasm_instance_)); - DCHECK_EQ(Script::TYPE_NORMAL, script->type()); + DCHECK(script->IsUserJavaScript()); return Script::GetColumnNumber(script, GetPosition()) + 1; } @@ -802,13 +812,17 @@ void FrameArrayIterator::Next() { next_frame_ix_++; } StackFrameBase* FrameArrayIterator::Frame() { DCHECK(HasNext()); const int flags = array_->Flags(next_frame_ix_)->value(); - switch (flags & (FrameArray::kIsWasmFrame | FrameArray::kIsAsmJsWasmFrame)) { + int flag_mask = FrameArray::kIsWasmFrame | + FrameArray::kIsWasmInterpretedFrame | + FrameArray::kIsAsmJsWasmFrame; + switch (flags & flag_mask) { case 0: // JavaScript Frame. js_frame_.FromFrameArray(isolate_, array_, next_frame_ix_); return &js_frame_; case FrameArray::kIsWasmFrame: - // Wasm Frame; + case FrameArray::kIsWasmInterpretedFrame: + // Wasm Frame: wasm_frame_.FromFrameArray(isolate_, array_, next_frame_ix_); return &wasm_frame_; case FrameArray::kIsAsmJsWasmFrame: @@ -1007,6 +1021,8 @@ Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, template_index, result_string, factory->empty_string(), factory->empty_string()); if (!maybe_result_string.ToHandle(&result_string)) { + DCHECK(isolate->has_pending_exception()); + isolate->clear_pending_exception(); return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); } // A string that has been obtained from JS code in this way is |