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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 } else if (IsValidStackAddress(fp)) { | 207 } else if (IsValidStackAddress(fp)) { |
208 DCHECK(fp != NULL); | 208 DCHECK(fp != NULL); |
209 state.fp = fp; | 209 state.fp = fp; |
210 state.sp = sp; | 210 state.sp = sp; |
211 state.pc_address = StackFrame::ResolveReturnAddressLocation( | 211 state.pc_address = StackFrame::ResolveReturnAddressLocation( |
212 reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp))); | 212 reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp))); |
213 // StackFrame::ComputeType will read both kContextOffset and kMarkerOffset, | 213 // StackFrame::ComputeType will read both kContextOffset and kMarkerOffset, |
214 // we check only that kMarkerOffset is within the stack bounds and do | 214 // we check only that kMarkerOffset is within the stack bounds and do |
215 // compile time check that kContextOffset slot is pushed on the stack before | 215 // compile time check that kContextOffset slot is pushed on the stack before |
216 // kMarkerOffset. | 216 // kMarkerOffset. |
217 STATIC_ASSERT(StandardFrameConstants::kMarkerOffset < | 217 STATIC_ASSERT(StandardFrameConstants::kFunctionOffset < |
218 StandardFrameConstants::kContextOffset); | 218 StandardFrameConstants::kContextOffset); |
219 Address frame_marker = fp + StandardFrameConstants::kMarkerOffset; | 219 Address frame_marker = fp + StandardFrameConstants::kFunctionOffset; |
220 if (IsValidStackAddress(frame_marker)) { | 220 if (IsValidStackAddress(frame_marker)) { |
221 type = StackFrame::ComputeType(this, &state); | 221 type = StackFrame::ComputeType(this, &state); |
222 top_frame_type_ = type; | 222 top_frame_type_ = type; |
223 } else { | 223 } else { |
224 // Mark the frame as JAVA_SCRIPT if we cannot determine its type. | 224 // Mark the frame as JAVA_SCRIPT if we cannot determine its type. |
225 // The frame anyways will be skipped. | 225 // The frame anyways will be skipped. |
226 type = StackFrame::JAVA_SCRIPT; | 226 type = StackFrame::JAVA_SCRIPT; |
227 // Top frame is incomplete so we cannot reliably determine its type. | 227 // Top frame is incomplete so we cannot reliably determine its type. |
228 top_frame_type_ = StackFrame::NONE; | 228 top_frame_type_ = StackFrame::NONE; |
229 } | 229 } |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 return (pc >= interpreter_entry_trampoline->instruction_start() && | 410 return (pc >= interpreter_entry_trampoline->instruction_start() && |
411 pc < interpreter_entry_trampoline->instruction_end()) || | 411 pc < interpreter_entry_trampoline->instruction_end()) || |
412 (pc >= interpreter_bytecode_dispatch->instruction_start() && | 412 (pc >= interpreter_bytecode_dispatch->instruction_start() && |
413 pc < interpreter_bytecode_dispatch->instruction_end()); | 413 pc < interpreter_bytecode_dispatch->instruction_end()); |
414 } | 414 } |
415 | 415 |
416 StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator, | 416 StackFrame::Type StackFrame::ComputeType(const StackFrameIteratorBase* iterator, |
417 State* state) { | 417 State* state) { |
418 DCHECK(state->fp != NULL); | 418 DCHECK(state->fp != NULL); |
419 | 419 |
| 420 Object* marker = Memory::Object_at( |
| 421 state->fp + CommonFrameConstants::kContextOrFrameTypeOffset); |
420 if (!iterator->can_access_heap_objects_) { | 422 if (!iterator->can_access_heap_objects_) { |
421 // TODO(titzer): "can_access_heap_objects" is kind of bogus. It really | 423 // TODO(titzer): "can_access_heap_objects" is kind of bogus. It really |
422 // means that we are being called from the profiler, which can interrupt | 424 // means that we are being called from the profiler, which can interrupt |
423 // the VM with a signal at any arbitrary instruction, with essentially | 425 // the VM with a signal at any arbitrary instruction, with essentially |
424 // anything on the stack. So basically none of these checks are 100% | 426 // anything on the stack. So basically none of these checks are 100% |
425 // reliable. | 427 // reliable. |
426 #if defined(USE_SIMULATOR) | 428 #if defined(USE_SIMULATOR) |
427 MSAN_MEMORY_IS_INITIALIZED( | 429 MSAN_MEMORY_IS_INITIALIZED( |
428 state->fp + StandardFrameConstants::kContextOffset, kPointerSize); | 430 state->fp + StandardFrameConstants::kContextOffset, kPointerSize); |
429 MSAN_MEMORY_IS_INITIALIZED( | 431 MSAN_MEMORY_IS_INITIALIZED( |
430 state->fp + StandardFrameConstants::kMarkerOffset, kPointerSize); | 432 state->fp + StandardFrameConstants::kMarkerOffset, kPointerSize); |
431 #endif | 433 #endif |
432 if (StandardFrame::IsArgumentsAdaptorFrame(state->fp)) { | 434 Object* maybe_function = |
433 // An adapter frame has a special SMI constant for the context and | 435 Memory::Object_at(state->fp + StandardFrameConstants::kFunctionOffset); |
434 // is not distinguished through the marker. | 436 if (!marker->IsSmi()) { |
435 return ARGUMENTS_ADAPTOR; | 437 if (maybe_function->IsSmi()) { |
| 438 return NONE; |
| 439 } else if (FLAG_ignition && IsInterpreterFramePc(iterator->isolate(), |
| 440 *(state->pc_address))) { |
| 441 return INTERPRETED; |
| 442 } else { |
| 443 return JAVA_SCRIPT; |
| 444 } |
436 } | 445 } |
437 Object* marker = | 446 } else { |
438 Memory::Object_at(state->fp + StandardFrameConstants::kMarkerOffset); | 447 // Look up the code object to figure out the type of the stack frame. |
439 if (marker->IsSmi()) { | 448 Code* code_obj = |
440 return static_cast<StackFrame::Type>(Smi::cast(marker)->value()); | 449 GetContainingCode(iterator->isolate(), *(state->pc_address)); |
441 } else if (FLAG_ignition && IsInterpreterFramePc(iterator->isolate(), | 450 if (code_obj != nullptr) { |
442 *(state->pc_address))) { | 451 if (code_obj->is_interpreter_entry_trampoline() || |
443 return INTERPRETED; | 452 code_obj->is_interpreter_enter_bytecode_dispatch()) { |
| 453 return INTERPRETED; |
| 454 } |
| 455 switch (code_obj->kind()) { |
| 456 case Code::FUNCTION: |
| 457 return JAVA_SCRIPT; |
| 458 case Code::OPTIMIZED_FUNCTION: |
| 459 return OPTIMIZED; |
| 460 case Code::WASM_FUNCTION: |
| 461 return WASM; |
| 462 case Code::WASM_TO_JS_FUNCTION: |
| 463 return WASM_TO_JS; |
| 464 case Code::JS_TO_WASM_FUNCTION: |
| 465 return JS_TO_WASM; |
| 466 default: |
| 467 // All other types should have an explicit marker |
| 468 break; |
| 469 } |
444 } else { | 470 } else { |
445 return JAVA_SCRIPT; | 471 return NONE; |
446 } | 472 } |
447 } | 473 } |
448 | 474 |
449 // Look up the code object to figure out the type of the stack frame. | 475 DCHECK(marker->IsSmi()); |
450 Code* code_obj = GetContainingCode(iterator->isolate(), *(state->pc_address)); | 476 StackFrame::Type candidate = |
451 | 477 static_cast<StackFrame::Type>(Smi::cast(marker)->value()); |
452 Object* marker = | 478 switch (candidate) { |
453 Memory::Object_at(state->fp + StandardFrameConstants::kMarkerOffset); | 479 case ENTRY: |
454 if (code_obj != nullptr) { | 480 case ENTRY_CONSTRUCT: |
455 switch (code_obj->kind()) { | 481 case EXIT: |
456 case Code::FUNCTION: | 482 case STUB: |
457 return JAVA_SCRIPT; | 483 case STUB_FAILURE_TRAMPOLINE: |
458 case Code::OPTIMIZED_FUNCTION: | 484 case INTERNAL: |
459 return OPTIMIZED; | 485 case CONSTRUCT: |
460 case Code::WASM_FUNCTION: | 486 case ARGUMENTS_ADAPTOR: |
461 return WASM; | 487 return candidate; |
462 case Code::WASM_TO_JS_FUNCTION: | 488 case JS_TO_WASM: |
463 return WASM_TO_JS; | 489 case WASM_TO_JS: |
464 case Code::JS_TO_WASM_FUNCTION: | 490 case WASM: |
465 return JS_TO_WASM; | 491 case JAVA_SCRIPT: |
466 case Code::BUILTIN: | 492 case OPTIMIZED: |
467 if (!marker->IsSmi()) { | 493 case INTERPRETED: |
468 if (StandardFrame::IsArgumentsAdaptorFrame(state->fp)) { | 494 default: |
469 // An adapter frame has a special SMI constant for the context and | 495 // Unoptimized and optimized JavaScript frames, including |
470 // is not distinguished through the marker. | 496 // interpreted frames, should never have a StackFrame::Type |
471 return ARGUMENTS_ADAPTOR; | 497 // marker. If we find one, we're likely being called from the |
472 } else { | 498 // profiler in a bogus stack frame. |
473 // The interpreter entry trampoline has a non-SMI marker. | 499 return NONE; |
474 DCHECK(code_obj->is_interpreter_entry_trampoline() || | |
475 code_obj->is_interpreter_enter_bytecode_dispatch()); | |
476 return INTERPRETED; | |
477 } | |
478 } | |
479 break; // Marker encodes the frame type. | |
480 case Code::HANDLER: | |
481 if (!marker->IsSmi()) { | |
482 // Only hydrogen code stub handlers can have a non-SMI marker. | |
483 DCHECK(code_obj->is_hydrogen_stub()); | |
484 return OPTIMIZED; | |
485 } | |
486 break; // Marker encodes the frame type. | |
487 default: | |
488 break; // Marker encodes the frame type. | |
489 } | |
490 } | 500 } |
491 | |
492 // Didn't find a code object, or the code kind wasn't specific enough. | |
493 // The marker should encode the frame type. | |
494 return static_cast<StackFrame::Type>(Smi::cast(marker)->value()); | |
495 } | 501 } |
496 | 502 |
497 | 503 |
498 #ifdef DEBUG | 504 #ifdef DEBUG |
499 bool StackFrame::can_access_heap_objects() const { | 505 bool StackFrame::can_access_heap_objects() const { |
500 return iterator_->can_access_heap_objects_; | 506 return iterator_->can_access_heap_objects_; |
501 } | 507 } |
502 #endif | 508 #endif |
503 | 509 |
504 | 510 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 | 578 |
573 void ExitFrame::Iterate(ObjectVisitor* v) const { | 579 void ExitFrame::Iterate(ObjectVisitor* v) const { |
574 // The arguments are traversed as part of the expression stack of | 580 // The arguments are traversed as part of the expression stack of |
575 // the calling frame. | 581 // the calling frame. |
576 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 582 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
577 v->VisitPointer(&code_slot()); | 583 v->VisitPointer(&code_slot()); |
578 } | 584 } |
579 | 585 |
580 | 586 |
581 Address ExitFrame::GetCallerStackPointer() const { | 587 Address ExitFrame::GetCallerStackPointer() const { |
582 return fp() + ExitFrameConstants::kCallerSPDisplacement; | 588 return fp() + ExitFrameConstants::kCallerSPOffset; |
583 } | 589 } |
584 | 590 |
585 | 591 |
586 StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) { | 592 StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) { |
587 if (fp == 0) return NONE; | 593 if (fp == 0) return NONE; |
588 Address sp = ComputeStackPointer(fp); | 594 Address sp = ComputeStackPointer(fp); |
589 FillState(fp, sp, state); | 595 FillState(fp, sp, state); |
590 DCHECK(*state->pc_address != NULL); | 596 DCHECK(*state->pc_address != NULL); |
591 return EXIT; | 597 return EXIT; |
592 } | 598 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { | 654 void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { |
649 // Make sure that we're not doing "safe" stack frame iteration. We cannot | 655 // Make sure that we're not doing "safe" stack frame iteration. We cannot |
650 // possibly find pointers in optimized frames in that state. | 656 // possibly find pointers in optimized frames in that state. |
651 DCHECK(can_access_heap_objects()); | 657 DCHECK(can_access_heap_objects()); |
652 | 658 |
653 // Compute the safepoint information. | 659 // Compute the safepoint information. |
654 unsigned stack_slots = 0; | 660 unsigned stack_slots = 0; |
655 SafepointEntry safepoint_entry; | 661 SafepointEntry safepoint_entry; |
656 Code* code = StackFrame::GetSafepointData( | 662 Code* code = StackFrame::GetSafepointData( |
657 isolate(), pc(), &safepoint_entry, &stack_slots); | 663 isolate(), pc(), &safepoint_entry, &stack_slots); |
658 unsigned slot_space = | 664 unsigned slot_space = stack_slots * kPointerSize; |
659 stack_slots * kPointerSize - StandardFrameConstants::kFixedFrameSize; | |
660 | 665 |
661 // Visit the outgoing parameters. | 666 // Determine the fixed header and spill slot area size. |
| 667 int frame_header_size = StandardFrameConstants::kFixedFrameSizeFromFp; |
| 668 Object* marker = Memory::Object_at(fp() - kPointerSize); |
| 669 if (marker->IsSmi()) { |
| 670 StackFrame::Type candidate = |
| 671 static_cast<StackFrame::Type>(Smi::cast(marker)->value()); |
| 672 switch (candidate) { |
| 673 case ENTRY: |
| 674 case ENTRY_CONSTRUCT: |
| 675 case EXIT: |
| 676 case STUB_FAILURE_TRAMPOLINE: |
| 677 case ARGUMENTS_ADAPTOR: |
| 678 case STUB: |
| 679 case INTERNAL: |
| 680 case CONSTRUCT: |
| 681 case JS_TO_WASM: |
| 682 case WASM_TO_JS: |
| 683 case WASM: |
| 684 frame_header_size = TypedFrameConstants::kFixedFrameSizeFromFp; |
| 685 break; |
| 686 case JAVA_SCRIPT: |
| 687 case OPTIMIZED: |
| 688 case INTERPRETED: |
| 689 // These frame types have a context, but they are actually stored |
| 690 // in the place on the stack that one finds the frame type. |
| 691 UNREACHABLE(); |
| 692 break; |
| 693 case NONE: |
| 694 case NUMBER_OF_TYPES: |
| 695 case MANUAL: |
| 696 UNREACHABLE(); |
| 697 break; |
| 698 } |
| 699 } |
| 700 slot_space -= |
| 701 (frame_header_size + StandardFrameConstants::kFixedFrameSizeAboveFp); |
| 702 |
| 703 Object** frame_header_base = &Memory::Object_at(fp() - frame_header_size); |
| 704 Object** frame_header_limit = &Memory::Object_at(fp()); |
662 Object** parameters_base = &Memory::Object_at(sp()); | 705 Object** parameters_base = &Memory::Object_at(sp()); |
663 Object** parameters_limit = &Memory::Object_at( | 706 Object** parameters_limit = frame_header_base - slot_space / kPointerSize; |
664 fp() + JavaScriptFrameConstants::kFunctionOffset - slot_space); | |
665 | 707 |
666 // Visit the parameters that may be on top of the saved registers. | 708 // Visit the parameters that may be on top of the saved registers. |
667 if (safepoint_entry.argument_count() > 0) { | 709 if (safepoint_entry.argument_count() > 0) { |
668 v->VisitPointers(parameters_base, | 710 v->VisitPointers(parameters_base, |
669 parameters_base + safepoint_entry.argument_count()); | 711 parameters_base + safepoint_entry.argument_count()); |
670 parameters_base += safepoint_entry.argument_count(); | 712 parameters_base += safepoint_entry.argument_count(); |
671 } | 713 } |
672 | 714 |
673 // Skip saved double registers. | 715 // Skip saved double registers. |
674 if (safepoint_entry.has_doubles()) { | 716 if (safepoint_entry.has_doubles()) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 v->VisitPointer(parameters_limit + index); | 749 v->VisitPointer(parameters_limit + index); |
708 } | 750 } |
709 } | 751 } |
710 | 752 |
711 // Visit the return address in the callee and incoming arguments. | 753 // Visit the return address in the callee and incoming arguments. |
712 IteratePc(v, pc_address(), constant_pool_address(), code); | 754 IteratePc(v, pc_address(), constant_pool_address(), code); |
713 | 755 |
714 if (!is_wasm() && !is_wasm_to_js()) { | 756 if (!is_wasm() && !is_wasm_to_js()) { |
715 // Visit the context in stub frame and JavaScript frame. | 757 // Visit the context in stub frame and JavaScript frame. |
716 // Visit the function in JavaScript frame. | 758 // Visit the function in JavaScript frame. |
717 Object** fixed_base = | 759 v->VisitPointers(frame_header_base, frame_header_limit); |
718 &Memory::Object_at(fp() + StandardFrameConstants::kMarkerOffset); | |
719 Object** fixed_limit = &Memory::Object_at(fp()); | |
720 v->VisitPointers(fixed_base, fixed_limit); | |
721 } | 760 } |
722 } | 761 } |
723 | 762 |
724 | 763 |
725 void StubFrame::Iterate(ObjectVisitor* v) const { | 764 void StubFrame::Iterate(ObjectVisitor* v) const { |
726 IterateCompiledFrame(v); | 765 IterateCompiledFrame(v); |
727 } | 766 } |
728 | 767 |
729 | 768 |
730 Code* StubFrame::unchecked_code() const { | 769 Code* StubFrame::unchecked_code() const { |
731 return static_cast<Code*>(isolate()->FindCodeObject(pc())); | 770 return static_cast<Code*>(isolate()->FindCodeObject(pc())); |
732 } | 771 } |
733 | 772 |
734 | 773 |
735 Address StubFrame::GetCallerStackPointer() const { | 774 Address StubFrame::GetCallerStackPointer() const { |
736 return fp() + ExitFrameConstants::kCallerSPDisplacement; | 775 return fp() + ExitFrameConstants::kCallerSPOffset; |
737 } | 776 } |
738 | 777 |
739 | 778 |
740 int StubFrame::GetNumberOfIncomingArguments() const { | 779 int StubFrame::GetNumberOfIncomingArguments() const { |
741 return 0; | 780 return 0; |
742 } | 781 } |
743 | 782 |
744 | 783 |
745 void OptimizedFrame::Iterate(ObjectVisitor* v) const { | 784 void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
746 IterateCompiledFrame(v); | 785 IterateCompiledFrame(v); |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 accumulator->Add("wasm frame"); | 1273 accumulator->Add("wasm frame"); |
1235 } | 1274 } |
1236 | 1275 |
1237 Code* WasmFrame::unchecked_code() const { | 1276 Code* WasmFrame::unchecked_code() const { |
1238 return static_cast<Code*>(isolate()->FindCodeObject(pc())); | 1277 return static_cast<Code*>(isolate()->FindCodeObject(pc())); |
1239 } | 1278 } |
1240 | 1279 |
1241 void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } | 1280 void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } |
1242 | 1281 |
1243 Address WasmFrame::GetCallerStackPointer() const { | 1282 Address WasmFrame::GetCallerStackPointer() const { |
1244 return fp() + ExitFrameConstants::kCallerSPDisplacement; | 1283 return fp() + ExitFrameConstants::kCallerSPOffset; |
1245 } | 1284 } |
1246 | 1285 |
1247 namespace { | 1286 namespace { |
1248 | 1287 |
1249 | 1288 |
1250 void PrintFunctionSource(StringStream* accumulator, SharedFunctionInfo* shared, | 1289 void PrintFunctionSource(StringStream* accumulator, SharedFunctionInfo* shared, |
1251 Code* code) { | 1290 Code* code) { |
1252 if (FLAG_max_stack_trace_source_length != 0 && code != NULL) { | 1291 if (FLAG_max_stack_trace_source_length != 0 && code != NULL) { |
1253 std::ostringstream os; | 1292 std::ostringstream os; |
1254 os << "--------- s o u r c e c o d e ---------\n" | 1293 os << "--------- s o u r c e c o d e ---------\n" |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1451 void InternalFrame::Iterate(ObjectVisitor* v) const { | 1490 void InternalFrame::Iterate(ObjectVisitor* v) const { |
1452 // Internal frames only have object pointers on the expression stack | 1491 // Internal frames only have object pointers on the expression stack |
1453 // as they never have any arguments. | 1492 // as they never have any arguments. |
1454 IterateExpressions(v); | 1493 IterateExpressions(v); |
1455 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 1494 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
1456 } | 1495 } |
1457 | 1496 |
1458 | 1497 |
1459 void StubFailureTrampolineFrame::Iterate(ObjectVisitor* v) const { | 1498 void StubFailureTrampolineFrame::Iterate(ObjectVisitor* v) const { |
1460 Object** base = &Memory::Object_at(sp()); | 1499 Object** base = &Memory::Object_at(sp()); |
1461 Object** limit = &Memory::Object_at(fp() + | 1500 Object** limit = &Memory::Object_at( |
1462 kFirstRegisterParameterFrameOffset); | 1501 fp() + StubFailureTrampolineFrameConstants::kFixedHeaderBottomOffset); |
1463 v->VisitPointers(base, limit); | 1502 v->VisitPointers(base, limit); |
1464 base = &Memory::Object_at(fp() + StandardFrameConstants::kMarkerOffset); | 1503 base = &Memory::Object_at(fp() + StandardFrameConstants::kFunctionOffset); |
1465 const int offset = StandardFrameConstants::kLastObjectOffset; | 1504 const int offset = StandardFrameConstants::kLastObjectOffset; |
1466 limit = &Memory::Object_at(fp() + offset) + 1; | 1505 limit = &Memory::Object_at(fp() + offset) + 1; |
1467 v->VisitPointers(base, limit); | 1506 v->VisitPointers(base, limit); |
1468 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 1507 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
1469 } | 1508 } |
1470 | 1509 |
1471 | 1510 |
1472 Address StubFailureTrampolineFrame::GetCallerStackPointer() const { | 1511 Address StubFailureTrampolineFrame::GetCallerStackPointer() const { |
1473 return fp() + StandardFrameConstants::kCallerSPOffset; | 1512 return fp() + StandardFrameConstants::kCallerSPOffset; |
1474 } | 1513 } |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1706 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
1668 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1707 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
1669 list.Add(frame, zone); | 1708 list.Add(frame, zone); |
1670 } | 1709 } |
1671 return list.ToVector(); | 1710 return list.ToVector(); |
1672 } | 1711 } |
1673 | 1712 |
1674 | 1713 |
1675 } // namespace internal | 1714 } // namespace internal |
1676 } // namespace v8 | 1715 } // namespace v8 |
OLD | NEW |