| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/ast.h" | 7 #include "src/ast.h" |
| 8 #include "src/ast-numbering.h" | 8 #include "src/ast-numbering.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/scopes.h" | 10 #include "src/scopes.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 dont_crankshaft_reason_ = reason; | 62 dont_crankshaft_reason_ = reason; |
| 63 DisableSelfOptimization(); | 63 DisableSelfOptimization(); |
| 64 properties_.flags()->Add(kDontCache); | 64 properties_.flags()->Add(kDontCache); |
| 65 } | 65 } |
| 66 | 66 |
| 67 template <typename Node> | 67 template <typename Node> |
| 68 void ReserveFeedbackSlots(Node* node) { | 68 void ReserveFeedbackSlots(Node* node) { |
| 69 FeedbackVectorRequirements reqs = | 69 FeedbackVectorRequirements reqs = |
| 70 node->ComputeFeedbackRequirements(isolate()); | 70 node->ComputeFeedbackRequirements(isolate()); |
| 71 if (reqs.slots() > 0) { | 71 if (reqs.slots() > 0) { |
| 72 node->SetFirstFeedbackSlot( | 72 node->SetFirstFeedbackSlot(FeedbackVectorSlot(properties_.slots())); |
| 73 FeedbackVectorSlot(properties_.feedback_slots())); | 73 properties_.increase_slots(reqs.slots()); |
| 74 properties_.increase_feedback_slots(reqs.slots()); | |
| 75 } | 74 } |
| 76 if (reqs.ic_slots() > 0) { | 75 if (reqs.ic_slots() > 0) { |
| 77 node->SetFirstFeedbackICSlot( | 76 int ic_slots = properties_.ic_slots(); |
| 78 FeedbackVectorICSlot(properties_.ic_feedback_slots())); | 77 node->SetFirstFeedbackICSlot(FeedbackVectorICSlot(ic_slots)); |
| 79 properties_.increase_ic_feedback_slots(reqs.ic_slots()); | 78 properties_.increase_ic_slots(reqs.ic_slots()); |
| 79 if (FLAG_vector_ics) { |
| 80 for (int i = 0; i < reqs.ic_slots(); i++) { |
| 81 properties_.SetKind(ic_slots + i, node->FeedbackICSlotKind(i)); |
| 82 } |
| 83 } |
| 80 } | 84 } |
| 81 } | 85 } |
| 82 | 86 |
| 83 BailoutReason dont_optimize_reason() const { | 87 BailoutReason dont_optimize_reason() const { |
| 84 return (dont_turbofan_reason_ != kNoReason) ? dont_turbofan_reason_ | 88 return (dont_turbofan_reason_ != kNoReason) ? dont_turbofan_reason_ |
| 85 : dont_crankshaft_reason_; | 89 : dont_crankshaft_reason_; |
| 86 } | 90 } |
| 87 | 91 |
| 88 int next_id_; | 92 int next_id_; |
| 89 AstProperties properties_; | 93 AstProperties properties_; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 | 282 |
| 279 void AstNumberingVisitor::VisitModuleLiteral(ModuleLiteral* node) { | 283 void AstNumberingVisitor::VisitModuleLiteral(ModuleLiteral* node) { |
| 280 IncrementNodeCount(); | 284 IncrementNodeCount(); |
| 281 DisableCaching(kModuleLiteral); | 285 DisableCaching(kModuleLiteral); |
| 282 VisitBlock(node->body()); | 286 VisitBlock(node->body()); |
| 283 } | 287 } |
| 284 | 288 |
| 285 | 289 |
| 286 void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) { | 290 void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) { |
| 287 IncrementNodeCount(); | 291 IncrementNodeCount(); |
| 292 ReserveFeedbackSlots(node); |
| 288 if (node->is_jsruntime()) { | 293 if (node->is_jsruntime()) { |
| 289 // Don't try to optimize JS runtime calls because we bailout on them. | 294 // Don't try to optimize JS runtime calls because we bailout on them. |
| 290 DisableCrankshaft(kCallToAJavaScriptRuntimeFunction); | 295 DisableCrankshaft(kCallToAJavaScriptRuntimeFunction); |
| 291 } | 296 } |
| 292 node->set_base_id(ReserveIdRange(CallRuntime::num_ids())); | 297 node->set_base_id(ReserveIdRange(CallRuntime::num_ids())); |
| 293 VisitArguments(node->arguments()); | 298 VisitArguments(node->arguments()); |
| 294 } | 299 } |
| 295 | 300 |
| 296 | 301 |
| 297 void AstNumberingVisitor::VisitWithStatement(WithStatement* node) { | 302 void AstNumberingVisitor::VisitWithStatement(WithStatement* node) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 IncrementNodeCount(); | 533 IncrementNodeCount(); |
| 529 node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids())); | 534 node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids())); |
| 530 // We don't recurse into the declarations or body of the function literal: | 535 // We don't recurse into the declarations or body of the function literal: |
| 531 // you have to separately Renumber() each FunctionLiteral that you compile. | 536 // you have to separately Renumber() each FunctionLiteral that you compile. |
| 532 } | 537 } |
| 533 | 538 |
| 534 | 539 |
| 535 void AstNumberingVisitor::Renumber(FunctionLiteral* node) { | 540 void AstNumberingVisitor::Renumber(FunctionLiteral* node) { |
| 536 if (node->scope()->HasIllegalRedeclaration()) { | 541 if (node->scope()->HasIllegalRedeclaration()) { |
| 537 node->scope()->VisitIllegalRedeclaration(this); | 542 node->scope()->VisitIllegalRedeclaration(this); |
| 543 node->set_ast_properties(&properties_); |
| 538 return; | 544 return; |
| 539 } | 545 } |
| 540 | 546 |
| 541 Scope* scope = node->scope(); | 547 Scope* scope = node->scope(); |
| 542 VisitDeclarations(scope->declarations()); | 548 VisitDeclarations(scope->declarations()); |
| 543 if (scope->is_function_scope() && scope->function() != NULL) { | 549 if (scope->is_function_scope() && scope->function() != NULL) { |
| 544 // Visit the name of the named function expression. | 550 // Visit the name of the named function expression. |
| 545 Visit(scope->function()); | 551 Visit(scope->function()); |
| 546 } | 552 } |
| 547 VisitStatements(node->body()); | 553 VisitStatements(node->body()); |
| 548 | 554 |
| 549 node->set_ast_properties(&properties_); | 555 node->set_ast_properties(&properties_); |
| 550 node->set_dont_optimize_reason(dont_optimize_reason()); | 556 node->set_dont_optimize_reason(dont_optimize_reason()); |
| 551 } | 557 } |
| 552 | 558 |
| 553 | 559 |
| 554 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { | 560 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { |
| 555 AstNumberingVisitor visitor(zone); | 561 AstNumberingVisitor visitor(zone); |
| 556 visitor.Renumber(function); | 562 visitor.Renumber(function); |
| 557 return !visitor.HasStackOverflow(); | 563 return !visitor.HasStackOverflow(); |
| 558 } | 564 } |
| 559 } | 565 } |
| 560 } // namespace v8::internal | 566 } // namespace v8::internal |
| OLD | NEW |