Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index cda47e902af3b0fea3462b08191f81e3c16e662f..5110de6eb57ee82d14e0815181b4f8acb2953644 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -504,6 +504,8 @@ StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator, |
case ENTRY: |
case ENTRY_CONSTRUCT: |
case EXIT: |
+ case BUILTIN_CONTINUATION: |
+ case JAVA_SCRIPT_BUILTIN_CONTINUATION: |
case BUILTIN_EXIT: |
case STUB: |
case STUB_FAILURE_TRAMPOLINE: |
@@ -802,6 +804,8 @@ void StandardFrame::IterateCompiledFrame(RootVisitor* v) const { |
case ENTRY: |
case ENTRY_CONSTRUCT: |
case EXIT: |
+ case BUILTIN_CONTINUATION: |
+ case JAVA_SCRIPT_BUILTIN_CONTINUATION: |
case BUILTIN_EXIT: |
case STUB_FAILURE_TRAMPOLINE: |
case ARGUMENTS_ADAPTOR: |
@@ -1143,6 +1147,12 @@ int JavaScriptFrame::ComputeParametersCount() const { |
return GetNumberOfIncomingArguments(); |
} |
+int JavaScriptBuiltinContinuationFrame::ComputeParametersCount() const { |
+ Object* argc_object = |
+ Memory::Object_at(fp() + BuiltinContinuationFrameConstants::kArgCOffset); |
+ return Smi::cast(argc_object)->value(); |
+} |
+ |
namespace { |
bool CannotDeoptFromAsmCode(Code* code, JSFunction* function) { |
@@ -1377,7 +1387,8 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames, |
while (jsframe_count != 0) { |
frame_opcode = static_cast<Translation::Opcode>(it.Next()); |
if (frame_opcode == Translation::JS_FRAME || |
- frame_opcode == Translation::INTERPRETED_FRAME) { |
+ frame_opcode == Translation::INTERPRETED_FRAME || |
+ frame_opcode == Translation::JAVA_SCRIPT_BUILTIN_CONTINUATION_FRAME) { |
jsframe_count--; |
BailoutId const bailout_id = BailoutId(it.Next()); |
SharedFunctionInfo* const shared_info = |
@@ -1429,6 +1440,11 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames, |
Deoptimizer::GetOutputInfo(output_data, bailout_id, shared_info); |
code_offset = FullCodeGenerator::PcField::decode(entry); |
abstract_code = AbstractCode::cast(code); |
+ } else if (frame_opcode == |
+ Translation::JAVA_SCRIPT_BUILTIN_CONTINUATION_FRAME) { |
+ code_offset = 0; |
+ abstract_code = AbstractCode::cast(isolate()->builtins()->builtin( |
+ Builtins::GetBuiltinFromBailoutId(bailout_id))); |
} else { |
DCHECK_EQ(frame_opcode, Translation::INTERPRETED_FRAME); |
code_offset = bailout_id.ToInt(); // Points to current bytecode. |
@@ -1537,7 +1553,8 @@ void OptimizedFrame::GetFunctions(List<SharedFunctionInfo*>* functions) const { |
while (jsframe_count != 0) { |
opcode = static_cast<Translation::Opcode>(it.Next()); |
if (opcode == Translation::JS_FRAME || |
- opcode == Translation::INTERPRETED_FRAME) { |
+ opcode == Translation::INTERPRETED_FRAME || |
+ opcode == Translation::JAVA_SCRIPT_BUILTIN_CONTINUATION_FRAME) { |
it.Next(); // Skip bailout id. |
jsframe_count--; |