Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/ast/ast-numbering.h" | 5 #include "src/ast/ast-numbering.h" |
| 6 | 6 |
| 7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 IncrementNodeCount(); | 212 IncrementNodeCount(); |
| 213 Visit(node->expression()); | 213 Visit(node->expression()); |
| 214 } | 214 } |
| 215 | 215 |
| 216 | 216 |
| 217 void AstNumberingVisitor::VisitYield(Yield* node) { | 217 void AstNumberingVisitor::VisitYield(Yield* node) { |
| 218 node->set_yield_id(yield_count_); | 218 node->set_yield_id(yield_count_); |
| 219 yield_count_++; | 219 yield_count_++; |
| 220 IncrementNodeCount(); | 220 IncrementNodeCount(); |
| 221 node->set_base_id(ReserveIdRange(Yield::num_ids())); | 221 node->set_base_id(ReserveIdRange(Yield::num_ids())); |
| 222 Visit(node->generator_object()); | |
| 223 Visit(node->expression()); | 222 Visit(node->expression()); |
| 224 } | 223 } |
| 225 | 224 |
| 226 | 225 |
| 227 void AstNumberingVisitor::VisitThrow(Throw* node) { | 226 void AstNumberingVisitor::VisitThrow(Throw* node) { |
| 228 IncrementNodeCount(); | 227 IncrementNodeCount(); |
| 229 node->set_base_id(ReserveIdRange(Throw::num_ids())); | 228 node->set_base_id(ReserveIdRange(Throw::num_ids())); |
| 230 Visit(node->exception()); | 229 Visit(node->exception()); |
| 231 } | 230 } |
| 232 | 231 |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 414 } | 413 } |
| 415 | 414 |
| 416 void AstNumberingVisitor::VisitGetIterator(GetIterator* node) { | 415 void AstNumberingVisitor::VisitGetIterator(GetIterator* node) { |
| 417 IncrementNodeCount(); | 416 IncrementNodeCount(); |
| 418 DisableFullCodegenAndCrankshaft(kGetIterator); | 417 DisableFullCodegenAndCrankshaft(kGetIterator); |
| 419 node->set_base_id(ReserveIdRange(GetIterator::num_ids())); | 418 node->set_base_id(ReserveIdRange(GetIterator::num_ids())); |
| 420 Visit(node->iterable()); | 419 Visit(node->iterable()); |
| 421 ReserveFeedbackSlots(node); | 420 ReserveFeedbackSlots(node); |
| 422 } | 421 } |
| 423 | 422 |
| 423 void AstNumberingVisitor::VisitInternalVariable(InternalVariable* node) { | |
| 424 IncrementNodeCount(); | |
| 425 DisableFullCodegenAndCrankshaft(kNoReason); | |
| 426 } | |
| 427 | |
| 424 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { | 428 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { |
| 425 IncrementNodeCount(); | 429 IncrementNodeCount(); |
| 426 DisableSelfOptimization(); | 430 DisableSelfOptimization(); |
| 427 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); | 431 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); |
| 428 Visit(node->enumerable()); // Not part of loop. | 432 Visit(node->enumerable()); // Not part of loop. |
| 429 node->set_first_yield_id(yield_count_); | 433 node->set_first_yield_id(yield_count_); |
| 430 Visit(node->each()); | 434 Visit(node->each()); |
| 431 Visit(node->body()); | 435 Visit(node->body()); |
| 432 node->set_yield_count(yield_count_ - node->first_yield_id()); | 436 node->set_yield_count(yield_count_ - node->first_yield_id()); |
| 433 ReserveFeedbackSlots(node); | 437 ReserveFeedbackSlots(node); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 633 } | 637 } |
| 634 | 638 |
| 635 if (IsResumableFunction(node->kind())) { | 639 if (IsResumableFunction(node->kind())) { |
| 636 DisableFullCodegenAndCrankshaft(kGenerator); | 640 DisableFullCodegenAndCrankshaft(kGenerator); |
| 637 } | 641 } |
| 638 | 642 |
| 639 if (IsClassConstructor(node->kind())) { | 643 if (IsClassConstructor(node->kind())) { |
| 640 DisableFullCodegenAndCrankshaft(kClassConstructorFunction); | 644 DisableFullCodegenAndCrankshaft(kClassConstructorFunction); |
| 641 } | 645 } |
| 642 | 646 |
| 647 if (scope->is_function_scope()) { | |
| 648 Variable* function_var = scope->function_var(); | |
| 649 if (function_var != nullptr && !function_var->IsUnallocated()) { | |
| 650 // Initialization of local function-named variable is no longer part of | |
| 651 // the AST, and this initialization is not handled in full-codegen or | |
| 652 // crankshaft. | |
|
caitp
2017/01/30 04:20:29
I'm guessing there isn't a whole lot of cases wher
| |
| 653 DisableFullCodegenAndCrankshaft(kNoReason); | |
| 654 } | |
| 655 } | |
| 656 | |
| 657 if (IsGeneratorFunction(node->kind()) || scope->is_module_scope()) { | |
| 658 // Generator functions and Modules have an initial yield which is not | |
| 659 // included in the AST. | |
| 660 DCHECK_EQ(0, yield_count_); | |
| 661 yield_count_ = 1; | |
| 662 } | |
| 663 | |
| 643 VisitDeclarations(scope->declarations()); | 664 VisitDeclarations(scope->declarations()); |
| 665 if (node->parameter_init_block() != nullptr) { | |
| 666 DisableFullCodegenAndCrankshaft(kNonSimpleParameters); | |
| 667 VisitBlock(node->parameter_init_block()); | |
| 668 } | |
| 644 VisitStatements(node->body()); | 669 VisitStatements(node->body()); |
| 645 | 670 |
| 646 node->set_ast_properties(&properties_); | 671 node->set_ast_properties(&properties_); |
| 647 node->set_dont_optimize_reason(dont_optimize_reason()); | 672 node->set_dont_optimize_reason(dont_optimize_reason()); |
| 648 node->set_yield_count(yield_count_); | 673 node->set_yield_count(yield_count_); |
| 649 | 674 |
| 650 if (FLAG_trace_opt) { | 675 if (FLAG_trace_opt) { |
| 651 if (disable_crankshaft_reason_ != kNoReason) { | 676 if (disable_crankshaft_reason_ != kNoReason) { |
| 652 // TODO(leszeks): This is a quick'n'dirty fix to allow the debug name of | 677 // TODO(leszeks): This is a quick'n'dirty fix to allow the debug name of |
| 653 // the function to be accessed in the below print. This DCHECK will fail | 678 // the function to be accessed in the below print. This DCHECK will fail |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 670 Compiler::EagerInnerFunctionLiterals* eager_literals) { | 695 Compiler::EagerInnerFunctionLiterals* eager_literals) { |
| 671 DisallowHeapAllocation no_allocation; | 696 DisallowHeapAllocation no_allocation; |
| 672 DisallowHandleAllocation no_handles; | 697 DisallowHandleAllocation no_handles; |
| 673 DisallowHandleDereference no_deref; | 698 DisallowHandleDereference no_deref; |
| 674 | 699 |
| 675 AstNumberingVisitor visitor(stack_limit, zone, eager_literals); | 700 AstNumberingVisitor visitor(stack_limit, zone, eager_literals); |
| 676 return visitor.Renumber(function); | 701 return visitor.Renumber(function); |
| 677 } | 702 } |
| 678 } // namespace internal | 703 } // namespace internal |
| 679 } // namespace v8 | 704 } // namespace v8 |
| OLD | NEW |