Chromium Code Reviews| 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 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 940 Translation::Opcode opcode = static_cast<Translation::Opcode>(it.Next()); | 940 Translation::Opcode opcode = static_cast<Translation::Opcode>(it.Next()); |
| 941 DCHECK_EQ(Translation::BEGIN, opcode); | 941 DCHECK_EQ(Translation::BEGIN, opcode); |
| 942 it.Next(); // Drop frame count. | 942 it.Next(); // Drop frame count. |
| 943 int jsframe_count = it.Next(); | 943 int jsframe_count = it.Next(); |
| 944 | 944 |
| 945 // We create the summary in reverse order because the frames | 945 // We create the summary in reverse order because the frames |
| 946 // in the deoptimization translation are ordered bottom-to-top. | 946 // in the deoptimization translation are ordered bottom-to-top. |
| 947 bool is_constructor = IsConstructor(); | 947 bool is_constructor = IsConstructor(); |
| 948 while (jsframe_count != 0) { | 948 while (jsframe_count != 0) { |
| 949 opcode = static_cast<Translation::Opcode>(it.Next()); | 949 opcode = static_cast<Translation::Opcode>(it.Next()); |
| 950 if (opcode == Translation::JS_FRAME) { | 950 if (opcode == Translation::JS_FRAME || |
| 951 opcode == Translation::INTERPRETED_FRAME) { | |
| 951 jsframe_count--; | 952 jsframe_count--; |
| 952 BailoutId const ast_id = BailoutId(it.Next()); | 953 BailoutId const ast_id = BailoutId(it.Next()); |
| 953 SharedFunctionInfo* const shared_info = | 954 SharedFunctionInfo* const shared_info = |
| 954 SharedFunctionInfo::cast(literal_array->get(it.Next())); | 955 SharedFunctionInfo::cast(literal_array->get(it.Next())); |
| 955 it.Next(); // Skip height. | 956 it.Next(); // Skip height. |
| 956 | 957 |
| 957 // The translation commands are ordered and the function is always | 958 // The translation commands are ordered and the function is always |
| 958 // at the first position, and the receiver is next. | 959 // at the first position, and the receiver is next. |
| 959 opcode = static_cast<Translation::Opcode>(it.Next()); | 960 opcode = static_cast<Translation::Opcode>(it.Next()); |
| 960 | 961 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 986 // The receiver is not in a stack slot nor in a literal. We give up. | 987 // The receiver is not in a stack slot nor in a literal. We give up. |
| 987 it.Skip(Translation::NumberOfOperandsFor(opcode)); | 988 it.Skip(Translation::NumberOfOperandsFor(opcode)); |
| 988 // TODO(3029): Materializing a captured object (or duplicated | 989 // TODO(3029): Materializing a captured object (or duplicated |
| 989 // object) is hard, we return undefined for now. This breaks the | 990 // object) is hard, we return undefined for now. This breaks the |
| 990 // produced stack trace, as constructor frames aren't marked as | 991 // produced stack trace, as constructor frames aren't marked as |
| 991 // such anymore. | 992 // such anymore. |
| 992 receiver = isolate()->heap()->undefined_value(); | 993 receiver = isolate()->heap()->undefined_value(); |
| 993 } | 994 } |
| 994 | 995 |
| 995 Code* const code = shared_info->code(); | 996 Code* const code = shared_info->code(); |
| 996 DeoptimizationOutputData* const output_data = | |
| 997 DeoptimizationOutputData::cast(code->deoptimization_data()); | |
| 998 unsigned const entry = | |
| 999 Deoptimizer::GetOutputInfo(output_data, ast_id, shared_info); | |
| 1000 unsigned const pc_offset = | |
| 1001 FullCodeGenerator::PcField::decode(entry) + Code::kHeaderSize; | |
| 1002 DCHECK_NE(0U, pc_offset); | |
| 1003 | 997 |
| 998 unsigned pc_offset; | |
| 999 if (opcode == Translation::JS_FRAME) { | |
| 1000 DeoptimizationOutputData* const output_data = | |
| 1001 DeoptimizationOutputData::cast(code->deoptimization_data()); | |
| 1002 unsigned const entry = | |
| 1003 Deoptimizer::GetOutputInfo(output_data, ast_id, shared_info); | |
| 1004 pc_offset = | |
| 1005 FullCodeGenerator::PcField::decode(entry) + Code::kHeaderSize; | |
| 1006 DCHECK_NE(0U, pc_offset); | |
| 1007 } else { | |
| 1008 // TODO(rmcilroy): Modify FrameSummary to enable us to summarize | |
| 1009 // based on the BytecodeArray and bytecode offset. | |
|
Jarin
2015/12/17 13:35:09
How about DCHECK_EQ(opcode, Translation::INTERPRET
rmcilroy
2015/12/17 23:49:54
I had this originally, but opcode gets changed in
Jarin
2015/12/18 08:58:21
Thanks (I am actually surprised that your previous
rmcilroy
2015/12/18 15:18:10
Yeah, I think it was broken and must have always h
| |
| 1010 pc_offset = 0; | |
| 1011 } | |
| 1004 FrameSummary summary(receiver, function, code, pc_offset, is_constructor); | 1012 FrameSummary summary(receiver, function, code, pc_offset, is_constructor); |
| 1005 frames->Add(summary); | 1013 frames->Add(summary); |
| 1006 is_constructor = false; | 1014 is_constructor = false; |
| 1007 } else if (opcode == Translation::CONSTRUCT_STUB_FRAME) { | 1015 } else if (opcode == Translation::CONSTRUCT_STUB_FRAME) { |
| 1008 // The next encountered JS_FRAME will be marked as a constructor call. | 1016 // The next encountered JS_FRAME will be marked as a constructor call. |
| 1009 it.Skip(Translation::NumberOfOperandsFor(opcode)); | 1017 it.Skip(Translation::NumberOfOperandsFor(opcode)); |
| 1010 DCHECK(!is_constructor); | 1018 DCHECK(!is_constructor); |
| 1011 is_constructor = true; | 1019 is_constructor = true; |
| 1012 } else { | 1020 } else { |
| 1013 // Skip over operands to advance to the next opcode. | 1021 // Skip over operands to advance to the next opcode. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1076 DCHECK_EQ(Translation::BEGIN, opcode); | 1084 DCHECK_EQ(Translation::BEGIN, opcode); |
| 1077 it.Next(); // Skip frame count. | 1085 it.Next(); // Skip frame count. |
| 1078 int jsframe_count = it.Next(); | 1086 int jsframe_count = it.Next(); |
| 1079 | 1087 |
| 1080 // We insert the frames in reverse order because the frames | 1088 // We insert the frames in reverse order because the frames |
| 1081 // in the deoptimization translation are ordered bottom-to-top. | 1089 // in the deoptimization translation are ordered bottom-to-top. |
| 1082 while (jsframe_count != 0) { | 1090 while (jsframe_count != 0) { |
| 1083 opcode = static_cast<Translation::Opcode>(it.Next()); | 1091 opcode = static_cast<Translation::Opcode>(it.Next()); |
| 1084 // Skip over operands to advance to the next opcode. | 1092 // Skip over operands to advance to the next opcode. |
| 1085 it.Skip(Translation::NumberOfOperandsFor(opcode)); | 1093 it.Skip(Translation::NumberOfOperandsFor(opcode)); |
| 1086 if (opcode == Translation::JS_FRAME) { | 1094 if (opcode == Translation::JS_FRAME) { |
|
Jarin
2015/12/17 13:35:09
I think you also have to handle the interpreter fr
rmcilroy
2015/12/17 23:49:54
Done.
| |
| 1087 jsframe_count--; | 1095 jsframe_count--; |
| 1088 | 1096 |
| 1089 // The translation commands are ordered and the function is always at the | 1097 // The translation commands are ordered and the function is always at the |
| 1090 // first position. | 1098 // first position. |
| 1091 opcode = static_cast<Translation::Opcode>(it.Next()); | 1099 opcode = static_cast<Translation::Opcode>(it.Next()); |
| 1092 | 1100 |
| 1093 // Get the correct function in the optimized frame. | 1101 // Get the correct function in the optimized frame. |
| 1094 Object* function; | 1102 Object* function; |
| 1095 if (opcode == Translation::LITERAL) { | 1103 if (opcode == Translation::LITERAL) { |
| 1096 function = literal_array->get(it.Next()); | 1104 function = literal_array->get(it.Next()); |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1579 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1587 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 1580 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1588 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 1581 list.Add(frame, zone); | 1589 list.Add(frame, zone); |
| 1582 } | 1590 } |
| 1583 return list.ToVector(); | 1591 return list.ToVector(); |
| 1584 } | 1592 } |
| 1585 | 1593 |
| 1586 | 1594 |
| 1587 } // namespace internal | 1595 } // namespace internal |
| 1588 } // namespace v8 | 1596 } // namespace v8 |
| OLD | NEW |