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