OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/frames.h" | 5 #include "src/frames.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/ast/scopeinfo.h" | 10 #include "src/ast/scopeinfo.h" |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 JSFunction* BuiltinExitFrame::function() const { | 650 JSFunction* BuiltinExitFrame::function() const { |
651 return JSFunction::cast(target_slot_object()); | 651 return JSFunction::cast(target_slot_object()); |
652 } | 652 } |
653 | 653 |
654 Object* BuiltinExitFrame::receiver() const { return receiver_slot_object(); } | 654 Object* BuiltinExitFrame::receiver() const { return receiver_slot_object(); } |
655 | 655 |
656 bool BuiltinExitFrame::IsConstructor() const { | 656 bool BuiltinExitFrame::IsConstructor() const { |
657 return !new_target_slot_object()->IsUndefined(isolate()); | 657 return !new_target_slot_object()->IsUndefined(isolate()); |
658 } | 658 } |
659 | 659 |
| 660 Object* BuiltinExitFrame::GetParameter(int i) const { |
| 661 DCHECK(i >= 0 && i < ComputeParametersCount()); |
| 662 int offset = BuiltinExitFrameConstants::kArgcOffset + (i + 1) * kPointerSize; |
| 663 return Memory::Object_at(fp() + offset); |
| 664 } |
| 665 |
| 666 int BuiltinExitFrame::ComputeParametersCount() const { |
| 667 Object* argc_slot = argc_slot_object(); |
| 668 DCHECK(argc_slot->IsSmi()); |
| 669 // Argc also counts the receiver, target, new target, and argc itself as args, |
| 670 // therefore the real argument count is argc - 4. |
| 671 int argc = Smi::cast(argc_slot)->value() - 4; |
| 672 DCHECK(argc >= 0); |
| 673 return argc; |
| 674 } |
| 675 |
| 676 void BuiltinExitFrame::Print(StringStream* accumulator, PrintMode mode, |
| 677 int index) const { |
| 678 DisallowHeapAllocation no_gc; |
| 679 Object* receiver = this->receiver(); |
| 680 JSFunction* function = this->function(); |
| 681 |
| 682 accumulator->PrintSecurityTokenIfChanged(function); |
| 683 PrintIndex(accumulator, mode, index); |
| 684 accumulator->Add("builtin exit frame: "); |
| 685 Code* code = NULL; |
| 686 if (IsConstructor()) accumulator->Add("new "); |
| 687 accumulator->PrintFunction(function, receiver, &code); |
| 688 |
| 689 accumulator->Add("(this=%o", receiver); |
| 690 |
| 691 // Print the parameters. |
| 692 int parameters_count = ComputeParametersCount(); |
| 693 for (int i = 0; i < parameters_count; i++) { |
| 694 accumulator->Add(",%o", GetParameter(i)); |
| 695 } |
| 696 |
| 697 accumulator->Add(")\n\n"); |
| 698 } |
| 699 |
660 Address StandardFrame::GetExpressionAddress(int n) const { | 700 Address StandardFrame::GetExpressionAddress(int n) const { |
661 const int offset = StandardFrameConstants::kExpressionsOffset; | 701 const int offset = StandardFrameConstants::kExpressionsOffset; |
662 return fp() + offset - n * kPointerSize; | 702 return fp() + offset - n * kPointerSize; |
663 } | 703 } |
664 | 704 |
665 Address InterpretedFrame::GetExpressionAddress(int n) const { | 705 Address InterpretedFrame::GetExpressionAddress(int n) const { |
666 const int offset = InterpreterFrameConstants::kExpressionsOffset; | 706 const int offset = InterpreterFrameConstants::kExpressionsOffset; |
667 return fp() + offset - n * kPointerSize; | 707 return fp() + offset - n * kPointerSize; |
668 } | 708 } |
669 | 709 |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 int ArgumentsAdaptorFrame::GetLength(Address fp) { | 1410 int ArgumentsAdaptorFrame::GetLength(Address fp) { |
1371 const int offset = ArgumentsAdaptorFrameConstants::kLengthOffset; | 1411 const int offset = ArgumentsAdaptorFrameConstants::kLengthOffset; |
1372 return Smi::cast(Memory::Object_at(fp + offset))->value(); | 1412 return Smi::cast(Memory::Object_at(fp + offset))->value(); |
1373 } | 1413 } |
1374 | 1414 |
1375 Code* ArgumentsAdaptorFrame::unchecked_code() const { | 1415 Code* ArgumentsAdaptorFrame::unchecked_code() const { |
1376 return isolate()->builtins()->builtin( | 1416 return isolate()->builtins()->builtin( |
1377 Builtins::kArgumentsAdaptorTrampoline); | 1417 Builtins::kArgumentsAdaptorTrampoline); |
1378 } | 1418 } |
1379 | 1419 |
1380 void BuiltinFrame::Print(StringStream* accumulator, PrintMode mode, | |
1381 int index) const { | |
1382 // TODO(bmeurer) | |
1383 } | |
1384 | |
1385 int BuiltinFrame::GetNumberOfIncomingArguments() const { | 1420 int BuiltinFrame::GetNumberOfIncomingArguments() const { |
1386 return Smi::cast(GetExpression(0))->value(); | 1421 return Smi::cast(GetExpression(0))->value(); |
1387 } | 1422 } |
1388 | 1423 |
| 1424 void BuiltinFrame::PrintFrameKind(StringStream* accumulator) const { |
| 1425 accumulator->Add("builtin frame: "); |
| 1426 } |
| 1427 |
1389 Address InternalFrame::GetCallerStackPointer() const { | 1428 Address InternalFrame::GetCallerStackPointer() const { |
1390 // Internal frames have no arguments. The stack pointer of the | 1429 // Internal frames have no arguments. The stack pointer of the |
1391 // caller is at a fixed offset from the frame pointer. | 1430 // caller is at a fixed offset from the frame pointer. |
1392 return fp() + StandardFrameConstants::kCallerSPOffset; | 1431 return fp() + StandardFrameConstants::kCallerSPOffset; |
1393 } | 1432 } |
1394 | 1433 |
1395 Code* InternalFrame::unchecked_code() const { | 1434 Code* InternalFrame::unchecked_code() const { |
1396 const int offset = InternalFrameConstants::kCodeOffset; | 1435 const int offset = InternalFrameConstants::kCodeOffset; |
1397 Object* code = Memory::Object_at(fp() + offset); | 1436 Object* code = Memory::Object_at(fp() + offset); |
1398 DCHECK(code != NULL); | 1437 DCHECK(code != NULL); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 | 1498 |
1460 void JavaScriptFrame::Print(StringStream* accumulator, | 1499 void JavaScriptFrame::Print(StringStream* accumulator, |
1461 PrintMode mode, | 1500 PrintMode mode, |
1462 int index) const { | 1501 int index) const { |
1463 DisallowHeapAllocation no_gc; | 1502 DisallowHeapAllocation no_gc; |
1464 Object* receiver = this->receiver(); | 1503 Object* receiver = this->receiver(); |
1465 JSFunction* function = this->function(); | 1504 JSFunction* function = this->function(); |
1466 | 1505 |
1467 accumulator->PrintSecurityTokenIfChanged(function); | 1506 accumulator->PrintSecurityTokenIfChanged(function); |
1468 PrintIndex(accumulator, mode, index); | 1507 PrintIndex(accumulator, mode, index); |
| 1508 PrintFrameKind(accumulator); |
1469 Code* code = NULL; | 1509 Code* code = NULL; |
1470 if (IsConstructor()) accumulator->Add("new "); | 1510 if (IsConstructor()) accumulator->Add("new "); |
1471 accumulator->PrintFunction(function, receiver, &code); | 1511 accumulator->PrintFunction(function, receiver, &code); |
1472 | 1512 |
1473 // Get scope information for nicer output, if possible. If code is NULL, or | 1513 // Get scope information for nicer output, if possible. If code is NULL, or |
1474 // doesn't contain scope info, scope_info will return 0 for the number of | 1514 // doesn't contain scope info, scope_info will return 0 for the number of |
1475 // parameters, stack local variables, context local variables, stack slots, | 1515 // parameters, stack local variables, context local variables, stack slots, |
1476 // or context slots. | 1516 // or context slots. |
1477 SharedFunctionInfo* shared = function->shared(); | 1517 SharedFunctionInfo* shared = function->shared(); |
1478 ScopeInfo* scope_info = shared->scope_info(); | 1518 ScopeInfo* scope_info = shared->scope_info(); |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1869 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1909 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
1870 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1910 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
1871 list.Add(frame, zone); | 1911 list.Add(frame, zone); |
1872 } | 1912 } |
1873 return list.ToVector(); | 1913 return list.ToVector(); |
1874 } | 1914 } |
1875 | 1915 |
1876 | 1916 |
1877 } // namespace internal | 1917 } // namespace internal |
1878 } // namespace v8 | 1918 } // namespace v8 |
OLD | NEW |