| 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-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
| 6 | 6 |
| 7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-info.h" | 10 #include "src/compilation-info.h" |
| 11 #include "src/compiler.h" | 11 #include "src/compiler.h" |
| 12 #include "src/interpreter/bytecode-flags.h" | 12 #include "src/interpreter/bytecode-flags.h" |
| 13 #include "src/interpreter/bytecode-label.h" | 13 #include "src/interpreter/bytecode-label.h" |
| 14 #include "src/interpreter/bytecode-register-allocator.h" | 14 #include "src/interpreter/bytecode-register-allocator.h" |
| 15 #include "src/interpreter/control-flow-builders.h" | 15 #include "src/interpreter/control-flow-builders.h" |
| 16 #include "src/objects.h" | 16 #include "src/objects.h" |
| 17 #include "src/parsing/parse-info.h" |
| 17 #include "src/parsing/token.h" | 18 #include "src/parsing/token.h" |
| 18 | 19 |
| 19 namespace v8 { | 20 namespace v8 { |
| 20 namespace internal { | 21 namespace internal { |
| 21 namespace interpreter { | 22 namespace interpreter { |
| 22 | 23 |
| 23 // Scoped class tracking context objects created by the visitor. Represents | 24 // Scoped class tracking context objects created by the visitor. Represents |
| 24 // mutations of the context chain within the function body, allowing pushing and | 25 // mutations of the context chain within the function body, allowing pushing and |
| 25 // popping of the current {context_register} during visitation. | 26 // popping of the current {context_register} during visitation. |
| 26 class BytecodeGenerator::ContextScope BASE_EMBEDDED { | 27 class BytecodeGenerator::ContextScope BASE_EMBEDDED { |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 global_declarations_(0, info->zone()), | 565 global_declarations_(0, info->zone()), |
| 565 function_literals_(0, info->zone()), | 566 function_literals_(0, info->zone()), |
| 566 native_function_literals_(0, info->zone()), | 567 native_function_literals_(0, info->zone()), |
| 567 execution_control_(nullptr), | 568 execution_control_(nullptr), |
| 568 execution_context_(nullptr), | 569 execution_context_(nullptr), |
| 569 execution_result_(nullptr), | 570 execution_result_(nullptr), |
| 570 generator_resume_points_(info->literal()->yield_count(), info->zone()), | 571 generator_resume_points_(info->literal()->yield_count(), info->zone()), |
| 571 generator_state_(), | 572 generator_state_(), |
| 572 loop_depth_(0), | 573 loop_depth_(0), |
| 573 home_object_symbol_(info->isolate()->factory()->home_object_symbol()), | 574 home_object_symbol_(info->isolate()->factory()->home_object_symbol()), |
| 574 prototype_string_(info->isolate()->factory()->prototype_string()) { | 575 empty_fixed_array_(info->isolate()->factory()->empty_fixed_array()) { |
| 576 AstValueFactory* ast_value_factory = info->parse_info()->ast_value_factory(); |
| 577 const AstRawString* prototype_string = ast_value_factory->prototype_string(); |
| 578 ast_value_factory->Internalize(info->isolate()); |
| 579 prototype_string_ = prototype_string->string(); |
| 575 } | 580 } |
| 576 | 581 |
| 577 Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { | 582 Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { |
| 578 AllocateDeferredConstants(); | 583 AllocateDeferredConstants(); |
| 579 if (HasStackOverflow()) return Handle<BytecodeArray>(); | 584 if (HasStackOverflow()) return Handle<BytecodeArray>(); |
| 580 return builder()->ToBytecodeArray(isolate); | 585 return builder()->ToBytecodeArray(isolate); |
| 581 } | 586 } |
| 582 | 587 |
| 583 void BytecodeGenerator::AllocateDeferredConstants() { | 588 void BytecodeGenerator::AllocateDeferredConstants() { |
| 584 // Build global declaration pair arrays. | 589 // Build global declaration pair arrays. |
| (...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1561 builder()->CreateRegExpLiteral(expr->pattern(), expr->literal_index(), | 1566 builder()->CreateRegExpLiteral(expr->pattern(), expr->literal_index(), |
| 1562 expr->flags()); | 1567 expr->flags()); |
| 1563 } | 1568 } |
| 1564 | 1569 |
| 1565 void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { | 1570 void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
| 1566 // Copy the literal boilerplate. | 1571 // Copy the literal boilerplate. |
| 1567 uint8_t flags = CreateObjectLiteralFlags::Encode( | 1572 uint8_t flags = CreateObjectLiteralFlags::Encode( |
| 1568 FastCloneShallowObjectStub::IsSupported(expr), | 1573 FastCloneShallowObjectStub::IsSupported(expr), |
| 1569 FastCloneShallowObjectStub::PropertiesCount(expr->properties_count()), | 1574 FastCloneShallowObjectStub::PropertiesCount(expr->properties_count()), |
| 1570 expr->ComputeFlags()); | 1575 expr->ComputeFlags()); |
| 1571 // Allocate in the outer scope since this register is used to return the | 1576 // If constant properties is an empty fixed array, use our cached |
| 1572 // expression's results to the caller. | 1577 // empty_fixed_array to ensure it's only added to the constant pool once. |
| 1578 Handle<FixedArray> constant_properties = expr->properties_count() == 0 |
| 1579 ? empty_fixed_array() |
| 1580 : expr->constant_properties(); |
| 1573 Register literal = register_allocator()->NewRegister(); | 1581 Register literal = register_allocator()->NewRegister(); |
| 1574 builder()->CreateObjectLiteral(expr->constant_properties(), | 1582 builder()->CreateObjectLiteral(constant_properties, expr->literal_index(), |
| 1575 expr->literal_index(), flags, literal); | 1583 flags, literal); |
| 1576 | 1584 |
| 1577 // Store computed values into the literal. | 1585 // Store computed values into the literal. |
| 1578 int property_index = 0; | 1586 int property_index = 0; |
| 1579 AccessorTable accessor_table(zone()); | 1587 AccessorTable accessor_table(zone()); |
| 1580 for (; property_index < expr->properties()->length(); property_index++) { | 1588 for (; property_index < expr->properties()->length(); property_index++) { |
| 1581 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1589 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
| 1582 if (property->is_computed_name()) break; | 1590 if (property->is_computed_name()) break; |
| 1583 if (property->IsCompileTimeValue()) continue; | 1591 if (property->IsCompileTimeValue()) continue; |
| 1584 | 1592 |
| 1585 RegisterAllocationScope inner_register_scope(this); | 1593 RegisterAllocationScope inner_register_scope(this); |
| (...skipping 1622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3208 } | 3216 } |
| 3209 | 3217 |
| 3210 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { | 3218 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { |
| 3211 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict | 3219 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict |
| 3212 : Runtime::kStoreKeyedToSuper_Sloppy; | 3220 : Runtime::kStoreKeyedToSuper_Sloppy; |
| 3213 } | 3221 } |
| 3214 | 3222 |
| 3215 } // namespace interpreter | 3223 } // namespace interpreter |
| 3216 } // namespace internal | 3224 } // namespace internal |
| 3217 } // namespace v8 | 3225 } // namespace v8 |
| OLD | NEW |