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.h" | 5 #include "src/ast.h" |
6 #include "src/ast-numbering.h" | 6 #include "src/ast-numbering.h" |
7 #include "src/scopes.h" | 7 #include "src/scopes.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 class AstNumberingVisitor final : public AstVisitor { | 12 class AstNumberingVisitor final : public AstVisitor { |
13 public: | 13 public: |
14 explicit AstNumberingVisitor(Isolate* isolate, Zone* zone) | 14 AstNumberingVisitor(Isolate* isolate, Zone* zone) |
15 : AstVisitor(), | 15 : AstVisitor(), |
16 next_id_(BailoutId::FirstUsable().ToInt()), | 16 next_id_(BailoutId::FirstUsable().ToInt()), |
17 properties_(zone), | 17 properties_(zone), |
18 ic_slot_cache_(4), | 18 ic_slot_cache_(4), |
19 dont_optimize_reason_(kNoReason) { | 19 dont_optimize_reason_(kNoReason) { |
20 InitializeAstVisitor(isolate, zone); | 20 InitializeAstVisitor(isolate, zone); |
21 } | 21 } |
22 | 22 |
23 bool Renumber(FunctionLiteral* node); | 23 bool Renumber(FunctionLiteral* node); |
24 | 24 |
25 private: | 25 private: |
26 // AST node visitor interface. | 26 // AST node visitor interface. |
27 #define DEFINE_VISIT(type) virtual void Visit##type(type* node) override; | 27 #define DEFINE_VISIT(type) virtual void Visit##type(type* node) override; |
28 AST_NODE_LIST(DEFINE_VISIT) | 28 AST_NODE_LIST(DEFINE_VISIT) |
29 #undef DEFINE_VISIT | 29 #undef DEFINE_VISIT |
30 | 30 |
31 bool Finish(FunctionLiteral* node); | 31 bool Finish(FunctionLiteral* node); |
32 | 32 |
33 void VisitVariableProxyReference(VariableProxy* node); | |
34 void VisitPropertyReference(Property* node); | |
35 void VisitReference(Expression* expr); | |
36 | |
33 void VisitStatements(ZoneList<Statement*>* statements) override; | 37 void VisitStatements(ZoneList<Statement*>* statements) override; |
34 void VisitDeclarations(ZoneList<Declaration*>* declarations) override; | 38 void VisitDeclarations(ZoneList<Declaration*>* declarations) override; |
35 void VisitArguments(ZoneList<Expression*>* arguments); | 39 void VisitArguments(ZoneList<Expression*>* arguments); |
36 void VisitObjectLiteralProperty(ObjectLiteralProperty* property); | 40 void VisitObjectLiteralProperty(ObjectLiteralProperty* property); |
37 | 41 |
38 int ReserveIdRange(int n) { | 42 int ReserveIdRange(int n) { |
39 int tmp = next_id_; | 43 int tmp = next_id_; |
40 next_id_ += n; | 44 next_id_ += n; |
41 return tmp; | 45 return tmp; |
42 } | 46 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
138 node->set_base_id(ReserveIdRange(Literal::num_ids())); | 142 node->set_base_id(ReserveIdRange(Literal::num_ids())); |
139 } | 143 } |
140 | 144 |
141 | 145 |
142 void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) { | 146 void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) { |
143 IncrementNodeCount(); | 147 IncrementNodeCount(); |
144 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); | 148 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); |
145 } | 149 } |
146 | 150 |
147 | 151 |
152 void AstNumberingVisitor::VisitVariableProxyReference(VariableProxy* node) { | |
153 IncrementNodeCount(); | |
154 if (node->var()->IsLookupSlot()) { | |
155 DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup); | |
156 } | |
157 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); | |
158 } | |
159 | |
160 | |
148 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { | 161 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { |
149 IncrementNodeCount(); | 162 VisitVariableProxyReference(node); |
150 if (node->var()->IsLookupSlot()) { | |
151 DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup); | |
152 } | |
153 ReserveFeedbackSlots(node); | 163 ReserveFeedbackSlots(node); |
154 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); | |
155 } | 164 } |
156 | 165 |
157 | 166 |
158 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { | 167 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { |
159 IncrementNodeCount(); | 168 IncrementNodeCount(); |
160 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); | 169 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); |
161 } | 170 } |
162 | 171 |
163 | 172 |
164 void AstNumberingVisitor::VisitSuperPropertyReference( | 173 void AstNumberingVisitor::VisitSuperPropertyReference( |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
297 | 306 |
298 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { | 307 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { |
299 IncrementNodeCount(); | 308 IncrementNodeCount(); |
300 DisableOptimization(kTryFinallyStatement); | 309 DisableOptimization(kTryFinallyStatement); |
301 node->set_base_id(ReserveIdRange(TryFinallyStatement::num_ids())); | 310 node->set_base_id(ReserveIdRange(TryFinallyStatement::num_ids())); |
302 Visit(node->try_block()); | 311 Visit(node->try_block()); |
303 Visit(node->finally_block()); | 312 Visit(node->finally_block()); |
304 } | 313 } |
305 | 314 |
306 | 315 |
316 void AstNumberingVisitor::VisitPropertyReference(Property* node) { | |
317 IncrementNodeCount(); | |
318 node->set_base_id(ReserveIdRange(Property::num_ids())); | |
319 Visit(node->key()); | |
320 Visit(node->obj()); | |
321 } | |
322 | |
323 | |
324 void AstNumberingVisitor::VisitReference(Expression* expr) { | |
325 DCHECK(expr->IsProperty() || expr->IsVariableProxy()); | |
326 if (expr->IsProperty()) | |
Benedikt Meurer
2015/07/30 06:32:22
Nit: if { ... } else { ... }
| |
327 VisitPropertyReference(expr->AsProperty()); | |
328 else | |
329 VisitVariableProxyReference(expr->AsVariableProxy()); | |
330 } | |
331 | |
332 | |
307 void AstNumberingVisitor::VisitProperty(Property* node) { | 333 void AstNumberingVisitor::VisitProperty(Property* node) { |
308 IncrementNodeCount(); | 334 VisitPropertyReference(node); |
309 ReserveFeedbackSlots(node); | 335 ReserveFeedbackSlots(node); |
310 node->set_base_id(ReserveIdRange(Property::num_ids())); | |
311 Visit(node->key()); | |
312 Visit(node->obj()); | |
313 } | 336 } |
314 | 337 |
315 | 338 |
316 void AstNumberingVisitor::VisitAssignment(Assignment* node) { | 339 void AstNumberingVisitor::VisitAssignment(Assignment* node) { |
317 IncrementNodeCount(); | 340 IncrementNodeCount(); |
318 node->set_base_id(ReserveIdRange(Assignment::num_ids())); | 341 node->set_base_id(ReserveIdRange(Assignment::num_ids())); |
319 if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); | 342 if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); |
320 Visit(node->target()); | 343 VisitReference(node->target()); |
321 Visit(node->value()); | 344 Visit(node->value()); |
322 ReserveFeedbackSlots(node); | 345 ReserveFeedbackSlots(node); |
323 } | 346 } |
324 | 347 |
325 | 348 |
326 void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) { | 349 void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) { |
327 IncrementNodeCount(); | 350 IncrementNodeCount(); |
328 node->set_base_id(ReserveIdRange(BinaryOperation::num_ids())); | 351 node->set_base_id(ReserveIdRange(BinaryOperation::num_ids())); |
329 Visit(node->left()); | 352 Visit(node->left()); |
330 Visit(node->right()); | 353 Visit(node->right()); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
544 } | 567 } |
545 | 568 |
546 | 569 |
547 bool AstNumbering::Renumber(Isolate* isolate, Zone* zone, | 570 bool AstNumbering::Renumber(Isolate* isolate, Zone* zone, |
548 FunctionLiteral* function) { | 571 FunctionLiteral* function) { |
549 AstNumberingVisitor visitor(isolate, zone); | 572 AstNumberingVisitor visitor(isolate, zone); |
550 return visitor.Renumber(function); | 573 return visitor.Renumber(function); |
551 } | 574 } |
552 } // namespace internal | 575 } // namespace internal |
553 } // namespace v8 | 576 } // namespace v8 |
OLD | NEW |