| Index: src/frames.cc
 | 
| diff --git a/src/frames.cc b/src/frames.cc
 | 
| index 51f5bf57159ae068f0850e068ade85a8c923d205..d9fa728b07a3bcf01b18f93545ced149cea8dd65 100644
 | 
| --- a/src/frames.cc
 | 
| +++ b/src/frames.cc
 | 
| @@ -160,28 +160,29 @@ void JavaScriptFrameIterator::AdvanceToArgumentsFrame() {
 | 
|  
 | 
|  // -------------------------------------------------------------------------
 | 
|  
 | 
| -
 | 
|  StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate)
 | 
| -    : JavaScriptFrameIterator(isolate) {
 | 
| -  if (!done() && !IsValidFrame()) Advance();
 | 
| +    : iterator_(isolate) {
 | 
| +  if (!done() && !IsValidFrame(iterator_.frame())) Advance();
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void StackTraceFrameIterator::Advance() {
 | 
| -  while (true) {
 | 
| -    JavaScriptFrameIterator::Advance();
 | 
| -    if (done()) return;
 | 
| -    if (IsValidFrame()) return;
 | 
| -  }
 | 
| +  do {
 | 
| +    iterator_.Advance();
 | 
| +  } while (!done() && !IsValidFrame(iterator_.frame()));
 | 
|  }
 | 
|  
 | 
| -
 | 
| -bool StackTraceFrameIterator::IsValidFrame() {
 | 
| -    if (!frame()->function()->IsJSFunction()) return false;
 | 
| -    Object* script = frame()->function()->shared()->script();
 | 
| +bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const {
 | 
| +  if (frame->is_java_script()) {
 | 
| +    JavaScriptFrame* jsFrame = static_cast<JavaScriptFrame*>(frame);
 | 
| +    if (!jsFrame->function()->IsJSFunction()) return false;
 | 
| +    Object* script = jsFrame->function()->shared()->script();
 | 
|      // Don't show functions from native scripts to user.
 | 
|      return (script->IsScript() &&
 | 
|              Script::TYPE_NATIVE != Script::cast(script)->type());
 | 
| +  }
 | 
| +  // apart from javascript, only wasm is valid
 | 
| +  return frame->is_wasm();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -616,6 +617,19 @@ void ExitFrame::FillState(Address fp, Address sp, State* state) {
 | 
|    state->constant_pool_address = NULL;
 | 
|  }
 | 
|  
 | 
| +void StandardFrame::Summarize(List<FrameSummary>* functions) const {
 | 
| +  DCHECK(functions->length() == 0);
 | 
| +  // default implementation: no summary added
 | 
| +}
 | 
| +
 | 
| +JSFunction* StandardFrame::function() const {
 | 
| +  // this default implementation is overridden by JS and WASM frames
 | 
| +  return nullptr;
 | 
| +}
 | 
| +
 | 
| +Object* StandardFrame::receiver() const {
 | 
| +  return isolate()->heap()->undefined_value();
 | 
| +}
 | 
|  
 | 
|  Address StandardFrame::GetExpressionAddress(int n) const {
 | 
|    const int offset = StandardFrameConstants::kExpressionsOffset;
 | 
| @@ -846,8 +860,7 @@ void JavaScriptFrame::GetFunctions(List<JSFunction*>* functions) const {
 | 
|    functions->Add(function());
 | 
|  }
 | 
|  
 | 
| -
 | 
| -void JavaScriptFrame::Summarize(List<FrameSummary>* functions) {
 | 
| +void JavaScriptFrame::Summarize(List<FrameSummary>* functions) const {
 | 
|    DCHECK(functions->length() == 0);
 | 
|    Code* code = LookupCode();
 | 
|    int offset = static_cast<int>(pc() - code->instruction_start());
 | 
| @@ -857,6 +870,12 @@ void JavaScriptFrame::Summarize(List<FrameSummary>* functions) {
 | 
|    functions->Add(summary);
 | 
|  }
 | 
|  
 | 
| +JSFunction* JavaScriptFrame::function() const {
 | 
| +  return JSFunction::cast(function_slot_object());
 | 
| +}
 | 
| +
 | 
| +Object* JavaScriptFrame::receiver() const { return GetParameter(-1); }
 | 
| +
 | 
|  int JavaScriptFrame::LookupExceptionHandlerInTable(
 | 
|      int* stack_depth, HandlerTable::CatchPrediction* prediction) {
 | 
|    Code* code = LookupCode();
 | 
| @@ -978,8 +997,7 @@ void FrameSummary::Print() {
 | 
|    PrintF("\npc: %d\n", code_offset_);
 | 
|  }
 | 
|  
 | 
| -
 | 
| -void OptimizedFrame::Summarize(List<FrameSummary>* frames) {
 | 
| +void OptimizedFrame::Summarize(List<FrameSummary>* frames) const {
 | 
|    DCHECK(frames->length() == 0);
 | 
|    DCHECK(is_optimized());
 | 
|  
 | 
| @@ -1234,7 +1252,7 @@ Object* InterpretedFrame::GetInterpreterRegister(int register_index) const {
 | 
|    return GetExpression(index + register_index);
 | 
|  }
 | 
|  
 | 
| -void InterpretedFrame::Summarize(List<FrameSummary>* functions) {
 | 
| +void InterpretedFrame::Summarize(List<FrameSummary>* functions) const {
 | 
|    DCHECK(functions->length() == 0);
 | 
|    AbstractCode* abstract_code =
 | 
|        AbstractCode::cast(function()->shared()->bytecode_array());
 | 
| @@ -1291,6 +1309,15 @@ Code* WasmFrame::unchecked_code() const {
 | 
|    return static_cast<Code*>(isolate()->FindCodeObject(pc()));
 | 
|  }
 | 
|  
 | 
| +JSFunction* WasmFrame::function() const {
 | 
| +  // TODO(clemensh): generate the right JSFunctions once per wasm function and
 | 
| +  // cache them
 | 
| +  Factory* factory = isolate()->factory();
 | 
| +  Handle<JSFunction> fun =
 | 
| +      factory->NewFunction(factory->NewStringFromAsciiChecked("<WASM>"));
 | 
| +  return *fun;
 | 
| +}
 | 
| +
 | 
|  void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); }
 | 
|  
 | 
|  Address WasmFrame::GetCallerStackPointer() const {
 | 
| 
 |