OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
(...skipping 1509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 | 1520 |
1521 // Create node to instantiate a new closure. | 1521 // Create node to instantiate a new closure. |
1522 PretenureFlag pretenure = expr->pretenure() ? TENURED : NOT_TENURED; | 1522 PretenureFlag pretenure = expr->pretenure() ? TENURED : NOT_TENURED; |
1523 const Operator* op = javascript()->CreateClosure(shared_info, pretenure); | 1523 const Operator* op = javascript()->CreateClosure(shared_info, pretenure); |
1524 Node* value = NewNode(op); | 1524 Node* value = NewNode(op); |
1525 ast_context()->ProduceValue(value); | 1525 ast_context()->ProduceValue(value); |
1526 } | 1526 } |
1527 | 1527 |
1528 | 1528 |
1529 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { | 1529 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { |
1530 // Visit declarations and class literal in a block scope. | 1530 if (expr->scope() == NULL) { |
1531 if (expr->scope()->ContextLocalCount() > 0) { | 1531 // Visit class literal in the same scope, no declarations. |
1532 Node* context = BuildLocalBlockContext(expr->scope()); | |
1533 ContextScope scope(this, expr->scope(), context); | |
1534 VisitDeclarations(expr->scope()->declarations()); | |
1535 VisitClassLiteralContents(expr); | 1532 VisitClassLiteralContents(expr); |
1536 } else { | 1533 } else { |
1537 VisitDeclarations(expr->scope()->declarations()); | 1534 // Visit declarations and class literal in a block scope. |
1538 VisitClassLiteralContents(expr); | 1535 if (expr->scope()->ContextLocalCount() > 0) { |
| 1536 Node* context = BuildLocalBlockContext(expr->scope()); |
| 1537 ContextScope scope(this, expr->scope(), context); |
| 1538 VisitDeclarations(expr->scope()->declarations()); |
| 1539 VisitClassLiteralContents(expr); |
| 1540 } else { |
| 1541 VisitDeclarations(expr->scope()->declarations()); |
| 1542 VisitClassLiteralContents(expr); |
| 1543 } |
1539 } | 1544 } |
1540 } | 1545 } |
1541 | 1546 |
1542 | 1547 |
1543 void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { | 1548 void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { |
1544 Node* class_name = expr->raw_name() ? jsgraph()->Constant(expr->name()) | 1549 Node* class_name = expr->raw_name() ? jsgraph()->Constant(expr->name()) |
1545 : jsgraph()->UndefinedConstant(); | 1550 : jsgraph()->UndefinedConstant(); |
1546 | 1551 |
1547 // The class name is expected on the operand stack. | 1552 // The class name is expected on the operand stack. |
1548 environment()->Push(class_name); | 1553 environment()->Push(class_name); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 | 1631 |
1627 // Set both the prototype and constructor to have fast properties, and also | 1632 // Set both the prototype and constructor to have fast properties, and also |
1628 // freeze them in strong mode. | 1633 // freeze them in strong mode. |
1629 environment()->Pop(); // proto | 1634 environment()->Pop(); // proto |
1630 environment()->Pop(); // literal | 1635 environment()->Pop(); // literal |
1631 const Operator* op = | 1636 const Operator* op = |
1632 javascript()->CallRuntime(Runtime::kFinalizeClassDefinition, 2); | 1637 javascript()->CallRuntime(Runtime::kFinalizeClassDefinition, 2); |
1633 literal = NewNode(op, literal, proto); | 1638 literal = NewNode(op, literal, proto); |
1634 | 1639 |
1635 // Assign to class variable. | 1640 // Assign to class variable. |
1636 if (expr->class_variable_proxy() != nullptr) { | 1641 if (expr->scope() != NULL) { |
| 1642 DCHECK_NOT_NULL(expr->class_variable_proxy()); |
1637 Variable* var = expr->class_variable_proxy()->var(); | 1643 Variable* var = expr->class_variable_proxy()->var(); |
1638 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 1644 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
1639 VectorSlotPair feedback = CreateVectorSlotPair( | 1645 VectorSlotPair feedback = CreateVectorSlotPair( |
1640 expr->NeedsProxySlot() ? expr->ProxySlot() | 1646 expr->NeedsProxySlot() ? expr->ProxySlot() |
1641 : FeedbackVectorSlot::Invalid()); | 1647 : FeedbackVectorSlot::Invalid()); |
1642 BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback, | 1648 BuildVariableAssignment(var, literal, Token::INIT_CONST, feedback, |
1643 BailoutId::None(), states); | 1649 BailoutId::None(), states); |
1644 } | 1650 } |
1645 ast_context()->ProduceValue(literal); | 1651 ast_context()->ProduceValue(literal); |
1646 } | 1652 } |
(...skipping 2632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4279 // Phi does not exist yet, introduce one. | 4285 // Phi does not exist yet, introduce one. |
4280 value = NewPhi(inputs, value, control); | 4286 value = NewPhi(inputs, value, control); |
4281 value->ReplaceInput(inputs - 1, other); | 4287 value->ReplaceInput(inputs - 1, other); |
4282 } | 4288 } |
4283 return value; | 4289 return value; |
4284 } | 4290 } |
4285 | 4291 |
4286 } // namespace compiler | 4292 } // namespace compiler |
4287 } // namespace internal | 4293 } // namespace internal |
4288 } // namespace v8 | 4294 } // namespace v8 |
OLD | NEW |