| 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 <memory> | 7 #include <memory> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| 11 #include "src/deoptimizer.h" | 11 #include "src/deoptimizer.h" |
| 12 #include "src/frames-inl.h" | 12 #include "src/frames-inl.h" |
| 13 #include "src/full-codegen/full-codegen.h" | 13 #include "src/full-codegen/full-codegen.h" |
| 14 #include "src/ic/ic-stats.h" | 14 #include "src/ic/ic-stats.h" |
| 15 #include "src/register-configuration.h" | 15 #include "src/register-configuration.h" |
| 16 #include "src/safepoint-table.h" | 16 #include "src/safepoint-table.h" |
| 17 #include "src/string-stream.h" | 17 #include "src/string-stream.h" |
| 18 #include "src/visitors.h" |
| 18 #include "src/vm-state-inl.h" | 19 #include "src/vm-state-inl.h" |
| 19 #include "src/wasm/wasm-module.h" | 20 #include "src/wasm/wasm-module.h" |
| 20 #include "src/wasm/wasm-objects.h" | 21 #include "src/wasm/wasm-objects.h" |
| 21 | 22 |
| 22 namespace v8 { | 23 namespace v8 { |
| 23 namespace internal { | 24 namespace internal { |
| 24 | 25 |
| 25 ReturnAddressLocationResolver | 26 ReturnAddressLocationResolver |
| 26 StackFrame::return_address_location_resolver_ = NULL; | 27 StackFrame::return_address_location_resolver_ = NULL; |
| 27 | 28 |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 *safepoint_entry = entry->safepoint_entry; | 399 *safepoint_entry = entry->safepoint_entry; |
| 399 *stack_slots = code->stack_slots(); | 400 *stack_slots = code->stack_slots(); |
| 400 return code; | 401 return code; |
| 401 } | 402 } |
| 402 | 403 |
| 403 | 404 |
| 404 #ifdef DEBUG | 405 #ifdef DEBUG |
| 405 static bool GcSafeCodeContains(HeapObject* object, Address addr); | 406 static bool GcSafeCodeContains(HeapObject* object, Address addr); |
| 406 #endif | 407 #endif |
| 407 | 408 |
| 408 | 409 void StackFrame::IteratePc(RootVisitor* v, Address* pc_address, |
| 409 void StackFrame::IteratePc(ObjectVisitor* v, Address* pc_address, | |
| 410 Address* constant_pool_address, Code* holder) { | 410 Address* constant_pool_address, Code* holder) { |
| 411 Address pc = *pc_address; | 411 Address pc = *pc_address; |
| 412 DCHECK(GcSafeCodeContains(holder, pc)); | 412 DCHECK(GcSafeCodeContains(holder, pc)); |
| 413 unsigned pc_offset = static_cast<unsigned>(pc - holder->instruction_start()); | 413 unsigned pc_offset = static_cast<unsigned>(pc - holder->instruction_start()); |
| 414 Object* code = holder; | 414 Object* code = holder; |
| 415 v->VisitPointer(&code); | 415 v->VisitRootPointer(Root::kTop, &code); |
| 416 if (code == holder) return; | 416 if (code == holder) return; |
| 417 holder = reinterpret_cast<Code*>(code); | 417 holder = reinterpret_cast<Code*>(code); |
| 418 pc = holder->instruction_start() + pc_offset; | 418 pc = holder->instruction_start() + pc_offset; |
| 419 *pc_address = pc; | 419 *pc_address = pc; |
| 420 if (FLAG_enable_embedded_constant_pool && constant_pool_address) { | 420 if (FLAG_enable_embedded_constant_pool && constant_pool_address) { |
| 421 *constant_pool_address = holder->constant_pool(); | 421 *constant_pool_address = holder->constant_pool(); |
| 422 } | 422 } |
| 423 } | 423 } |
| 424 | 424 |
| 425 | 425 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 state->constant_pool_address = reinterpret_cast<Address*>( | 594 state->constant_pool_address = reinterpret_cast<Address*>( |
| 595 fp() + ExitFrameConstants::kConstantPoolOffset); | 595 fp() + ExitFrameConstants::kConstantPoolOffset); |
| 596 } | 596 } |
| 597 } | 597 } |
| 598 | 598 |
| 599 | 599 |
| 600 void ExitFrame::SetCallerFp(Address caller_fp) { | 600 void ExitFrame::SetCallerFp(Address caller_fp) { |
| 601 Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset) = caller_fp; | 601 Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset) = caller_fp; |
| 602 } | 602 } |
| 603 | 603 |
| 604 | 604 void ExitFrame::Iterate(RootVisitor* v) const { |
| 605 void ExitFrame::Iterate(ObjectVisitor* v) const { | |
| 606 // The arguments are traversed as part of the expression stack of | 605 // The arguments are traversed as part of the expression stack of |
| 607 // the calling frame. | 606 // the calling frame. |
| 608 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 607 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
| 609 v->VisitPointer(&code_slot()); | 608 v->VisitRootPointer(Root::kTop, &code_slot()); |
| 610 } | 609 } |
| 611 | 610 |
| 612 | 611 |
| 613 Address ExitFrame::GetCallerStackPointer() const { | 612 Address ExitFrame::GetCallerStackPointer() const { |
| 614 return fp() + ExitFrameConstants::kCallerSPOffset; | 613 return fp() + ExitFrameConstants::kCallerSPOffset; |
| 615 } | 614 } |
| 616 | 615 |
| 617 | 616 |
| 618 StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) { | 617 StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) { |
| 619 if (fp == 0) return NONE; | 618 if (fp == 0) return NONE; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 } | 774 } |
| 776 | 775 |
| 777 bool StandardFrame::IsConstructor() const { return false; } | 776 bool StandardFrame::IsConstructor() const { return false; } |
| 778 | 777 |
| 779 void StandardFrame::Summarize(List<FrameSummary>* functions, | 778 void StandardFrame::Summarize(List<FrameSummary>* functions, |
| 780 FrameSummary::Mode mode) const { | 779 FrameSummary::Mode mode) const { |
| 781 // This should only be called on frames which override this method. | 780 // This should only be called on frames which override this method. |
| 782 UNREACHABLE(); | 781 UNREACHABLE(); |
| 783 } | 782 } |
| 784 | 783 |
| 785 void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { | 784 void StandardFrame::IterateCompiledFrame(RootVisitor* v) const { |
| 786 // Make sure that we're not doing "safe" stack frame iteration. We cannot | 785 // Make sure that we're not doing "safe" stack frame iteration. We cannot |
| 787 // possibly find pointers in optimized frames in that state. | 786 // possibly find pointers in optimized frames in that state. |
| 788 DCHECK(can_access_heap_objects()); | 787 DCHECK(can_access_heap_objects()); |
| 789 | 788 |
| 790 // Compute the safepoint information. | 789 // Compute the safepoint information. |
| 791 unsigned stack_slots = 0; | 790 unsigned stack_slots = 0; |
| 792 SafepointEntry safepoint_entry; | 791 SafepointEntry safepoint_entry; |
| 793 Code* code = StackFrame::GetSafepointData( | 792 Code* code = StackFrame::GetSafepointData( |
| 794 isolate(), pc(), &safepoint_entry, &stack_slots); | 793 isolate(), pc(), &safepoint_entry, &stack_slots); |
| 795 unsigned slot_space = stack_slots * kPointerSize; | 794 unsigned slot_space = stack_slots * kPointerSize; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 (frame_header_size + StandardFrameConstants::kFixedFrameSizeAboveFp); | 834 (frame_header_size + StandardFrameConstants::kFixedFrameSizeAboveFp); |
| 836 | 835 |
| 837 Object** frame_header_base = &Memory::Object_at(fp() - frame_header_size); | 836 Object** frame_header_base = &Memory::Object_at(fp() - frame_header_size); |
| 838 Object** frame_header_limit = | 837 Object** frame_header_limit = |
| 839 &Memory::Object_at(fp() - StandardFrameConstants::kCPSlotSize); | 838 &Memory::Object_at(fp() - StandardFrameConstants::kCPSlotSize); |
| 840 Object** parameters_base = &Memory::Object_at(sp()); | 839 Object** parameters_base = &Memory::Object_at(sp()); |
| 841 Object** parameters_limit = frame_header_base - slot_space / kPointerSize; | 840 Object** parameters_limit = frame_header_base - slot_space / kPointerSize; |
| 842 | 841 |
| 843 // Visit the parameters that may be on top of the saved registers. | 842 // Visit the parameters that may be on top of the saved registers. |
| 844 if (safepoint_entry.argument_count() > 0) { | 843 if (safepoint_entry.argument_count() > 0) { |
| 845 v->VisitPointers(parameters_base, | 844 v->VisitRootPointers(Root::kTop, parameters_base, |
| 846 parameters_base + safepoint_entry.argument_count()); | 845 parameters_base + safepoint_entry.argument_count()); |
| 847 parameters_base += safepoint_entry.argument_count(); | 846 parameters_base += safepoint_entry.argument_count(); |
| 848 } | 847 } |
| 849 | 848 |
| 850 // Skip saved double registers. | 849 // Skip saved double registers. |
| 851 if (safepoint_entry.has_doubles()) { | 850 if (safepoint_entry.has_doubles()) { |
| 852 // Number of doubles not known at snapshot time. | 851 // Number of doubles not known at snapshot time. |
| 853 DCHECK(!isolate()->serializer_enabled()); | 852 DCHECK(!isolate()->serializer_enabled()); |
| 854 parameters_base += RegisterConfiguration::Crankshaft() | 853 parameters_base += RegisterConfiguration::Crankshaft() |
| 855 ->num_allocatable_double_registers() * | 854 ->num_allocatable_double_registers() * |
| 856 kDoubleSize / kPointerSize; | 855 kDoubleSize / kPointerSize; |
| 857 } | 856 } |
| 858 | 857 |
| 859 // Visit the registers that contain pointers if any. | 858 // Visit the registers that contain pointers if any. |
| 860 if (safepoint_entry.HasRegisters()) { | 859 if (safepoint_entry.HasRegisters()) { |
| 861 for (int i = kNumSafepointRegisters - 1; i >=0; i--) { | 860 for (int i = kNumSafepointRegisters - 1; i >=0; i--) { |
| 862 if (safepoint_entry.HasRegisterAt(i)) { | 861 if (safepoint_entry.HasRegisterAt(i)) { |
| 863 int reg_stack_index = MacroAssembler::SafepointRegisterStackIndex(i); | 862 int reg_stack_index = MacroAssembler::SafepointRegisterStackIndex(i); |
| 864 v->VisitPointer(parameters_base + reg_stack_index); | 863 v->VisitRootPointer(Root::kTop, parameters_base + reg_stack_index); |
| 865 } | 864 } |
| 866 } | 865 } |
| 867 // Skip the words containing the register values. | 866 // Skip the words containing the register values. |
| 868 parameters_base += kNumSafepointRegisters; | 867 parameters_base += kNumSafepointRegisters; |
| 869 } | 868 } |
| 870 | 869 |
| 871 // We're done dealing with the register bits. | 870 // We're done dealing with the register bits. |
| 872 uint8_t* safepoint_bits = safepoint_entry.bits(); | 871 uint8_t* safepoint_bits = safepoint_entry.bits(); |
| 873 safepoint_bits += kNumSafepointRegisters >> kBitsPerByteLog2; | 872 safepoint_bits += kNumSafepointRegisters >> kBitsPerByteLog2; |
| 874 | 873 |
| 875 // Visit the rest of the parameters if they are tagged. | 874 // Visit the rest of the parameters if they are tagged. |
| 876 if (code->has_tagged_params()) { | 875 if (code->has_tagged_params()) { |
| 877 v->VisitPointers(parameters_base, parameters_limit); | 876 v->VisitRootPointers(Root::kTop, parameters_base, parameters_limit); |
| 878 } | 877 } |
| 879 | 878 |
| 880 // Visit pointer spill slots and locals. | 879 // Visit pointer spill slots and locals. |
| 881 for (unsigned index = 0; index < stack_slots; index++) { | 880 for (unsigned index = 0; index < stack_slots; index++) { |
| 882 int byte_index = index >> kBitsPerByteLog2; | 881 int byte_index = index >> kBitsPerByteLog2; |
| 883 int bit_index = index & (kBitsPerByte - 1); | 882 int bit_index = index & (kBitsPerByte - 1); |
| 884 if ((safepoint_bits[byte_index] & (1U << bit_index)) != 0) { | 883 if ((safepoint_bits[byte_index] & (1U << bit_index)) != 0) { |
| 885 v->VisitPointer(parameters_limit + index); | 884 v->VisitRootPointer(Root::kTop, parameters_limit + index); |
| 886 } | 885 } |
| 887 } | 886 } |
| 888 | 887 |
| 889 // Visit the return address in the callee and incoming arguments. | 888 // Visit the return address in the callee and incoming arguments. |
| 890 IteratePc(v, pc_address(), constant_pool_address(), code); | 889 IteratePc(v, pc_address(), constant_pool_address(), code); |
| 891 | 890 |
| 892 if (!is_wasm() && !is_wasm_to_js()) { | 891 if (!is_wasm() && !is_wasm_to_js()) { |
| 893 // If this frame has JavaScript ABI, visit the context (in stub and JS | 892 // If this frame has JavaScript ABI, visit the context (in stub and JS |
| 894 // frames) and the function (in JS frames). | 893 // frames) and the function (in JS frames). |
| 895 v->VisitPointers(frame_header_base, frame_header_limit); | 894 v->VisitRootPointers(Root::kTop, frame_header_base, frame_header_limit); |
| 896 } | 895 } |
| 897 } | 896 } |
| 898 | 897 |
| 899 | 898 void StubFrame::Iterate(RootVisitor* v) const { IterateCompiledFrame(v); } |
| 900 void StubFrame::Iterate(ObjectVisitor* v) const { | |
| 901 IterateCompiledFrame(v); | |
| 902 } | |
| 903 | |
| 904 | 899 |
| 905 Code* StubFrame::unchecked_code() const { | 900 Code* StubFrame::unchecked_code() const { |
| 906 return isolate()->FindCodeObject(pc()); | 901 return isolate()->FindCodeObject(pc()); |
| 907 } | 902 } |
| 908 | 903 |
| 909 | 904 |
| 910 Address StubFrame::GetCallerStackPointer() const { | 905 Address StubFrame::GetCallerStackPointer() const { |
| 911 return fp() + ExitFrameConstants::kCallerSPOffset; | 906 return fp() + ExitFrameConstants::kCallerSPOffset; |
| 912 } | 907 } |
| 913 | 908 |
| 914 | 909 |
| 915 int StubFrame::GetNumberOfIncomingArguments() const { | 910 int StubFrame::GetNumberOfIncomingArguments() const { |
| 916 return 0; | 911 return 0; |
| 917 } | 912 } |
| 918 | 913 |
| 919 int StubFrame::LookupExceptionHandlerInTable(int* stack_slots) { | 914 int StubFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
| 920 Code* code = LookupCode(); | 915 Code* code = LookupCode(); |
| 921 DCHECK(code->is_turbofanned()); | 916 DCHECK(code->is_turbofanned()); |
| 922 DCHECK_EQ(code->kind(), Code::BUILTIN); | 917 DCHECK_EQ(code->kind(), Code::BUILTIN); |
| 923 HandlerTable* table = HandlerTable::cast(code->handler_table()); | 918 HandlerTable* table = HandlerTable::cast(code->handler_table()); |
| 924 int pc_offset = static_cast<int>(pc() - code->entry()); | 919 int pc_offset = static_cast<int>(pc() - code->entry()); |
| 925 *stack_slots = code->stack_slots(); | 920 *stack_slots = code->stack_slots(); |
| 926 return table->LookupReturn(pc_offset); | 921 return table->LookupReturn(pc_offset); |
| 927 } | 922 } |
| 928 | 923 |
| 929 void OptimizedFrame::Iterate(ObjectVisitor* v) const { | 924 void OptimizedFrame::Iterate(RootVisitor* v) const { IterateCompiledFrame(v); } |
| 930 IterateCompiledFrame(v); | |
| 931 } | |
| 932 | |
| 933 | 925 |
| 934 void JavaScriptFrame::SetParameterValue(int index, Object* value) const { | 926 void JavaScriptFrame::SetParameterValue(int index, Object* value) const { |
| 935 Memory::Object_at(GetParameterSlot(index)) = value; | 927 Memory::Object_at(GetParameterSlot(index)) = value; |
| 936 } | 928 } |
| 937 | 929 |
| 938 | 930 |
| 939 bool JavaScriptFrame::IsConstructor() const { | 931 bool JavaScriptFrame::IsConstructor() const { |
| 940 Address fp = caller_fp(); | 932 Address fp = caller_fp(); |
| 941 if (has_adapted_arguments()) { | 933 if (has_adapted_arguments()) { |
| 942 // Skip the arguments adaptor frame and look at the real caller. | 934 // Skip the arguments adaptor frame and look at the real caller. |
| (...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1720 func_name[func_name_len] = '\0'; | 1712 func_name[func_name_len] = '\0'; |
| 1721 accumulator->Add("], function #%u ('%s'), pc=%p, pos=%d\n", | 1713 accumulator->Add("], function #%u ('%s'), pc=%p, pos=%d\n", |
| 1722 this->function_index(), func_name, pc, this->position()); | 1714 this->function_index(), func_name, pc, this->position()); |
| 1723 if (mode != OVERVIEW) accumulator->Add("\n"); | 1715 if (mode != OVERVIEW) accumulator->Add("\n"); |
| 1724 } | 1716 } |
| 1725 | 1717 |
| 1726 Code* WasmCompiledFrame::unchecked_code() const { | 1718 Code* WasmCompiledFrame::unchecked_code() const { |
| 1727 return isolate()->FindCodeObject(pc()); | 1719 return isolate()->FindCodeObject(pc()); |
| 1728 } | 1720 } |
| 1729 | 1721 |
| 1730 void WasmCompiledFrame::Iterate(ObjectVisitor* v) const { | 1722 void WasmCompiledFrame::Iterate(RootVisitor* v) const { |
| 1731 IterateCompiledFrame(v); | 1723 IterateCompiledFrame(v); |
| 1732 } | 1724 } |
| 1733 | 1725 |
| 1734 Address WasmCompiledFrame::GetCallerStackPointer() const { | 1726 Address WasmCompiledFrame::GetCallerStackPointer() const { |
| 1735 return fp() + ExitFrameConstants::kCallerSPOffset; | 1727 return fp() + ExitFrameConstants::kCallerSPOffset; |
| 1736 } | 1728 } |
| 1737 | 1729 |
| 1738 WasmInstanceObject* WasmCompiledFrame::wasm_instance() const { | 1730 WasmInstanceObject* WasmCompiledFrame::wasm_instance() const { |
| 1739 WasmInstanceObject* obj = wasm::GetOwningWasmInstance(LookupCode()); | 1731 WasmInstanceObject* obj = wasm::GetOwningWasmInstance(LookupCode()); |
| 1740 // This is a live stack frame; it must have a live instance. | 1732 // This is a live stack frame; it must have a live instance. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1780 | 1772 |
| 1781 int WasmCompiledFrame::LookupExceptionHandlerInTable(int* stack_slots) { | 1773 int WasmCompiledFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
| 1782 DCHECK_NOT_NULL(stack_slots); | 1774 DCHECK_NOT_NULL(stack_slots); |
| 1783 Code* code = LookupCode(); | 1775 Code* code = LookupCode(); |
| 1784 HandlerTable* table = HandlerTable::cast(code->handler_table()); | 1776 HandlerTable* table = HandlerTable::cast(code->handler_table()); |
| 1785 int pc_offset = static_cast<int>(pc() - code->entry()); | 1777 int pc_offset = static_cast<int>(pc() - code->entry()); |
| 1786 *stack_slots = code->stack_slots(); | 1778 *stack_slots = code->stack_slots(); |
| 1787 return table->LookupReturn(pc_offset); | 1779 return table->LookupReturn(pc_offset); |
| 1788 } | 1780 } |
| 1789 | 1781 |
| 1790 void WasmInterpreterEntryFrame::Iterate(ObjectVisitor* v) const { | 1782 void WasmInterpreterEntryFrame::Iterate(RootVisitor* v) const { |
| 1791 IterateCompiledFrame(v); | 1783 IterateCompiledFrame(v); |
| 1792 } | 1784 } |
| 1793 | 1785 |
| 1794 void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode, | 1786 void WasmInterpreterEntryFrame::Print(StringStream* accumulator, PrintMode mode, |
| 1795 int index) const { | 1787 int index) const { |
| 1796 PrintIndex(accumulator, mode, index); | 1788 PrintIndex(accumulator, mode, index); |
| 1797 accumulator->Add("WASM INTERPRETER ENTRY ["); | 1789 accumulator->Add("WASM INTERPRETER ENTRY ["); |
| 1798 Script* script = this->script(); | 1790 Script* script = this->script(); |
| 1799 accumulator->PrintName(script->name()); | 1791 accumulator->PrintName(script->name()); |
| 1800 accumulator->Add("]"); | 1792 accumulator->Add("]"); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2026 accumulator->Add(" [%02d] : %o", i, GetParameter(i)); | 2018 accumulator->Add(" [%02d] : %o", i, GetParameter(i)); |
| 2027 if (expected != -1 && i >= expected) { | 2019 if (expected != -1 && i >= expected) { |
| 2028 accumulator->Add(" // not passed to callee"); | 2020 accumulator->Add(" // not passed to callee"); |
| 2029 } | 2021 } |
| 2030 accumulator->Add("\n"); | 2022 accumulator->Add("\n"); |
| 2031 } | 2023 } |
| 2032 | 2024 |
| 2033 accumulator->Add("}\n\n"); | 2025 accumulator->Add("}\n\n"); |
| 2034 } | 2026 } |
| 2035 | 2027 |
| 2036 | 2028 void EntryFrame::Iterate(RootVisitor* v) const { |
| 2037 void EntryFrame::Iterate(ObjectVisitor* v) const { | |
| 2038 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 2029 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
| 2039 } | 2030 } |
| 2040 | 2031 |
| 2041 | 2032 void StandardFrame::IterateExpressions(RootVisitor* v) const { |
| 2042 void StandardFrame::IterateExpressions(ObjectVisitor* v) const { | |
| 2043 const int offset = StandardFrameConstants::kLastObjectOffset; | 2033 const int offset = StandardFrameConstants::kLastObjectOffset; |
| 2044 Object** base = &Memory::Object_at(sp()); | 2034 Object** base = &Memory::Object_at(sp()); |
| 2045 Object** limit = &Memory::Object_at(fp() + offset) + 1; | 2035 Object** limit = &Memory::Object_at(fp() + offset) + 1; |
| 2046 v->VisitPointers(base, limit); | 2036 v->VisitRootPointers(Root::kTop, base, limit); |
| 2047 } | 2037 } |
| 2048 | 2038 |
| 2049 | 2039 void JavaScriptFrame::Iterate(RootVisitor* v) const { |
| 2050 void JavaScriptFrame::Iterate(ObjectVisitor* v) const { | |
| 2051 IterateExpressions(v); | 2040 IterateExpressions(v); |
| 2052 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 2041 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
| 2053 } | 2042 } |
| 2054 | 2043 |
| 2055 void InternalFrame::Iterate(ObjectVisitor* v) const { | 2044 void InternalFrame::Iterate(RootVisitor* v) const { |
| 2056 Code* code = LookupCode(); | 2045 Code* code = LookupCode(); |
| 2057 IteratePc(v, pc_address(), constant_pool_address(), code); | 2046 IteratePc(v, pc_address(), constant_pool_address(), code); |
| 2058 // Internal frames typically do not receive any arguments, hence their stack | 2047 // Internal frames typically do not receive any arguments, hence their stack |
| 2059 // only contains tagged pointers. | 2048 // only contains tagged pointers. |
| 2060 // We are misusing the has_tagged_params flag here to tell us whether | 2049 // We are misusing the has_tagged_params flag here to tell us whether |
| 2061 // the full stack frame contains only tagged pointers or only raw values. | 2050 // the full stack frame contains only tagged pointers or only raw values. |
| 2062 // This is used for the WasmCompileLazy builtin, where we actually pass | 2051 // This is used for the WasmCompileLazy builtin, where we actually pass |
| 2063 // untagged arguments and also store untagged values on the stack. | 2052 // untagged arguments and also store untagged values on the stack. |
| 2064 if (code->has_tagged_params()) IterateExpressions(v); | 2053 if (code->has_tagged_params()) IterateExpressions(v); |
| 2065 } | 2054 } |
| 2066 | 2055 |
| 2067 | 2056 void StubFailureTrampolineFrame::Iterate(RootVisitor* v) const { |
| 2068 void StubFailureTrampolineFrame::Iterate(ObjectVisitor* v) const { | |
| 2069 Object** base = &Memory::Object_at(sp()); | 2057 Object** base = &Memory::Object_at(sp()); |
| 2070 Object** limit = &Memory::Object_at( | 2058 Object** limit = &Memory::Object_at( |
| 2071 fp() + StubFailureTrampolineFrameConstants::kFixedHeaderBottomOffset); | 2059 fp() + StubFailureTrampolineFrameConstants::kFixedHeaderBottomOffset); |
| 2072 v->VisitPointers(base, limit); | 2060 v->VisitRootPointers(Root::kTop, base, limit); |
| 2073 base = &Memory::Object_at(fp() + StandardFrameConstants::kFunctionOffset); | 2061 base = &Memory::Object_at(fp() + StandardFrameConstants::kFunctionOffset); |
| 2074 const int offset = StandardFrameConstants::kLastObjectOffset; | 2062 const int offset = StandardFrameConstants::kLastObjectOffset; |
| 2075 limit = &Memory::Object_at(fp() + offset) + 1; | 2063 limit = &Memory::Object_at(fp() + offset) + 1; |
| 2076 v->VisitPointers(base, limit); | 2064 v->VisitRootPointers(Root::kTop, base, limit); |
| 2077 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); | 2065 IteratePc(v, pc_address(), constant_pool_address(), LookupCode()); |
| 2078 } | 2066 } |
| 2079 | 2067 |
| 2080 | 2068 |
| 2081 Address StubFailureTrampolineFrame::GetCallerStackPointer() const { | 2069 Address StubFailureTrampolineFrame::GetCallerStackPointer() const { |
| 2082 return fp() + StandardFrameConstants::kCallerSPOffset; | 2070 return fp() + StandardFrameConstants::kCallerSPOffset; |
| 2083 } | 2071 } |
| 2084 | 2072 |
| 2085 | 2073 |
| 2086 Code* StubFailureTrampolineFrame::unchecked_code() const { | 2074 Code* StubFailureTrampolineFrame::unchecked_code() const { |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2277 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 2265 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 2278 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 2266 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 2279 list.Add(frame, zone); | 2267 list.Add(frame, zone); |
| 2280 } | 2268 } |
| 2281 return list.ToVector(); | 2269 return list.ToVector(); |
| 2282 } | 2270 } |
| 2283 | 2271 |
| 2284 | 2272 |
| 2285 } // namespace internal | 2273 } // namespace internal |
| 2286 } // namespace v8 | 2274 } // namespace v8 |
| OLD | NEW |