Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index 9e7cbc80541cda9fb8a468df4d3b61268feed35f..755882ae8389f05806a06e1cfb2e6df2b745b962 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -468,11 +468,13 @@ StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator, |
case Code::OPTIMIZED_FUNCTION: |
return OPTIMIZED; |
case Code::WASM_FUNCTION: |
- return WASM; |
+ return WASM_COMPILED; |
case Code::WASM_TO_JS_FUNCTION: |
return WASM_TO_JS; |
case Code::JS_TO_WASM_FUNCTION: |
return JS_TO_WASM; |
+ case Code::WASM_INTERPRETER_ENTRY: |
+ return WASM_INTERPRETER_ENTRY; |
default: |
// All other types should have an explicit marker |
break; |
@@ -496,7 +498,7 @@ StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator, |
case CONSTRUCT: |
case ARGUMENTS_ADAPTOR: |
case WASM_TO_JS: |
- case WASM: |
+ case WASM_COMPILED: |
return candidate; |
case JS_TO_WASM: |
case JAVA_SCRIPT: |
@@ -760,6 +762,12 @@ void StandardFrame::SetCallerFp(Address caller_fp) { |
bool StandardFrame::IsConstructor() const { return false; } |
+void StandardFrame::Summarize(List<FrameSummary>* functions, |
+ FrameSummary::Mode mode) const { |
+ // This should only be called on frames which override this method. |
+ UNREACHABLE(); |
+} |
+ |
void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { |
// Make sure that we're not doing "safe" stack frame iteration. We cannot |
// possibly find pointers in optimized frames in that state. |
@@ -791,7 +799,8 @@ void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { |
case CONSTRUCT: |
case JS_TO_WASM: |
case WASM_TO_JS: |
- case WASM: |
+ case WASM_COMPILED: |
+ case WASM_INTERPRETER_ENTRY: |
frame_header_size = TypedFrameConstants::kFixedFrameSizeFromFp; |
break; |
case JAVA_SCRIPT: |
@@ -973,10 +982,6 @@ JSFunction* JavaScriptFrame::function() const { |
Object* JavaScriptFrame::receiver() const { return GetParameter(-1); } |
-Script* JavaScriptFrame::script() const { |
- return Script::cast(function()->shared()->script()); |
-} |
- |
Object* JavaScriptFrame::context() const { |
const int offset = StandardFrameConstants::kContextOffset; |
Object* maybe_result = Memory::Object_at(fp() + offset); |
@@ -984,6 +989,10 @@ Object* JavaScriptFrame::context() const { |
return maybe_result; |
} |
+Script* JavaScriptFrame::script() const { |
+ return Script::cast(function()->shared()->script()); |
+} |
+ |
int JavaScriptFrame::LookupExceptionHandlerInTable( |
int* stack_depth, HandlerTable::CatchPrediction* prediction) { |
DCHECK_EQ(0, LookupCode()->handler_table()->length()); |
@@ -1134,7 +1143,7 @@ FrameSummary::FrameSummary(Object* receiver, JSFunction* function, |
mode == kApproximateSummary); |
} |
-FrameSummary FrameSummary::GetFirst(JavaScriptFrame* frame) { |
+FrameSummary FrameSummary::GetFirst(StandardFrame* frame) { |
List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
frame->Summarize(&frames); |
return frames.first(); |
@@ -1522,8 +1531,8 @@ void StackFrame::PrintIndex(StringStream* accumulator, |
accumulator->Add((mode == OVERVIEW) ? "%5d: " : "[%d]: ", index); |
} |
-void WasmFrame::Print(StringStream* accumulator, PrintMode mode, |
- int index) const { |
+void WasmCompiledFrame::Print(StringStream* accumulator, PrintMode mode, |
+ int index) const { |
PrintIndex(accumulator, mode, index); |
accumulator->Add("WASM ["); |
Script* script = this->script(); |
@@ -1543,35 +1552,36 @@ void WasmFrame::Print(StringStream* accumulator, PrintMode mode, |
if (mode != OVERVIEW) accumulator->Add("\n"); |
} |
-Code* WasmFrame::unchecked_code() const { |
- return static_cast<Code*>(isolate()->FindCodeObject(pc())); |
+Code* WasmCompiledFrame::unchecked_code() const { |
+ return isolate()->FindCodeObject(pc()); |
} |
-void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } |
+void WasmCompiledFrame::Iterate(ObjectVisitor* v) const { |
+ IterateCompiledFrame(v); |
+} |
-Address WasmFrame::GetCallerStackPointer() const { |
+Address WasmCompiledFrame::GetCallerStackPointer() const { |
return fp() + ExitFrameConstants::kCallerSPOffset; |
} |
-WasmInstanceObject* WasmFrame::wasm_instance() const { |
+WasmInstanceObject* WasmCompiledFrame::wasm_instance() const { |
WasmInstanceObject* obj = wasm::GetOwningWasmInstance(LookupCode()); |
// This is a live stack frame; it must have a live instance. |
DCHECK_NOT_NULL(obj); |
return obj; |
} |
-uint32_t WasmFrame::function_index() const { |
+uint32_t WasmCompiledFrame::function_index() const { |
FixedArray* deopt_data = LookupCode()->deoptimization_data(); |
DCHECK(deopt_data->length() == 2); |
return Smi::cast(deopt_data->get(1))->value(); |
} |
-Script* WasmFrame::script() const { |
- Handle<JSObject> instance(JSObject::cast(wasm_instance()), isolate()); |
- return *wasm::GetScript(instance); |
+Script* WasmCompiledFrame::script() const { |
+ return wasm_instance()->compiled_module()->script(); |
} |
-int WasmFrame::position() const { |
+int WasmCompiledFrame::position() const { |
int position = StandardFrame::position(); |
if (wasm_instance()->compiled_module()->is_asm_js()) { |
Handle<WasmCompiledModule> compiled_module( |
@@ -1585,7 +1595,12 @@ int WasmFrame::position() const { |
return position; |
} |
-bool WasmFrame::at_to_number_conversion() const { |
+void WasmCompiledFrame::Summarize(List<FrameSummary>* functions, |
+ FrameSummary::Mode mode) const { |
+ // TODO(clemensh): Implement. |
+} |
+ |
+bool WasmCompiledFrame::at_to_number_conversion() const { |
// Check whether our callee is a WASM_TO_JS frame, and this frame is at the |
// ToNumber conversion call. |
Address callee_pc = reinterpret_cast<Address>(this->callee_pc()); |
@@ -1598,7 +1613,7 @@ bool WasmFrame::at_to_number_conversion() const { |
return !!pos; |
} |
-int WasmFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
+int WasmCompiledFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
DCHECK_NOT_NULL(stack_slots); |
Code* code = LookupCode(); |
HandlerTable* table = HandlerTable::cast(code->handler_table()); |
@@ -1607,6 +1622,49 @@ int WasmFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
return table->LookupReturn(pc_offset); |
} |
+void WasmInterpreterEntryFrame::Iterate(ObjectVisitor* v) const { |
+ IterateCompiledFrame(v); |
+} |
+ |
+void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode, |
+ int index) const { |
+ PrintIndex(accumulator, mode, index); |
+ accumulator->Add("WASM TO INTERPRETER ["); |
+ Script* script = this->script(); |
+ accumulator->PrintName(script->name()); |
+ accumulator->Add("]"); |
+ if (mode != OVERVIEW) accumulator->Add("\n"); |
+} |
+ |
+void WasmInterpreterEntryFrame::Summarize(List<FrameSummary>* functions, |
+ FrameSummary::Mode mode) const { |
+ // TODO(clemensh): Implement this. |
+} |
+ |
+Code* WasmInterpreterEntryFrame::unchecked_code() const { |
+ return isolate()->FindCodeObject(pc()); |
+} |
+ |
+WasmInstanceObject* WasmInterpreterEntryFrame::wasm_instance() const { |
+ WasmInstanceObject* ret = wasm::GetOwningWasmInstance(LookupCode()); |
+ // This is a live stack frame, there must be a live wasm instance available. |
+ DCHECK_NOT_NULL(ret); |
+ return ret; |
+} |
+ |
+Script* WasmInterpreterEntryFrame::script() const { |
+ return wasm_instance()->compiled_module()->script(); |
+} |
+ |
+int WasmInterpreterEntryFrame::position() const { |
+ // TODO(clemensh): Implement this. |
+ return 0; |
+} |
+ |
+Address WasmInterpreterEntryFrame::GetCallerStackPointer() const { |
+ return fp() + ExitFrameConstants::kCallerSPOffset; |
+} |
+ |
namespace { |