Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(355)

Side by Side Diff: src/ast-numbering.cc

Issue 1262803002: Stop overallocating feedback vector slots. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed nit. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast.h ('k') | src/type-info.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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()) {
327 VisitPropertyReference(expr->AsProperty());
328 } else {
329 VisitVariableProxyReference(expr->AsVariableProxy());
330 }
331 }
332
333
307 void AstNumberingVisitor::VisitProperty(Property* node) { 334 void AstNumberingVisitor::VisitProperty(Property* node) {
308 IncrementNodeCount(); 335 VisitPropertyReference(node);
309 ReserveFeedbackSlots(node); 336 ReserveFeedbackSlots(node);
310 node->set_base_id(ReserveIdRange(Property::num_ids()));
311 Visit(node->key());
312 Visit(node->obj());
313 } 337 }
314 338
315 339
316 void AstNumberingVisitor::VisitAssignment(Assignment* node) { 340 void AstNumberingVisitor::VisitAssignment(Assignment* node) {
317 IncrementNodeCount(); 341 IncrementNodeCount();
318 node->set_base_id(ReserveIdRange(Assignment::num_ids())); 342 node->set_base_id(ReserveIdRange(Assignment::num_ids()));
319 if (node->is_compound()) VisitBinaryOperation(node->binary_operation()); 343 if (node->is_compound()) VisitBinaryOperation(node->binary_operation());
320 Visit(node->target()); 344 VisitReference(node->target());
321 Visit(node->value()); 345 Visit(node->value());
322 ReserveFeedbackSlots(node); 346 ReserveFeedbackSlots(node);
323 } 347 }
324 348
325 349
326 void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) { 350 void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) {
327 IncrementNodeCount(); 351 IncrementNodeCount();
328 node->set_base_id(ReserveIdRange(BinaryOperation::num_ids())); 352 node->set_base_id(ReserveIdRange(BinaryOperation::num_ids()));
329 Visit(node->left()); 353 Visit(node->left());
330 Visit(node->right()); 354 Visit(node->right());
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 } 568 }
545 569
546 570
547 bool AstNumbering::Renumber(Isolate* isolate, Zone* zone, 571 bool AstNumbering::Renumber(Isolate* isolate, Zone* zone,
548 FunctionLiteral* function) { 572 FunctionLiteral* function) {
549 AstNumberingVisitor visitor(isolate, zone); 573 AstNumberingVisitor visitor(isolate, zone);
550 return visitor.Renumber(function); 574 return visitor.Renumber(function);
551 } 575 }
552 } // namespace internal 576 } // namespace internal
553 } // namespace v8 577 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast.h ('k') | src/type-info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698