Chromium Code Reviews| Index: src/frames.cc |
| diff --git a/src/frames.cc b/src/frames.cc |
| index 8e5b530a93b095f5b42160320f9be007124adab1..7a5cb907c0263cad953116365756654850af3de8 100644 |
| --- a/src/frames.cc |
| +++ b/src/frames.cc |
| @@ -162,28 +162,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 (!iterator_.done() && !IsValidFrame(iterator_.frame())); |
|
titzer
2016/04/06 09:53:23
might as well be consistent and use done() here in
Clemens Hammacher
2016/04/06 10:18:29
Done.
|
| } |
| - |
| -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(); |
| } |
| @@ -624,6 +625,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; |
| @@ -854,8 +868,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()); |
| @@ -865,6 +878,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(); |
| @@ -996,8 +1015,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()); |
| @@ -1251,7 +1269,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()); |
| @@ -1308,6 +1326,13 @@ Code* WasmFrame::unchecked_code() const { |
| return static_cast<Code*>(isolate()->FindCodeObject(pc())); |
| } |
| +JSFunction* WasmFrame::function() const { |
| + Factory* factory = isolate()->factory(); |
|
titzer
2016/04/06 09:53:23
Add a TODO here that we need to cache these JSFunc
Clemens Hammacher
2016/04/06 10:18:29
Done.
|
| + Handle<JSFunction> fun = |
| + factory->NewFunction(factory->NewStringFromAsciiChecked("<WASM>")); |
| + return *fun; |
| +} |
| + |
| void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } |
| Address WasmFrame::GetCallerStackPointer() const { |