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 | 7 |
7 namespace v8 { | 8 namespace v8 { |
8 namespace internal { | 9 namespace internal { |
9 namespace interpreter { | 10 namespace interpreter { |
10 | 11 |
11 class BytecodeArrayBuilder::PreviousBytecodeHelper BASE_EMBEDDED { | 12 class BytecodeArrayBuilder::PreviousBytecodeHelper BASE_EMBEDDED { |
12 public: | 13 public: |
13 explicit PreviousBytecodeHelper(const BytecodeArrayBuilder& array_builder) | 14 explicit PreviousBytecodeHelper(const BytecodeArrayBuilder& array_builder) |
14 : array_builder_(array_builder), | 15 : array_builder_(array_builder), |
15 previous_bytecode_start_(array_builder_.last_bytecode_start_) { | 16 previous_bytecode_start_(array_builder_.last_bytecode_start_) { |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } | 109 } |
109 | 110 |
110 | 111 |
111 bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { | 112 bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { |
112 return reg.is_parameter() || reg.index() < locals_count(); | 113 return reg.is_parameter() || reg.index() < locals_count(); |
113 } | 114 } |
114 | 115 |
115 | 116 |
116 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { | 117 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { |
117 DCHECK_EQ(bytecode_generated_, false); | 118 DCHECK_EQ(bytecode_generated_, false); |
118 EnsureReturn(); | 119 DCHECK(exit_seen_in_block_); |
119 | 120 |
120 int bytecode_size = static_cast<int>(bytecodes_.size()); | 121 int bytecode_size = static_cast<int>(bytecodes_.size()); |
121 int register_count = | 122 int register_count = |
122 fixed_and_temporary_register_count() + translation_register_count(); | 123 fixed_and_temporary_register_count() + translation_register_count(); |
123 int frame_size = register_count * kPointerSize; | 124 int frame_size = register_count * kPointerSize; |
124 Handle<FixedArray> constant_pool = constant_array_builder()->ToFixedArray(); | 125 Handle<FixedArray> constant_pool = constant_array_builder()->ToFixedArray(); |
125 Handle<FixedArray> handler_table = handler_table_builder()->ToHandlerTable(); | 126 Handle<FixedArray> handler_table = handler_table_builder()->ToHandlerTable(); |
126 Handle<FixedArray> source_position_table = | 127 Handle<FixedArray> source_position_table = |
127 source_position_table_builder()->ToFixedArray(); | 128 source_position_table_builder()->ToFixedArray(); |
128 Handle<BytecodeArray> output = isolate_->factory()->NewBytecodeArray( | 129 Handle<BytecodeArray> output = isolate_->factory()->NewBytecodeArray( |
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 handler_table_builder()->SetTryRegionEnd(handler_id, bytecodes()->size()); | 1068 handler_table_builder()->SetTryRegionEnd(handler_id, bytecodes()->size()); |
1068 return *this; | 1069 return *this; |
1069 } | 1070 } |
1070 | 1071 |
1071 | 1072 |
1072 void BytecodeArrayBuilder::LeaveBasicBlock() { | 1073 void BytecodeArrayBuilder::LeaveBasicBlock() { |
1073 last_block_end_ = bytecodes()->size(); | 1074 last_block_end_ = bytecodes()->size(); |
1074 exit_seen_in_block_ = false; | 1075 exit_seen_in_block_ = false; |
1075 } | 1076 } |
1076 | 1077 |
1077 | 1078 void BytecodeArrayBuilder::EnsureReturn(FunctionLiteral* literal) { |
1078 void BytecodeArrayBuilder::EnsureReturn() { | |
1079 if (!exit_seen_in_block_) { | 1079 if (!exit_seen_in_block_) { |
1080 LoadUndefined(); | 1080 LoadUndefined(); |
| 1081 SetReturnPosition(literal); |
1081 Return(); | 1082 Return(); |
1082 } | 1083 } |
1083 } | 1084 } |
1084 | 1085 |
1085 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, | 1086 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, |
1086 Register receiver_args, | 1087 Register receiver_args, |
1087 size_t receiver_args_count, | 1088 size_t receiver_args_count, |
1088 int feedback_slot) { | 1089 int feedback_slot) { |
1089 if (FitsInReg8Operand(callable) && FitsInReg8Operand(receiver_args) && | 1090 if (FitsInReg8Operand(callable) && FitsInReg8Operand(receiver_args) && |
1090 FitsInIdx8Operand(receiver_args_count) && | 1091 FitsInIdx8Operand(receiver_args_count) && |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 BytecodeArrayBuilder& BytecodeArrayBuilder::DeleteLookupSlot() { | 1207 BytecodeArrayBuilder& BytecodeArrayBuilder::DeleteLookupSlot() { |
1207 Output(Bytecode::kDeleteLookupSlot); | 1208 Output(Bytecode::kDeleteLookupSlot); |
1208 return *this; | 1209 return *this; |
1209 } | 1210 } |
1210 | 1211 |
1211 | 1212 |
1212 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 1213 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
1213 return constant_array_builder()->Insert(object); | 1214 return constant_array_builder()->Insert(object); |
1214 } | 1215 } |
1215 | 1216 |
| 1217 void BytecodeArrayBuilder::SetReturnPosition(FunctionLiteral* fun) { |
| 1218 int pos = std::max(fun->start_position(), fun->end_position() - 1); |
| 1219 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), pos); |
| 1220 } |
| 1221 |
1216 void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { | 1222 void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { |
1217 if (stmt->position() == RelocInfo::kNoPosition) return; | 1223 if (stmt->position() == RelocInfo::kNoPosition) return; |
1218 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), | 1224 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), |
1219 stmt->position()); | 1225 stmt->position()); |
1220 } | 1226 } |
1221 | 1227 |
1222 void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { | 1228 void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { |
1223 if (expr->position() == RelocInfo::kNoPosition) return; | 1229 if (expr->position() == RelocInfo::kNoPosition) return; |
1224 source_position_table_builder_.AddExpressionPosition(bytecodes_.size(), | 1230 source_position_table_builder_.AddExpressionPosition(bytecodes_.size(), |
1225 expr->position()); | 1231 expr->position()); |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 } | 1698 } |
1693 | 1699 |
1694 // static | 1700 // static |
1695 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { | 1701 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { |
1696 return value.is_short_operand(); | 1702 return value.is_short_operand(); |
1697 } | 1703 } |
1698 | 1704 |
1699 } // namespace interpreter | 1705 } // namespace interpreter |
1700 } // namespace internal | 1706 } // namespace internal |
1701 } // namespace v8 | 1707 } // namespace v8 |
OLD | NEW |