| 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 {
 | 
| 
 |