Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index d14646989ebfb71161bccd93a67a2ae53e742d1f..f06a9c813bd134a5b7116d781c5f42c98cf2f37e 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -657,6 +657,46 @@ bool BuiltinExitFrame::IsConstructor() const { |
return !new_target_slot_object()->IsUndefined(isolate()); |
} |
+Object* BuiltinExitFrame::GetParameter(int i) const { |
+ DCHECK(i >= 0 && i < ComputeParametersCount()); |
+ int offset = BuiltinExitFrameConstants::kArgcOffset + (i + 1) * kPointerSize; |
+ return Memory::Object_at(fp() + offset); |
+} |
+ |
+int BuiltinExitFrame::ComputeParametersCount() const { |
+ Object* argc_slot = argc_slot_object(); |
+ DCHECK(argc_slot->IsSmi()); |
+ // Argc also counts the receiver, target, new target, and argc itself as args, |
+ // therefore the real argument count is argc - 4. |
+ int argc = Smi::cast(argc_slot)->value() - 4; |
+ DCHECK(argc >= 0); |
+ return argc; |
+} |
+ |
+void BuiltinExitFrame::Print(StringStream* accumulator, PrintMode mode, |
+ int index) const { |
+ DisallowHeapAllocation no_gc; |
+ Object* receiver = this->receiver(); |
+ JSFunction* function = this->function(); |
+ |
+ accumulator->PrintSecurityTokenIfChanged(function); |
+ PrintIndex(accumulator, mode, index); |
+ accumulator->Add("builtin exit frame: "); |
+ Code* code = NULL; |
+ if (IsConstructor()) accumulator->Add("new "); |
+ accumulator->PrintFunction(function, receiver, &code); |
+ |
+ accumulator->Add("(this=%o", receiver); |
+ |
+ // Print the parameters. |
+ int parameters_count = ComputeParametersCount(); |
+ for (int i = 0; i < parameters_count; i++) { |
+ accumulator->Add(",%o", GetParameter(i)); |
+ } |
+ |
+ accumulator->Add(")\n\n"); |
+} |
+ |
Address StandardFrame::GetExpressionAddress(int n) const { |
const int offset = StandardFrameConstants::kExpressionsOffset; |
return fp() + offset - n * kPointerSize; |
@@ -1377,15 +1417,14 @@ Code* ArgumentsAdaptorFrame::unchecked_code() const { |
Builtins::kArgumentsAdaptorTrampoline); |
} |
-void BuiltinFrame::Print(StringStream* accumulator, PrintMode mode, |
- int index) const { |
- // TODO(bmeurer) |
-} |
- |
int BuiltinFrame::GetNumberOfIncomingArguments() const { |
return Smi::cast(GetExpression(0))->value(); |
} |
+void BuiltinFrame::PrintFrameKind(StringStream* accumulator) const { |
+ accumulator->Add("builtin frame: "); |
+} |
+ |
Address InternalFrame::GetCallerStackPointer() const { |
// Internal frames have no arguments. The stack pointer of the |
// caller is at a fixed offset from the frame pointer. |
@@ -1466,6 +1505,7 @@ void JavaScriptFrame::Print(StringStream* accumulator, |
accumulator->PrintSecurityTokenIfChanged(function); |
PrintIndex(accumulator, mode, index); |
+ PrintFrameKind(accumulator); |
Code* code = NULL; |
if (IsConstructor()) accumulator->Add("new "); |
accumulator->PrintFunction(function, receiver, &code); |