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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 } | 57 } |
58 void DisableSelfOptimization() { | 58 void DisableSelfOptimization() { |
59 properties_.flags()->Add(kDontSelfOptimize); | 59 properties_.flags()->Add(kDontSelfOptimize); |
60 } | 60 } |
61 void DisableCaching(BailoutReason reason) { | 61 void DisableCaching(BailoutReason reason) { |
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> |
| 68 void ReserveFeedbackSlots(Node* node) { |
| 69 FeedbackVectorRequirements reqs = node->ComputeFeedbackRequirements(); |
| 70 if (reqs.slots() > 0) { |
| 71 node->SetFirstFeedbackSlot( |
| 72 FeedbackVectorSlot(properties_.feedback_slots())); |
| 73 properties_.increase_feedback_slots(reqs.slots()); |
| 74 } |
| 75 if (reqs.ic_slots() > 0) { |
| 76 node->SetFirstFeedbackICSlot( |
| 77 FeedbackVectorICSlot(properties_.ic_feedback_slots())); |
| 78 properties_.increase_ic_feedback_slots(reqs.ic_slots()); |
| 79 } |
| 80 } |
| 81 |
67 BailoutReason dont_optimize_reason() const { | 82 BailoutReason dont_optimize_reason() const { |
68 return (dont_turbofan_reason_ != kNoReason) ? dont_turbofan_reason_ | 83 return (dont_turbofan_reason_ != kNoReason) ? dont_turbofan_reason_ |
69 : dont_crankshaft_reason_; | 84 : dont_crankshaft_reason_; |
70 } | 85 } |
71 | 86 |
72 int next_id_; | 87 int next_id_; |
73 AstProperties properties_; | 88 AstProperties properties_; |
74 BailoutReason dont_crankshaft_reason_; | 89 BailoutReason dont_crankshaft_reason_; |
75 BailoutReason dont_turbofan_reason_; | 90 BailoutReason dont_turbofan_reason_; |
76 | 91 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 IncrementNodeCount(); | 153 IncrementNodeCount(); |
139 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); | 154 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); |
140 } | 155 } |
141 | 156 |
142 | 157 |
143 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { | 158 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { |
144 IncrementNodeCount(); | 159 IncrementNodeCount(); |
145 if (node->var()->IsLookupSlot()) { | 160 if (node->var()->IsLookupSlot()) { |
146 DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup); | 161 DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup); |
147 } | 162 } |
| 163 ReserveFeedbackSlots(node); |
148 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); | 164 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); |
149 } | 165 } |
150 | 166 |
151 | 167 |
152 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { | 168 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { |
153 IncrementNodeCount(); | 169 IncrementNodeCount(); |
154 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); | 170 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); |
155 } | 171 } |
156 | 172 |
157 | 173 |
158 void AstNumberingVisitor::VisitSuperReference(SuperReference* node) { | 174 void AstNumberingVisitor::VisitSuperReference(SuperReference* node) { |
159 IncrementNodeCount(); | 175 IncrementNodeCount(); |
160 DisableTurbofan(kSuperReference); | 176 DisableTurbofan(kSuperReference); |
| 177 ReserveFeedbackSlots(node); |
161 node->set_base_id(ReserveIdRange(SuperReference::num_ids())); | 178 node->set_base_id(ReserveIdRange(SuperReference::num_ids())); |
162 Visit(node->this_var()); | 179 Visit(node->this_var()); |
163 } | 180 } |
164 | 181 |
165 | 182 |
166 void AstNumberingVisitor::VisitModuleDeclaration(ModuleDeclaration* node) { | 183 void AstNumberingVisitor::VisitModuleDeclaration(ModuleDeclaration* node) { |
167 IncrementNodeCount(); | 184 IncrementNodeCount(); |
168 DisableCrankshaft(kModuleDeclaration); | 185 DisableCrankshaft(kModuleDeclaration); |
169 VisitVariableProxy(node->proxy()); | 186 VisitVariableProxy(node->proxy()); |
170 Visit(node->module()); | 187 Visit(node->module()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 | 225 |
209 void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) { | 226 void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) { |
210 IncrementNodeCount(); | 227 IncrementNodeCount(); |
211 Visit(node->expression()); | 228 Visit(node->expression()); |
212 } | 229 } |
213 | 230 |
214 | 231 |
215 void AstNumberingVisitor::VisitYield(Yield* node) { | 232 void AstNumberingVisitor::VisitYield(Yield* node) { |
216 IncrementNodeCount(); | 233 IncrementNodeCount(); |
217 DisableCrankshaft(kYield); | 234 DisableCrankshaft(kYield); |
| 235 ReserveFeedbackSlots(node); |
218 node->set_base_id(ReserveIdRange(Yield::num_ids())); | 236 node->set_base_id(ReserveIdRange(Yield::num_ids())); |
219 Visit(node->generator_object()); | 237 Visit(node->generator_object()); |
220 Visit(node->expression()); | 238 Visit(node->expression()); |
221 } | 239 } |
222 | 240 |
223 | 241 |
224 void AstNumberingVisitor::VisitThrow(Throw* node) { | 242 void AstNumberingVisitor::VisitThrow(Throw* node) { |
225 IncrementNodeCount(); | 243 IncrementNodeCount(); |
226 node->set_base_id(ReserveIdRange(Throw::num_ids())); | 244 node->set_base_id(ReserveIdRange(Throw::num_ids())); |
227 Visit(node->exception()); | 245 Visit(node->exception()); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { | 330 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { |
313 IncrementNodeCount(); | 331 IncrementNodeCount(); |
314 DisableTurbofan(kTryFinallyStatement); | 332 DisableTurbofan(kTryFinallyStatement); |
315 Visit(node->try_block()); | 333 Visit(node->try_block()); |
316 Visit(node->finally_block()); | 334 Visit(node->finally_block()); |
317 } | 335 } |
318 | 336 |
319 | 337 |
320 void AstNumberingVisitor::VisitProperty(Property* node) { | 338 void AstNumberingVisitor::VisitProperty(Property* node) { |
321 IncrementNodeCount(); | 339 IncrementNodeCount(); |
| 340 ReserveFeedbackSlots(node); |
322 node->set_base_id(ReserveIdRange(Property::num_ids())); | 341 node->set_base_id(ReserveIdRange(Property::num_ids())); |
323 Visit(node->key()); | 342 Visit(node->key()); |
324 Visit(node->obj()); | 343 Visit(node->obj()); |
325 } | 344 } |
326 | 345 |
327 | 346 |
328 void AstNumberingVisitor::VisitAssignment(Assignment* node) { | 347 void AstNumberingVisitor::VisitAssignment(Assignment* node) { |
329 IncrementNodeCount(); | 348 IncrementNodeCount(); |
330 node->set_base_id(ReserveIdRange(Assignment::num_ids())); | 349 node->set_base_id(ReserveIdRange(Assignment::num_ids())); |
331 if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); | 350 if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); |
(...skipping 14 matching lines...) Expand all Loading... |
346 IncrementNodeCount(); | 365 IncrementNodeCount(); |
347 node->set_base_id(ReserveIdRange(CompareOperation::num_ids())); | 366 node->set_base_id(ReserveIdRange(CompareOperation::num_ids())); |
348 Visit(node->left()); | 367 Visit(node->left()); |
349 Visit(node->right()); | 368 Visit(node->right()); |
350 } | 369 } |
351 | 370 |
352 | 371 |
353 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { | 372 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { |
354 IncrementNodeCount(); | 373 IncrementNodeCount(); |
355 DisableSelfOptimization(); | 374 DisableSelfOptimization(); |
| 375 ReserveFeedbackSlots(node); |
356 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); | 376 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); |
357 Visit(node->each()); | 377 Visit(node->each()); |
358 Visit(node->enumerable()); | 378 Visit(node->enumerable()); |
359 Visit(node->body()); | 379 Visit(node->body()); |
360 } | 380 } |
361 | 381 |
362 | 382 |
363 void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { | 383 void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { |
364 IncrementNodeCount(); | 384 IncrementNodeCount(); |
365 DisableTurbofan(kForOfStatement); | 385 DisableTurbofan(kForOfStatement); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 IncrementNodeCount(); | 474 IncrementNodeCount(); |
455 node->set_base_id(ReserveIdRange(node->num_ids())); | 475 node->set_base_id(ReserveIdRange(node->num_ids())); |
456 for (int i = 0; i < node->values()->length(); i++) { | 476 for (int i = 0; i < node->values()->length(); i++) { |
457 Visit(node->values()->at(i)); | 477 Visit(node->values()->at(i)); |
458 } | 478 } |
459 } | 479 } |
460 | 480 |
461 | 481 |
462 void AstNumberingVisitor::VisitCall(Call* node) { | 482 void AstNumberingVisitor::VisitCall(Call* node) { |
463 IncrementNodeCount(); | 483 IncrementNodeCount(); |
| 484 ReserveFeedbackSlots(node); |
464 node->set_base_id(ReserveIdRange(Call::num_ids())); | 485 node->set_base_id(ReserveIdRange(Call::num_ids())); |
465 Visit(node->expression()); | 486 Visit(node->expression()); |
466 VisitArguments(node->arguments()); | 487 VisitArguments(node->arguments()); |
467 } | 488 } |
468 | 489 |
469 | 490 |
470 void AstNumberingVisitor::VisitCallNew(CallNew* node) { | 491 void AstNumberingVisitor::VisitCallNew(CallNew* node) { |
471 IncrementNodeCount(); | 492 IncrementNodeCount(); |
| 493 ReserveFeedbackSlots(node); |
472 node->set_base_id(ReserveIdRange(CallNew::num_ids())); | 494 node->set_base_id(ReserveIdRange(CallNew::num_ids())); |
473 Visit(node->expression()); | 495 Visit(node->expression()); |
474 VisitArguments(node->arguments()); | 496 VisitArguments(node->arguments()); |
475 } | 497 } |
476 | 498 |
477 | 499 |
478 void AstNumberingVisitor::VisitStatements(ZoneList<Statement*>* statements) { | 500 void AstNumberingVisitor::VisitStatements(ZoneList<Statement*>* statements) { |
479 if (statements == NULL) return; | 501 if (statements == NULL) return; |
480 for (int i = 0; i < statements->length(); i++) { | 502 for (int i = 0; i < statements->length(); i++) { |
481 Visit(statements->at(i)); | 503 Visit(statements->at(i)); |
(...skipping 18 matching lines...) Expand all Loading... |
500 | 522 |
501 void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { | 523 void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) { |
502 IncrementNodeCount(); | 524 IncrementNodeCount(); |
503 node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids())); | 525 node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids())); |
504 // We don't recurse into the declarations or body of the function literal: | 526 // We don't recurse into the declarations or body of the function literal: |
505 // you have to separately Renumber() each FunctionLiteral that you compile. | 527 // you have to separately Renumber() each FunctionLiteral that you compile. |
506 } | 528 } |
507 | 529 |
508 | 530 |
509 void AstNumberingVisitor::Renumber(FunctionLiteral* node) { | 531 void AstNumberingVisitor::Renumber(FunctionLiteral* node) { |
510 properties_.flags()->Add(*node->flags()); | |
511 properties_.increase_feedback_slots(node->slot_count()); | |
512 properties_.increase_ic_feedback_slots(node->ic_slot_count()); | |
513 | |
514 if (node->scope()->HasIllegalRedeclaration()) { | 532 if (node->scope()->HasIllegalRedeclaration()) { |
515 node->scope()->VisitIllegalRedeclaration(this); | 533 node->scope()->VisitIllegalRedeclaration(this); |
516 return; | 534 return; |
517 } | 535 } |
518 | 536 |
519 Scope* scope = node->scope(); | 537 Scope* scope = node->scope(); |
520 VisitDeclarations(scope->declarations()); | 538 VisitDeclarations(scope->declarations()); |
521 if (scope->is_function_scope() && scope->function() != NULL) { | 539 if (scope->is_function_scope() && scope->function() != NULL) { |
522 // Visit the name of the named function expression. | 540 // Visit the name of the named function expression. |
523 Visit(scope->function()); | 541 Visit(scope->function()); |
524 } | 542 } |
525 VisitStatements(node->body()); | 543 VisitStatements(node->body()); |
526 | 544 |
527 node->set_ast_properties(&properties_); | 545 node->set_ast_properties(&properties_); |
528 node->set_dont_optimize_reason(dont_optimize_reason()); | 546 node->set_dont_optimize_reason(dont_optimize_reason()); |
529 } | 547 } |
530 | 548 |
531 | 549 |
532 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { | 550 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { |
533 AstNumberingVisitor visitor(zone); | 551 AstNumberingVisitor visitor(zone); |
534 visitor.Renumber(function); | 552 visitor.Renumber(function); |
535 return !visitor.HasStackOverflow(); | 553 return !visitor.HasStackOverflow(); |
536 } | 554 } |
537 } | 555 } |
538 } // namespace v8::internal | 556 } // namespace v8::internal |
OLD | NEW |