Chromium Code Reviews| 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/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/interpreter/control-flow-builders.h" | 9 #include "src/interpreter/control-flow-builders.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 Register destination(builder()->Parameter(variable->index() + 1)); | 556 Register destination(builder()->Parameter(variable->index() + 1)); |
| 557 builder()->LoadTheHole().StoreAccumulatorInRegister(destination); | 557 builder()->LoadTheHole().StoreAccumulatorInRegister(destination); |
| 558 } | 558 } |
| 559 break; | 559 break; |
| 560 case VariableLocation::CONTEXT: | 560 case VariableLocation::CONTEXT: |
| 561 if (hole_init) { | 561 if (hole_init) { |
| 562 builder()->LoadTheHole().StoreContextSlot(execution_context()->reg(), | 562 builder()->LoadTheHole().StoreContextSlot(execution_context()->reg(), |
| 563 variable->index()); | 563 variable->index()); |
| 564 } | 564 } |
| 565 break; | 565 break; |
| 566 case VariableLocation::LOOKUP: | 566 case VariableLocation::LOOKUP: { |
| 567 UNIMPLEMENTED(); | 567 TemporaryRegisterScope temporary_register_scope(builder()); |
|
rmcilroy
2016/01/14 11:21:12
Please don't use TemporaryRegisterScope (it is goi
mythria
2016/01/15 11:27:04
Done.
| |
| 568 temporary_register_scope.PrepareForConsecutiveAllocations(3); | |
| 569 DCHECK(IsDeclaredVariableMode(mode)); | |
|
rmcilroy
2016/01/14 11:21:12
nit - move to the top of the case
mythria
2016/01/15 11:27:04
Done.
| |
| 570 Register name = temporary_register_scope.NextConsecutiveRegister(); | |
| 571 Register init_value = temporary_register_scope.NextConsecutiveRegister(); | |
| 572 Register attributes = temporary_register_scope.NextConsecutiveRegister(); | |
| 573 builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name); | |
|
rmcilroy
2016/01/14 11:21:12
nit - newline abovem, and newline between LoadLite
mythria
2016/01/15 11:27:04
I am not sure, I understood this correctly. cl for
| |
| 574 if (hole_init) { | |
| 575 builder()->LoadTheHole().StoreAccumulatorInRegister(init_value); | |
|
rmcilroy
2016/01/14 11:21:12
ditto
| |
| 576 } else { | |
| 577 builder() | |
| 578 ->LoadLiteral(Smi::FromInt(0)) | |
|
rmcilroy
2016/01/14 11:21:12
Add comment that this indicates no initial value a
mythria
2016/01/15 11:27:04
Done.
| |
| 579 .StoreAccumulatorInRegister(init_value); | |
| 580 } | |
| 581 builder() | |
| 582 ->LoadLiteral(Smi::FromInt(variable->DeclarationPropertyAttributes())) | |
| 583 .StoreAccumulatorInRegister(attributes); | |
| 584 builder()->CallRuntime(Runtime::kDeclareLookupSlot, name, 3); | |
|
rmcilroy
2016/01/14 11:21:12
nit - no need for builder() here
mythria
2016/01/15 11:27:04
Done.
| |
| 568 break; | 585 break; |
| 586 } | |
| 569 } | 587 } |
| 570 } | 588 } |
| 571 | 589 |
| 572 | 590 |
| 573 void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { | 591 void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
| 574 Variable* variable = decl->proxy()->var(); | 592 Variable* variable = decl->proxy()->var(); |
| 575 switch (variable->location()) { | 593 switch (variable->location()) { |
| 576 case VariableLocation::GLOBAL: | 594 case VariableLocation::GLOBAL: |
| 577 case VariableLocation::UNALLOCATED: { | 595 case VariableLocation::UNALLOCATED: { |
| 578 Handle<SharedFunctionInfo> function = Compiler::GetSharedFunctionInfo( | 596 Handle<SharedFunctionInfo> function = Compiler::GetSharedFunctionInfo( |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 589 VisitVariableAssignment(variable, FeedbackVectorSlot::Invalid()); | 607 VisitVariableAssignment(variable, FeedbackVectorSlot::Invalid()); |
| 590 break; | 608 break; |
| 591 } | 609 } |
| 592 case VariableLocation::CONTEXT: { | 610 case VariableLocation::CONTEXT: { |
| 593 DCHECK_EQ(0, execution_context()->ContextChainDepth(variable->scope())); | 611 DCHECK_EQ(0, execution_context()->ContextChainDepth(variable->scope())); |
| 594 VisitForAccumulatorValue(decl->fun()); | 612 VisitForAccumulatorValue(decl->fun()); |
| 595 builder()->StoreContextSlot(execution_context()->reg(), | 613 builder()->StoreContextSlot(execution_context()->reg(), |
| 596 variable->index()); | 614 variable->index()); |
| 597 break; | 615 break; |
| 598 } | 616 } |
| 599 case VariableLocation::LOOKUP: | 617 case VariableLocation::LOOKUP: { |
| 600 UNIMPLEMENTED(); | 618 TemporaryRegisterScope temporary_register_scope(builder()); |
| 619 temporary_register_scope.PrepareForConsecutiveAllocations(3); | |
| 620 Register name = temporary_register_scope.NextConsecutiveRegister(); | |
| 621 Register literal = temporary_register_scope.NextConsecutiveRegister(); | |
| 622 Register attributes = temporary_register_scope.NextConsecutiveRegister(); | |
| 623 builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name); | |
|
rmcilroy
2016/01/14 11:21:12
newline
mythria
2016/01/15 11:27:04
Done.
| |
| 624 VisitForAccumulatorValue(decl->fun()); | |
| 625 builder()->StoreAccumulatorInRegister(literal); | |
| 626 builder() | |
| 627 ->LoadLiteral(Smi::FromInt(variable->DeclarationPropertyAttributes())) | |
| 628 .StoreAccumulatorInRegister(attributes); | |
| 629 builder()->CallRuntime(Runtime::kDeclareLookupSlot, name, 3); | |
|
rmcilroy
2016/01/14 11:21:12
only one builder() for these 5 lines
mythria
2016/01/15 11:27:04
Done.
| |
| 630 } | |
| 601 } | 631 } |
| 602 } | 632 } |
| 603 | 633 |
| 604 | 634 |
| 605 void BytecodeGenerator::VisitImportDeclaration(ImportDeclaration* decl) { | 635 void BytecodeGenerator::VisitImportDeclaration(ImportDeclaration* decl) { |
| 606 UNIMPLEMENTED(); | 636 UNIMPLEMENTED(); |
| 607 } | 637 } |
| 608 | 638 |
| 609 | 639 |
| 610 void BytecodeGenerator::VisitExportDeclaration(ExportDeclaration* decl) { | 640 void BytecodeGenerator::VisitExportDeclaration(ExportDeclaration* decl) { |
| (...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1402 builder() | 1432 builder() |
| 1403 ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) | 1433 ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) |
| 1404 .StoreAccumulatorInRegister(context_reg); | 1434 .StoreAccumulatorInRegister(context_reg); |
| 1405 } | 1435 } |
| 1406 builder()->LoadAccumulatorWithRegister(value_temp); | 1436 builder()->LoadAccumulatorWithRegister(value_temp); |
| 1407 } | 1437 } |
| 1408 builder()->StoreContextSlot(context_reg, variable->index()); | 1438 builder()->StoreContextSlot(context_reg, variable->index()); |
| 1409 break; | 1439 break; |
| 1410 } | 1440 } |
| 1411 case VariableLocation::LOOKUP: { | 1441 case VariableLocation::LOOKUP: { |
| 1442 // TODO(mythria): Use Runtime::kInitializeLegacyConstLookupSlot for | |
| 1443 // initializations of const declarations. | |
|
mythria
2016/01/13 17:27:21
This is not related to this cl. I should have adde
| |
| 1412 builder()->StoreLookupSlot(variable->name(), language_mode()); | 1444 builder()->StoreLookupSlot(variable->name(), language_mode()); |
| 1413 break; | 1445 break; |
| 1414 } | 1446 } |
| 1415 } | 1447 } |
| 1416 } | 1448 } |
| 1417 | 1449 |
| 1418 | 1450 |
| 1419 void BytecodeGenerator::VisitAssignment(Assignment* expr) { | 1451 void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| 1420 DCHECK(expr->target()->IsValidReferenceExpression()); | 1452 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1421 Register object, key; | 1453 Register object, key; |
| (...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2281 } | 2313 } |
| 2282 | 2314 |
| 2283 | 2315 |
| 2284 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 2316 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 2285 return info()->feedback_vector()->GetIndex(slot); | 2317 return info()->feedback_vector()->GetIndex(slot); |
| 2286 } | 2318 } |
| 2287 | 2319 |
| 2288 } // namespace interpreter | 2320 } // namespace interpreter |
| 2289 } // namespace internal | 2321 } // namespace internal |
| 2290 } // namespace v8 | 2322 } // namespace v8 |
| OLD | NEW |