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/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 PrintF("\nfunction: "); | 856 PrintF("\nfunction: "); |
857 function_->shared()->DebugName()->ShortPrint(); | 857 function_->shared()->DebugName()->ShortPrint(); |
858 PrintF("\ncode: "); | 858 PrintF("\ncode: "); |
859 code_->ShortPrint(); | 859 code_->ShortPrint(); |
860 if (code_->kind() == Code::FUNCTION) PrintF(" NON-OPT"); | 860 if (code_->kind() == Code::FUNCTION) PrintF(" NON-OPT"); |
861 if (code_->kind() == Code::OPTIMIZED_FUNCTION) PrintF(" OPT"); | 861 if (code_->kind() == Code::OPTIMIZED_FUNCTION) PrintF(" OPT"); |
862 PrintF("\npc: %d\n", offset_); | 862 PrintF("\npc: %d\n", offset_); |
863 } | 863 } |
864 | 864 |
865 | 865 |
866 JSFunction* OptimizedFrame::LiteralAt(FixedArray* literal_array, | |
867 int literal_id) { | |
868 if (literal_id == Translation::kSelfLiteralId) { | |
869 return function(); | |
870 } | |
871 | |
872 return JSFunction::cast(literal_array->get(literal_id)); | |
873 } | |
874 | |
875 | |
876 void OptimizedFrame::Summarize(List<FrameSummary>* frames) { | 866 void OptimizedFrame::Summarize(List<FrameSummary>* frames) { |
877 DCHECK(frames->length() == 0); | 867 DCHECK(frames->length() == 0); |
878 DCHECK(is_optimized()); | 868 DCHECK(is_optimized()); |
879 | 869 |
880 // Delegate to JS frame in absence of turbofan deoptimization. | 870 // Delegate to JS frame in absence of turbofan deoptimization. |
881 // TODO(turbofan): Revisit once we support deoptimization across the board. | 871 // TODO(turbofan): Revisit once we support deoptimization across the board. |
882 if (LookupCode()->is_turbofanned() && function()->shared()->asm_function() && | 872 if (LookupCode()->is_turbofanned() && function()->shared()->asm_function() && |
883 !FLAG_turbo_asm_deoptimization) { | 873 !FLAG_turbo_asm_deoptimization) { |
884 return JavaScriptFrame::Summarize(frames); | 874 return JavaScriptFrame::Summarize(frames); |
885 } | 875 } |
886 | 876 |
887 // We create the summary in reverse order because the frames | 877 // We create the summary in reverse order because the frames |
888 // in the deoptimization translation are ordered bottom-to-top. | 878 // in the deoptimization translation are ordered bottom-to-top. |
889 DisallowHeapAllocation no_gc; | 879 DisallowHeapAllocation no_gc; |
890 TranslatedState state(this); | 880 TranslatedState state(this); |
891 bool is_constructor = IsConstructor(); | 881 bool is_constructor = IsConstructor(); |
892 for (TranslatedFrame const& frame : state) { | 882 for (TranslatedFrame& frame : state) { |
893 switch (frame.kind()) { | 883 switch (frame.kind()) { |
894 case TranslatedFrame::kFunction: { | 884 case TranslatedFrame::kFunction: { |
895 BailoutId const ast_id = frame.node_id(); | 885 BailoutId const ast_id = frame.node_id(); |
896 JSFunction* const function = frame.raw_function(); | 886 TranslatedFrame::iterator it = frame.begin(); |
| 887 |
| 888 // Get the correct function in the optimized frame. |
| 889 JSFunction* function = JSFunction::cast(it->GetRawValue()); |
| 890 it++; |
897 | 891 |
898 // Get the correct receiver in the optimized frame. | 892 // Get the correct receiver in the optimized frame. |
899 Object* receiver = frame.front().GetRawValue(); | 893 Object* receiver = it->GetRawValue(); |
900 if (receiver == isolate()->heap()->arguments_marker()) { | 894 if (receiver == isolate()->heap()->arguments_marker()) { |
901 // TODO(jarin): Materializing a captured object (or duplicated | 895 // TODO(jarin): Materializing a captured object (or duplicated |
902 // object) is hard, we return undefined for now. This breaks the | 896 // object) is hard, we return undefined for now. This breaks the |
903 // produced stack trace, as constructor frames aren't marked as | 897 // produced stack trace, as constructor frames aren't marked as |
904 // such anymore. | 898 // such anymore. |
905 receiver = isolate()->heap()->undefined_value(); | 899 receiver = isolate()->heap()->undefined_value(); |
906 } | 900 } |
907 | 901 |
908 Code* code = function->shared()->code(); | 902 Code* code = function->shared()->code(); |
909 DeoptimizationOutputData* output_data = | 903 DeoptimizationOutputData* output_data = |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 // TODO(turbofan): Revisit once we support deoptimization across the board. | 979 // TODO(turbofan): Revisit once we support deoptimization across the board. |
986 if (LookupCode()->is_turbofanned() && function()->shared()->asm_function() && | 980 if (LookupCode()->is_turbofanned() && function()->shared()->asm_function() && |
987 !FLAG_turbo_asm_deoptimization) { | 981 !FLAG_turbo_asm_deoptimization) { |
988 return JavaScriptFrame::GetFunctions(functions); | 982 return JavaScriptFrame::GetFunctions(functions); |
989 } | 983 } |
990 | 984 |
991 DisallowHeapAllocation no_gc; | 985 DisallowHeapAllocation no_gc; |
992 TranslatedState state(this); | 986 TranslatedState state(this); |
993 for (TranslatedFrame const& frame : state) { | 987 for (TranslatedFrame const& frame : state) { |
994 if (frame.kind() == TranslatedFrame::kFunction) { | 988 if (frame.kind() == TranslatedFrame::kFunction) { |
995 functions->Add(frame.raw_function()); | 989 functions->Add(JSFunction::cast(frame.front().GetRawValue())); |
996 } | 990 } |
997 } | 991 } |
998 } | 992 } |
999 | 993 |
1000 | 994 |
1001 int ArgumentsAdaptorFrame::GetNumberOfIncomingArguments() const { | 995 int ArgumentsAdaptorFrame::GetNumberOfIncomingArguments() const { |
1002 return Smi::cast(GetExpression(0))->value(); | 996 return Smi::cast(GetExpression(0))->value(); |
1003 } | 997 } |
1004 | 998 |
1005 | 999 |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1434 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
1441 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1435 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
1442 list.Add(frame, zone); | 1436 list.Add(frame, zone); |
1443 } | 1437 } |
1444 return list.ToVector(); | 1438 return list.ToVector(); |
1445 } | 1439 } |
1446 | 1440 |
1447 | 1441 |
1448 } // namespace internal | 1442 } // namespace internal |
1449 } // namespace v8 | 1443 } // namespace v8 |
OLD | NEW |