OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/bytecode-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
6 #include "src/compiler.h" | 6 #include "src/compiler.h" |
7 | 7 |
8 namespace v8 { | 8 namespace v8 { |
9 namespace internal { | 9 namespace internal { |
10 namespace interpreter { | 10 namespace interpreter { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 | 60 |
61 private: | 61 private: |
62 const BytecodeArrayBuilder& array_builder_; | 62 const BytecodeArrayBuilder& array_builder_; |
63 size_t previous_bytecode_start_; | 63 size_t previous_bytecode_start_; |
64 | 64 |
65 DISALLOW_COPY_AND_ASSIGN(PreviousBytecodeHelper); | 65 DISALLOW_COPY_AND_ASSIGN(PreviousBytecodeHelper); |
66 }; | 66 }; |
67 | 67 |
68 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone, | 68 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone, |
69 int parameter_count, | 69 int parameter_count, |
70 int context_count, int locals_count) | 70 int context_count, int locals_count, |
| 71 FunctionLiteral* literal) |
71 : isolate_(isolate), | 72 : isolate_(isolate), |
72 zone_(zone), | 73 zone_(zone), |
73 bytecodes_(zone), | 74 bytecodes_(zone), |
74 bytecode_generated_(false), | 75 bytecode_generated_(false), |
75 constant_array_builder_(isolate, zone), | 76 constant_array_builder_(isolate, zone), |
76 handler_table_builder_(isolate, zone), | 77 handler_table_builder_(isolate, zone), |
77 source_position_table_builder_(isolate, zone), | 78 source_position_table_builder_(isolate, zone), |
78 last_block_end_(0), | 79 last_block_end_(0), |
79 last_bytecode_start_(~0), | 80 last_bytecode_start_(~0), |
80 exit_seen_in_block_(false), | 81 exit_seen_in_block_(false), |
81 unbound_jumps_(0), | 82 unbound_jumps_(0), |
82 parameter_count_(parameter_count), | 83 parameter_count_(parameter_count), |
83 local_register_count_(locals_count), | 84 local_register_count_(locals_count), |
84 context_register_count_(context_count), | 85 context_register_count_(context_count), |
85 temporary_allocator_(zone, fixed_register_count()), | 86 temporary_allocator_(zone, fixed_register_count()), |
86 register_translator_(this) { | 87 register_translator_(this) { |
87 DCHECK_GE(parameter_count_, 0); | 88 DCHECK_GE(parameter_count_, 0); |
88 DCHECK_GE(context_register_count_, 0); | 89 DCHECK_GE(context_register_count_, 0); |
89 DCHECK_GE(local_register_count_, 0); | 90 DCHECK_GE(local_register_count_, 0); |
| 91 return_position_ = |
| 92 literal ? std::max(literal->start_position(), literal->end_position() - 1) |
| 93 : RelocInfo::kNoPosition; |
90 } | 94 } |
91 | 95 |
92 BytecodeArrayBuilder::~BytecodeArrayBuilder() { DCHECK_EQ(0, unbound_jumps_); } | 96 BytecodeArrayBuilder::~BytecodeArrayBuilder() { DCHECK_EQ(0, unbound_jumps_); } |
93 | 97 |
94 Register BytecodeArrayBuilder::first_context_register() const { | 98 Register BytecodeArrayBuilder::first_context_register() const { |
95 DCHECK_GT(context_register_count_, 0); | 99 DCHECK_GT(context_register_count_, 0); |
96 return Register(local_register_count_); | 100 return Register(local_register_count_); |
97 } | 101 } |
98 | 102 |
99 | 103 |
(...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 | 958 |
955 | 959 |
956 BytecodeArrayBuilder& BytecodeArrayBuilder::ReThrow() { | 960 BytecodeArrayBuilder& BytecodeArrayBuilder::ReThrow() { |
957 Output(Bytecode::kReThrow); | 961 Output(Bytecode::kReThrow); |
958 exit_seen_in_block_ = true; | 962 exit_seen_in_block_ = true; |
959 return *this; | 963 return *this; |
960 } | 964 } |
961 | 965 |
962 | 966 |
963 BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { | 967 BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { |
| 968 SetReturnPosition(); |
964 Output(Bytecode::kReturn); | 969 Output(Bytecode::kReturn); |
965 exit_seen_in_block_ = true; | 970 exit_seen_in_block_ = true; |
966 return *this; | 971 return *this; |
967 } | 972 } |
968 | 973 |
969 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { | 974 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { |
970 Output(Bytecode::kDebugger); | 975 Output(Bytecode::kDebugger); |
971 return *this; | 976 return *this; |
972 } | 977 } |
973 | 978 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1035 handler_table_builder()->SetTryRegionEnd(handler_id, bytecodes()->size()); | 1040 handler_table_builder()->SetTryRegionEnd(handler_id, bytecodes()->size()); |
1036 return *this; | 1041 return *this; |
1037 } | 1042 } |
1038 | 1043 |
1039 | 1044 |
1040 void BytecodeArrayBuilder::LeaveBasicBlock() { | 1045 void BytecodeArrayBuilder::LeaveBasicBlock() { |
1041 last_block_end_ = bytecodes()->size(); | 1046 last_block_end_ = bytecodes()->size(); |
1042 exit_seen_in_block_ = false; | 1047 exit_seen_in_block_ = false; |
1043 } | 1048 } |
1044 | 1049 |
1045 void BytecodeArrayBuilder::EnsureReturn(FunctionLiteral* literal) { | 1050 void BytecodeArrayBuilder::EnsureReturn() { |
1046 if (!exit_seen_in_block_) { | 1051 if (!exit_seen_in_block_) { |
1047 LoadUndefined(); | 1052 LoadUndefined(); |
1048 SetReturnPosition(literal); | |
1049 Return(); | 1053 Return(); |
1050 } | 1054 } |
1051 DCHECK(exit_seen_in_block_); | 1055 DCHECK(exit_seen_in_block_); |
1052 } | 1056 } |
1053 | 1057 |
1054 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, | 1058 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, |
1055 Register receiver_args, | 1059 Register receiver_args, |
1056 size_t receiver_args_count, | 1060 size_t receiver_args_count, |
1057 int feedback_slot, | 1061 int feedback_slot, |
1058 TailCallMode tail_call_mode) { | 1062 TailCallMode tail_call_mode) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1169 LanguageMode language_mode) { | 1173 LanguageMode language_mode) { |
1170 Output(BytecodeForDelete(language_mode), object.ToRawOperand()); | 1174 Output(BytecodeForDelete(language_mode), object.ToRawOperand()); |
1171 return *this; | 1175 return *this; |
1172 } | 1176 } |
1173 | 1177 |
1174 | 1178 |
1175 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 1179 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
1176 return constant_array_builder()->Insert(object); | 1180 return constant_array_builder()->Insert(object); |
1177 } | 1181 } |
1178 | 1182 |
1179 void BytecodeArrayBuilder::SetReturnPosition(FunctionLiteral* fun) { | 1183 void BytecodeArrayBuilder::SetReturnPosition() { |
1180 // Don't emit dead code. | 1184 if (return_position_ == RelocInfo::kNoPosition) return; |
1181 if (exit_seen_in_block_) return; | 1185 if (exit_seen_in_block_) return; |
1182 | 1186 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), |
1183 int pos = std::max(fun->start_position(), fun->end_position() - 1); | 1187 return_position_); |
1184 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), pos); | |
1185 } | 1188 } |
1186 | 1189 |
1187 void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { | 1190 void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { |
1188 if (stmt->position() == RelocInfo::kNoPosition) return; | 1191 if (stmt->position() == RelocInfo::kNoPosition) return; |
1189 if (exit_seen_in_block_) return; | 1192 if (exit_seen_in_block_) return; |
1190 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), | 1193 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), |
1191 stmt->position()); | 1194 stmt->position()); |
1192 } | 1195 } |
1193 | 1196 |
1194 void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { | 1197 void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1624 } | 1627 } |
1625 | 1628 |
1626 // static | 1629 // static |
1627 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { | 1630 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { |
1628 return value.is_short_operand(); | 1631 return value.is_short_operand(); |
1629 } | 1632 } |
1630 | 1633 |
1631 } // namespace interpreter | 1634 } // namespace interpreter |
1632 } // namespace internal | 1635 } // namespace internal |
1633 } // namespace v8 | 1636 } // namespace v8 |
OLD | NEW |