| Index: src/ast/ast-numbering.cc
|
| diff --git a/src/ast/ast-numbering.cc b/src/ast/ast-numbering.cc
|
| index 96d5372dee2b691d3130eece05482ceb9e3ca5c1..d0522dfddbc3920e0f85e9686f57342e2d08405f 100644
|
| --- a/src/ast/ast-numbering.cc
|
| +++ b/src/ast/ast-numbering.cc
|
| @@ -21,6 +21,7 @@ class AstNumberingVisitor final : public AstVisitor<AstNumberingVisitor> {
|
| next_id_(BailoutId::FirstUsable().ToInt()),
|
| yield_count_(0),
|
| properties_(zone),
|
| + language_mode_(SLOPPY),
|
| slot_cache_(zone),
|
| disable_crankshaft_reason_(kNoReason),
|
| dont_optimize_reason_(kNoReason),
|
| @@ -40,6 +41,7 @@ class AstNumberingVisitor final : public AstVisitor<AstNumberingVisitor> {
|
| void VisitPropertyReference(Property* node);
|
| void VisitReference(Expression* expr);
|
|
|
| + void VisitStatementsAndDeclarations(Block* node);
|
| void VisitStatements(ZoneList<Statement*>* statements);
|
| void VisitDeclarations(Declaration::List* declarations);
|
| void VisitArguments(ZoneList<Expression*>* arguments);
|
| @@ -66,9 +68,23 @@ class AstNumberingVisitor final : public AstVisitor<AstNumberingVisitor> {
|
|
|
| template <typename Node>
|
| void ReserveFeedbackSlots(Node* node) {
|
| - node->AssignFeedbackVectorSlots(properties_.get_spec(), &slot_cache_);
|
| + node->AssignFeedbackVectorSlots(properties_.get_spec(), language_mode_,
|
| + &slot_cache_);
|
| }
|
|
|
| + class LanguageModeScope {
|
| + public:
|
| + LanguageModeScope(AstNumberingVisitor* visitor, LanguageMode language_mode)
|
| + : visitor_(visitor), outer_language_mode_(visitor->language_mode_) {
|
| + visitor_->language_mode_ = language_mode;
|
| + }
|
| + ~LanguageModeScope() { visitor_->language_mode_ = outer_language_mode_; }
|
| +
|
| + private:
|
| + AstNumberingVisitor* visitor_;
|
| + LanguageMode outer_language_mode_;
|
| + };
|
| +
|
| BailoutReason dont_optimize_reason() const { return dont_optimize_reason_; }
|
|
|
| Zone* zone() const { return zone_; }
|
| @@ -78,6 +94,7 @@ class AstNumberingVisitor final : public AstVisitor<AstNumberingVisitor> {
|
| int next_id_;
|
| int yield_count_;
|
| AstProperties properties_;
|
| + LanguageMode language_mode_;
|
| // The slot cache allows us to reuse certain feedback vector slots.
|
| FeedbackVectorSlotCache slot_cache_;
|
| BailoutReason disable_crankshaft_reason_;
|
| @@ -249,10 +266,22 @@ void AstNumberingVisitor::VisitCountOperation(CountOperation* node) {
|
| void AstNumberingVisitor::VisitBlock(Block* node) {
|
| IncrementNodeCount();
|
| node->set_base_id(ReserveIdRange(Block::num_ids()));
|
| - if (node->scope() != NULL) VisitDeclarations(node->scope()->declarations());
|
| - VisitStatements(node->statements());
|
| + Scope* scope = node->scope();
|
| + // TODO(ishell): remove scope->NeedsContext() condition once v8:5927 is fixed.
|
| + // Current logic mimics what BytecodeGenerator::VisitBlock() does.
|
| + if (scope != NULL && scope->NeedsContext()) {
|
| + LanguageModeScope language_mode_scope(this, scope->language_mode());
|
| + VisitStatementsAndDeclarations(node);
|
| + } else {
|
| + VisitStatementsAndDeclarations(node);
|
| + }
|
| }
|
|
|
| +void AstNumberingVisitor::VisitStatementsAndDeclarations(Block* node) {
|
| + Scope* scope = node->scope();
|
| + if (scope) VisitDeclarations(scope->declarations());
|
| + VisitStatements(node->statements());
|
| +}
|
|
|
| void AstNumberingVisitor::VisitFunctionDeclaration(FunctionDeclaration* node) {
|
| IncrementNodeCount();
|
| @@ -640,6 +669,8 @@ bool AstNumberingVisitor::Renumber(FunctionLiteral* node) {
|
| DisableFullCodegenAndCrankshaft(kClassConstructorFunction);
|
| }
|
|
|
| + LanguageModeScope language_mode_scope(this, node->language_mode());
|
| +
|
| VisitDeclarations(scope->declarations());
|
| VisitStatements(node->body());
|
|
|
|
|