| Index: src/frames.cc
|
| diff --git a/src/frames.cc b/src/frames.cc
|
| index a7bd91a79636a2bb601d0bdade272e10a3467609..5ee0568b0b9b070e012f96dbeedf5dd80169a3a7 100644
|
| --- a/src/frames.cc
|
| +++ b/src/frames.cc
|
| @@ -16,6 +16,8 @@
|
| #include "src/safepoint-table.h"
|
| #include "src/string-stream.h"
|
| #include "src/vm-state-inl.h"
|
| +#include "src/wasm/wasm-debug.h"
|
| +#include "src/wasm/wasm-module.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -63,19 +65,14 @@ StackFrameIteratorBase::StackFrameIteratorBase(Isolate* isolate,
|
| }
|
| #undef INITIALIZE_SINGLETON
|
|
|
| -
|
| StackFrameIterator::StackFrameIterator(Isolate* isolate)
|
| - : StackFrameIteratorBase(isolate, true) {
|
| - Reset(isolate->thread_local_top());
|
| -}
|
| -
|
| + : StackFrameIterator(isolate, isolate->thread_local_top()) {}
|
|
|
| StackFrameIterator::StackFrameIterator(Isolate* isolate, ThreadLocalTop* t)
|
| : StackFrameIteratorBase(isolate, true) {
|
| Reset(t);
|
| }
|
|
|
| -
|
| void StackFrameIterator::Advance() {
|
| DCHECK(!done());
|
| // Compute the state of the calling frame before restoring
|
| @@ -165,6 +162,11 @@ StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate)
|
| if (!done() && !IsValidFrame(iterator_.frame())) Advance();
|
| }
|
|
|
| +StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate,
|
| + StackFrame::Id id)
|
| + : StackTraceFrameIterator(isolate) {
|
| + while (!done() && frame()->id() != id) Advance();
|
| +}
|
|
|
| void StackTraceFrameIterator::Advance() {
|
| do {
|
| @@ -185,6 +187,11 @@ bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const {
|
| return frame->is_wasm();
|
| }
|
|
|
| +void StackTraceFrameIterator::AdvanceToArgumentsFrame() {
|
| + if (!is_javascript() || !javascript_frame()->has_adapted_arguments()) return;
|
| + iterator_.Advance();
|
| + DCHECK(iterator_.frame()->is_arguments_adaptor());
|
| +}
|
|
|
| // -------------------------------------------------------------------------
|
|
|
| @@ -630,6 +637,20 @@ Address InterpretedFrame::GetExpressionAddress(int n) const {
|
| return fp() + offset - n * kPointerSize;
|
| }
|
|
|
| +Script* StandardFrame::script() const {
|
| + // This should only be called on frames which override this method.
|
| + DCHECK(false);
|
| + return nullptr;
|
| +}
|
| +
|
| +Object* StandardFrame::receiver() const {
|
| + return isolate()->heap()->undefined_value();
|
| +}
|
| +
|
| +Object* StandardFrame::context() const {
|
| + return isolate()->heap()->undefined_value();
|
| +}
|
| +
|
| int StandardFrame::ComputeExpressionsCount() const {
|
| Address base = GetExpressionAddress(0);
|
| Address limit = sp() - kPointerSize;
|
| @@ -638,6 +659,13 @@ int StandardFrame::ComputeExpressionsCount() const {
|
| return static_cast<int>((base - limit) / kPointerSize);
|
| }
|
|
|
| +Object* StandardFrame::GetParameter(int index) const {
|
| + // StandardFrame does not define any parameters.
|
| + UNREACHABLE();
|
| + return nullptr;
|
| +}
|
| +
|
| +int StandardFrame::ComputeParametersCount() const { return 0; }
|
|
|
| void StandardFrame::ComputeCallerState(State* state) const {
|
| state->sp = caller_sp();
|
| @@ -654,6 +682,7 @@ void StandardFrame::SetCallerFp(Address caller_fp) {
|
| caller_fp;
|
| }
|
|
|
| +bool StandardFrame::IsConstructor() const { return false; }
|
|
|
| void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const {
|
| // Make sure that we're not doing "safe" stack frame iteration. We cannot
|
| @@ -867,6 +896,17 @@ 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);
|
| + DCHECK(!maybe_result->IsSmi());
|
| + return maybe_result;
|
| +}
|
| +
|
| int JavaScriptFrame::LookupExceptionHandlerInTable(
|
| int* stack_depth, HandlerTable::CatchPrediction* prediction) {
|
| Code* code = LookupCode();
|
| @@ -946,6 +986,14 @@ void JavaScriptFrame::SaveOperandStack(FixedArray* store) const {
|
| }
|
| }
|
|
|
| +Object* JavaScriptFrame::GetParameter(int index) const {
|
| + return Memory::Object_at(GetParameterSlot(index));
|
| +}
|
| +
|
| +int JavaScriptFrame::ComputeParametersCount() const {
|
| + return GetNumberOfIncomingArguments();
|
| +}
|
| +
|
| namespace {
|
|
|
| bool CannotDeoptFromAsmCode(Code* code, JSFunction* function) {
|
| @@ -1342,23 +1390,22 @@ Address WasmFrame::GetCallerStackPointer() const {
|
| return fp() + ExitFrameConstants::kCallerSPOffset;
|
| }
|
|
|
| -Object* WasmFrame::wasm_obj() {
|
| +Object* WasmFrame::wasm_obj() const {
|
| FixedArray* deopt_data = LookupCode()->deoptimization_data();
|
| DCHECK(deopt_data->length() == 2);
|
| return deopt_data->get(0);
|
| }
|
|
|
| -uint32_t WasmFrame::function_index() {
|
| +uint32_t WasmFrame::function_index() const {
|
| FixedArray* deopt_data = LookupCode()->deoptimization_data();
|
| DCHECK(deopt_data->length() == 2);
|
| - Object* func_index_obj = deopt_data->get(1);
|
| - if (func_index_obj->IsUndefined(isolate())) return static_cast<uint32_t>(-1);
|
| - if (func_index_obj->IsSmi()) return Smi::cast(func_index_obj)->value();
|
| - DCHECK(func_index_obj->IsHeapNumber());
|
| - uint32_t val = static_cast<uint32_t>(-1);
|
| - func_index_obj->ToUint32(&val);
|
| - DCHECK(val != static_cast<uint32_t>(-1));
|
| - return val;
|
| + return Smi::cast(deopt_data->get(1))->value();
|
| +}
|
| +
|
| +Script* WasmFrame::script() const {
|
| + JSObject* wasm = JSObject::cast(wasm_obj());
|
| + Handle<wasm::WasmDebugInfo> debug_info(wasm::GetDebugInfo(wasm), isolate());
|
| + return wasm::WasmDebugInfo::GetFunctionScript(debug_info, function_index());
|
| }
|
|
|
| namespace {
|
|
|