• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "src/ast/ast-numbering.h"
6 
7 #include "src/ast/ast.h"
8 #include "src/ast/scopes.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 class AstNumberingVisitor final : public AstVisitor {
14  public:
AstNumberingVisitor(Isolate * isolate,Zone * zone)15   AstNumberingVisitor(Isolate* isolate, Zone* zone)
16       : AstVisitor(),
17         isolate_(isolate),
18         zone_(zone),
19         next_id_(BailoutId::FirstUsable().ToInt()),
20         yield_count_(0),
21         properties_(zone),
22         slot_cache_(zone),
23         dont_optimize_reason_(kNoReason) {
24     InitializeAstVisitor(isolate);
25   }
26 
27   bool Renumber(FunctionLiteral* node);
28 
29  private:
30 // AST node visitor interface.
31 #define DEFINE_VISIT(type) void Visit##type(type* node) override;
32   AST_NODE_LIST(DEFINE_VISIT)
33 #undef DEFINE_VISIT
34 
35   void VisitVariableProxyReference(VariableProxy* node);
36   void VisitPropertyReference(Property* node);
37   void VisitReference(Expression* expr);
38 
39   void VisitStatements(ZoneList<Statement*>* statements) override;
40   void VisitDeclarations(ZoneList<Declaration*>* declarations) override;
41   void VisitArguments(ZoneList<Expression*>* arguments);
42   void VisitObjectLiteralProperty(ObjectLiteralProperty* property);
43 
ReserveIdRange(int n)44   int ReserveIdRange(int n) {
45     int tmp = next_id_;
46     next_id_ += n;
47     return tmp;
48   }
49 
IncrementNodeCount()50   void IncrementNodeCount() { properties_.add_node_count(1); }
DisableSelfOptimization()51   void DisableSelfOptimization() {
52     properties_.flags() |= AstProperties::kDontSelfOptimize;
53   }
DisableOptimization(BailoutReason reason)54   void DisableOptimization(BailoutReason reason) {
55     dont_optimize_reason_ = reason;
56     DisableSelfOptimization();
57   }
DisableCrankshaft(BailoutReason reason)58   void DisableCrankshaft(BailoutReason reason) {
59     if (FLAG_turbo_shipping) {
60       properties_.flags() |= AstProperties::kDontCrankshaft;
61     } else {
62       dont_optimize_reason_ = reason;
63       DisableSelfOptimization();
64     }
65   }
66 
67   template <typename Node>
ReserveFeedbackSlots(Node * node)68   void ReserveFeedbackSlots(Node* node) {
69     node->AssignFeedbackVectorSlots(isolate_, properties_.get_spec(),
70                                     &slot_cache_);
71   }
72 
dont_optimize_reason() const73   BailoutReason dont_optimize_reason() const { return dont_optimize_reason_; }
74 
75   Isolate* isolate_;
76   Zone* zone_;
77   int next_id_;
78   int yield_count_;
79   AstProperties properties_;
80   // The slot cache allows us to reuse certain feedback vector slots.
81   FeedbackVectorSlotCache slot_cache_;
82   BailoutReason dont_optimize_reason_;
83 
84   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
85   DISALLOW_COPY_AND_ASSIGN(AstNumberingVisitor);
86 };
87 
88 
VisitVariableDeclaration(VariableDeclaration * node)89 void AstNumberingVisitor::VisitVariableDeclaration(VariableDeclaration* node) {
90   IncrementNodeCount();
91   VisitVariableProxy(node->proxy());
92 }
93 
94 
VisitExportDeclaration(ExportDeclaration * node)95 void AstNumberingVisitor::VisitExportDeclaration(ExportDeclaration* node) {
96   IncrementNodeCount();
97   DisableOptimization(kExportDeclaration);
98   VisitVariableProxy(node->proxy());
99 }
100 
101 
VisitEmptyStatement(EmptyStatement * node)102 void AstNumberingVisitor::VisitEmptyStatement(EmptyStatement* node) {
103   IncrementNodeCount();
104 }
105 
106 
VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement * node)107 void AstNumberingVisitor::VisitSloppyBlockFunctionStatement(
108     SloppyBlockFunctionStatement* node) {
109   IncrementNodeCount();
110   Visit(node->statement());
111 }
112 
113 
VisitContinueStatement(ContinueStatement * node)114 void AstNumberingVisitor::VisitContinueStatement(ContinueStatement* node) {
115   IncrementNodeCount();
116 }
117 
118 
VisitBreakStatement(BreakStatement * node)119 void AstNumberingVisitor::VisitBreakStatement(BreakStatement* node) {
120   IncrementNodeCount();
121 }
122 
123 
VisitDebuggerStatement(DebuggerStatement * node)124 void AstNumberingVisitor::VisitDebuggerStatement(DebuggerStatement* node) {
125   IncrementNodeCount();
126   DisableOptimization(kDebuggerStatement);
127   node->set_base_id(ReserveIdRange(DebuggerStatement::num_ids()));
128 }
129 
130 
VisitNativeFunctionLiteral(NativeFunctionLiteral * node)131 void AstNumberingVisitor::VisitNativeFunctionLiteral(
132     NativeFunctionLiteral* node) {
133   IncrementNodeCount();
134   DisableOptimization(kNativeFunctionLiteral);
135   node->set_base_id(ReserveIdRange(NativeFunctionLiteral::num_ids()));
136 }
137 
138 
VisitDoExpression(DoExpression * node)139 void AstNumberingVisitor::VisitDoExpression(DoExpression* node) {
140   IncrementNodeCount();
141   node->set_base_id(ReserveIdRange(DoExpression::num_ids()));
142   Visit(node->block());
143   Visit(node->result());
144 }
145 
146 
VisitLiteral(Literal * node)147 void AstNumberingVisitor::VisitLiteral(Literal* node) {
148   IncrementNodeCount();
149   node->set_base_id(ReserveIdRange(Literal::num_ids()));
150 }
151 
152 
VisitRegExpLiteral(RegExpLiteral * node)153 void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) {
154   IncrementNodeCount();
155   node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids()));
156 }
157 
158 
VisitVariableProxyReference(VariableProxy * node)159 void AstNumberingVisitor::VisitVariableProxyReference(VariableProxy* node) {
160   IncrementNodeCount();
161   if (node->var()->IsLookupSlot()) {
162     DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup);
163   }
164   node->set_base_id(ReserveIdRange(VariableProxy::num_ids()));
165 }
166 
167 
VisitVariableProxy(VariableProxy * node)168 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) {
169   VisitVariableProxyReference(node);
170   ReserveFeedbackSlots(node);
171 }
172 
173 
VisitThisFunction(ThisFunction * node)174 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) {
175   IncrementNodeCount();
176   node->set_base_id(ReserveIdRange(ThisFunction::num_ids()));
177 }
178 
179 
VisitSuperPropertyReference(SuperPropertyReference * node)180 void AstNumberingVisitor::VisitSuperPropertyReference(
181     SuperPropertyReference* node) {
182   IncrementNodeCount();
183   DisableCrankshaft(kSuperReference);
184   node->set_base_id(ReserveIdRange(SuperPropertyReference::num_ids()));
185   Visit(node->this_var());
186   Visit(node->home_object());
187 }
188 
189 
VisitSuperCallReference(SuperCallReference * node)190 void AstNumberingVisitor::VisitSuperCallReference(SuperCallReference* node) {
191   IncrementNodeCount();
192   DisableCrankshaft(kSuperReference);
193   node->set_base_id(ReserveIdRange(SuperCallReference::num_ids()));
194   Visit(node->this_var());
195   Visit(node->new_target_var());
196   Visit(node->this_function_var());
197 }
198 
199 
VisitImportDeclaration(ImportDeclaration * node)200 void AstNumberingVisitor::VisitImportDeclaration(ImportDeclaration* node) {
201   IncrementNodeCount();
202   DisableOptimization(kImportDeclaration);
203   VisitVariableProxy(node->proxy());
204 }
205 
206 
VisitExpressionStatement(ExpressionStatement * node)207 void AstNumberingVisitor::VisitExpressionStatement(ExpressionStatement* node) {
208   IncrementNodeCount();
209   Visit(node->expression());
210 }
211 
212 
VisitReturnStatement(ReturnStatement * node)213 void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) {
214   IncrementNodeCount();
215   Visit(node->expression());
216 }
217 
218 
VisitYield(Yield * node)219 void AstNumberingVisitor::VisitYield(Yield* node) {
220   node->set_yield_id(yield_count_);
221   yield_count_++;
222   IncrementNodeCount();
223   ReserveFeedbackSlots(node);
224   node->set_base_id(ReserveIdRange(Yield::num_ids()));
225   Visit(node->generator_object());
226   Visit(node->expression());
227 }
228 
229 
VisitThrow(Throw * node)230 void AstNumberingVisitor::VisitThrow(Throw* node) {
231   IncrementNodeCount();
232   node->set_base_id(ReserveIdRange(Throw::num_ids()));
233   Visit(node->exception());
234 }
235 
236 
VisitUnaryOperation(UnaryOperation * node)237 void AstNumberingVisitor::VisitUnaryOperation(UnaryOperation* node) {
238   IncrementNodeCount();
239   node->set_base_id(ReserveIdRange(UnaryOperation::num_ids()));
240   Visit(node->expression());
241 }
242 
243 
VisitCountOperation(CountOperation * node)244 void AstNumberingVisitor::VisitCountOperation(CountOperation* node) {
245   IncrementNodeCount();
246   node->set_base_id(ReserveIdRange(CountOperation::num_ids()));
247   Visit(node->expression());
248   ReserveFeedbackSlots(node);
249 }
250 
251 
VisitBlock(Block * node)252 void AstNumberingVisitor::VisitBlock(Block* node) {
253   IncrementNodeCount();
254   node->set_base_id(ReserveIdRange(Block::num_ids()));
255   if (node->scope() != NULL) VisitDeclarations(node->scope()->declarations());
256   VisitStatements(node->statements());
257 }
258 
259 
VisitFunctionDeclaration(FunctionDeclaration * node)260 void AstNumberingVisitor::VisitFunctionDeclaration(FunctionDeclaration* node) {
261   IncrementNodeCount();
262   VisitVariableProxy(node->proxy());
263   VisitFunctionLiteral(node->fun());
264 }
265 
266 
VisitCallRuntime(CallRuntime * node)267 void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) {
268   IncrementNodeCount();
269   ReserveFeedbackSlots(node);
270   node->set_base_id(ReserveIdRange(CallRuntime::num_ids()));
271   VisitArguments(node->arguments());
272 }
273 
274 
VisitWithStatement(WithStatement * node)275 void AstNumberingVisitor::VisitWithStatement(WithStatement* node) {
276   IncrementNodeCount();
277   DisableCrankshaft(kWithStatement);
278   node->set_base_id(ReserveIdRange(WithStatement::num_ids()));
279   Visit(node->expression());
280   Visit(node->statement());
281 }
282 
283 
VisitDoWhileStatement(DoWhileStatement * node)284 void AstNumberingVisitor::VisitDoWhileStatement(DoWhileStatement* node) {
285   IncrementNodeCount();
286   DisableSelfOptimization();
287   node->set_base_id(ReserveIdRange(DoWhileStatement::num_ids()));
288   node->set_first_yield_id(yield_count_);
289   Visit(node->body());
290   Visit(node->cond());
291   node->set_yield_count(yield_count_ - node->first_yield_id());
292 }
293 
294 
VisitWhileStatement(WhileStatement * node)295 void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) {
296   IncrementNodeCount();
297   DisableSelfOptimization();
298   node->set_base_id(ReserveIdRange(WhileStatement::num_ids()));
299   node->set_first_yield_id(yield_count_);
300   Visit(node->cond());
301   Visit(node->body());
302   node->set_yield_count(yield_count_ - node->first_yield_id());
303 }
304 
305 
VisitTryCatchStatement(TryCatchStatement * node)306 void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) {
307   IncrementNodeCount();
308   DisableCrankshaft(kTryCatchStatement);
309   Visit(node->try_block());
310   Visit(node->catch_block());
311 }
312 
313 
VisitTryFinallyStatement(TryFinallyStatement * node)314 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) {
315   IncrementNodeCount();
316   DisableCrankshaft(kTryFinallyStatement);
317   Visit(node->try_block());
318   Visit(node->finally_block());
319 }
320 
321 
VisitPropertyReference(Property * node)322 void AstNumberingVisitor::VisitPropertyReference(Property* node) {
323   IncrementNodeCount();
324   node->set_base_id(ReserveIdRange(Property::num_ids()));
325   Visit(node->key());
326   Visit(node->obj());
327 }
328 
329 
VisitReference(Expression * expr)330 void AstNumberingVisitor::VisitReference(Expression* expr) {
331   DCHECK(expr->IsProperty() || expr->IsVariableProxy());
332   if (expr->IsProperty()) {
333     VisitPropertyReference(expr->AsProperty());
334   } else {
335     VisitVariableProxyReference(expr->AsVariableProxy());
336   }
337 }
338 
339 
VisitProperty(Property * node)340 void AstNumberingVisitor::VisitProperty(Property* node) {
341   VisitPropertyReference(node);
342   ReserveFeedbackSlots(node);
343 }
344 
345 
VisitAssignment(Assignment * node)346 void AstNumberingVisitor::VisitAssignment(Assignment* node) {
347   IncrementNodeCount();
348   node->set_base_id(ReserveIdRange(Assignment::num_ids()));
349 
350   if (node->is_compound()) VisitBinaryOperation(node->binary_operation());
351   VisitReference(node->target());
352   Visit(node->value());
353   ReserveFeedbackSlots(node);
354 }
355 
356 
VisitBinaryOperation(BinaryOperation * node)357 void AstNumberingVisitor::VisitBinaryOperation(BinaryOperation* node) {
358   IncrementNodeCount();
359   node->set_base_id(ReserveIdRange(BinaryOperation::num_ids()));
360   Visit(node->left());
361   Visit(node->right());
362 }
363 
364 
VisitCompareOperation(CompareOperation * node)365 void AstNumberingVisitor::VisitCompareOperation(CompareOperation* node) {
366   IncrementNodeCount();
367   node->set_base_id(ReserveIdRange(CompareOperation::num_ids()));
368   Visit(node->left());
369   Visit(node->right());
370 }
371 
372 
VisitSpread(Spread * node)373 void AstNumberingVisitor::VisitSpread(Spread* node) { UNREACHABLE(); }
374 
375 
VisitEmptyParentheses(EmptyParentheses * node)376 void AstNumberingVisitor::VisitEmptyParentheses(EmptyParentheses* node) {
377   UNREACHABLE();
378 }
379 
380 
VisitForInStatement(ForInStatement * node)381 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) {
382   IncrementNodeCount();
383   DisableSelfOptimization();
384   node->set_base_id(ReserveIdRange(ForInStatement::num_ids()));
385   Visit(node->enumerable());  // Not part of loop.
386   node->set_first_yield_id(yield_count_);
387   Visit(node->each());
388   Visit(node->body());
389   node->set_yield_count(yield_count_ - node->first_yield_id());
390   ReserveFeedbackSlots(node);
391 }
392 
393 
VisitForOfStatement(ForOfStatement * node)394 void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) {
395   IncrementNodeCount();
396   DisableCrankshaft(kForOfStatement);
397   node->set_base_id(ReserveIdRange(ForOfStatement::num_ids()));
398   Visit(node->assign_iterator());  // Not part of loop.
399   node->set_first_yield_id(yield_count_);
400   Visit(node->next_result());
401   Visit(node->result_done());
402   Visit(node->assign_each());
403   Visit(node->body());
404   node->set_yield_count(yield_count_ - node->first_yield_id());
405   ReserveFeedbackSlots(node);
406 }
407 
408 
VisitConditional(Conditional * node)409 void AstNumberingVisitor::VisitConditional(Conditional* node) {
410   IncrementNodeCount();
411   node->set_base_id(ReserveIdRange(Conditional::num_ids()));
412   Visit(node->condition());
413   Visit(node->then_expression());
414   Visit(node->else_expression());
415 }
416 
417 
VisitIfStatement(IfStatement * node)418 void AstNumberingVisitor::VisitIfStatement(IfStatement* node) {
419   IncrementNodeCount();
420   node->set_base_id(ReserveIdRange(IfStatement::num_ids()));
421   Visit(node->condition());
422   Visit(node->then_statement());
423   if (node->HasElseStatement()) {
424     Visit(node->else_statement());
425   }
426 }
427 
428 
VisitSwitchStatement(SwitchStatement * node)429 void AstNumberingVisitor::VisitSwitchStatement(SwitchStatement* node) {
430   IncrementNodeCount();
431   node->set_base_id(ReserveIdRange(SwitchStatement::num_ids()));
432   Visit(node->tag());
433   ZoneList<CaseClause*>* cases = node->cases();
434   for (int i = 0; i < cases->length(); i++) {
435     VisitCaseClause(cases->at(i));
436   }
437 }
438 
439 
VisitCaseClause(CaseClause * node)440 void AstNumberingVisitor::VisitCaseClause(CaseClause* node) {
441   IncrementNodeCount();
442   node->set_base_id(ReserveIdRange(CaseClause::num_ids()));
443   if (!node->is_default()) Visit(node->label());
444   VisitStatements(node->statements());
445 }
446 
447 
VisitForStatement(ForStatement * node)448 void AstNumberingVisitor::VisitForStatement(ForStatement* node) {
449   IncrementNodeCount();
450   DisableSelfOptimization();
451   node->set_base_id(ReserveIdRange(ForStatement::num_ids()));
452   if (node->init() != NULL) Visit(node->init());  // Not part of loop.
453   node->set_first_yield_id(yield_count_);
454   if (node->cond() != NULL) Visit(node->cond());
455   if (node->next() != NULL) Visit(node->next());
456   Visit(node->body());
457   node->set_yield_count(yield_count_ - node->first_yield_id());
458 }
459 
460 
VisitClassLiteral(ClassLiteral * node)461 void AstNumberingVisitor::VisitClassLiteral(ClassLiteral* node) {
462   IncrementNodeCount();
463   DisableCrankshaft(kClassLiteral);
464   node->set_base_id(ReserveIdRange(node->num_ids()));
465   if (node->extends()) Visit(node->extends());
466   if (node->constructor()) Visit(node->constructor());
467   if (node->class_variable_proxy()) {
468     VisitVariableProxy(node->class_variable_proxy());
469   }
470   for (int i = 0; i < node->properties()->length(); i++) {
471     VisitObjectLiteralProperty(node->properties()->at(i));
472   }
473   ReserveFeedbackSlots(node);
474 }
475 
476 
VisitObjectLiteral(ObjectLiteral * node)477 void AstNumberingVisitor::VisitObjectLiteral(ObjectLiteral* node) {
478   IncrementNodeCount();
479   node->set_base_id(ReserveIdRange(node->num_ids()));
480   for (int i = 0; i < node->properties()->length(); i++) {
481     VisitObjectLiteralProperty(node->properties()->at(i));
482   }
483   node->BuildConstantProperties(isolate_);
484   // Mark all computed expressions that are bound to a key that
485   // is shadowed by a later occurrence of the same key. For the
486   // marked expressions, no store code will be is emitted.
487   node->CalculateEmitStore(zone_);
488   ReserveFeedbackSlots(node);
489 }
490 
491 
VisitObjectLiteralProperty(ObjectLiteralProperty * node)492 void AstNumberingVisitor::VisitObjectLiteralProperty(
493     ObjectLiteralProperty* node) {
494   if (node->is_computed_name()) DisableCrankshaft(kComputedPropertyName);
495   Visit(node->key());
496   Visit(node->value());
497 }
498 
499 
VisitArrayLiteral(ArrayLiteral * node)500 void AstNumberingVisitor::VisitArrayLiteral(ArrayLiteral* node) {
501   IncrementNodeCount();
502   node->set_base_id(ReserveIdRange(node->num_ids()));
503   for (int i = 0; i < node->values()->length(); i++) {
504     Visit(node->values()->at(i));
505   }
506   node->BuildConstantElements(isolate_);
507   ReserveFeedbackSlots(node);
508 }
509 
510 
VisitCall(Call * node)511 void AstNumberingVisitor::VisitCall(Call* node) {
512   IncrementNodeCount();
513   ReserveFeedbackSlots(node);
514   node->set_base_id(ReserveIdRange(Call::num_ids()));
515   Visit(node->expression());
516   VisitArguments(node->arguments());
517 }
518 
519 
VisitCallNew(CallNew * node)520 void AstNumberingVisitor::VisitCallNew(CallNew* node) {
521   IncrementNodeCount();
522   ReserveFeedbackSlots(node);
523   node->set_base_id(ReserveIdRange(CallNew::num_ids()));
524   Visit(node->expression());
525   VisitArguments(node->arguments());
526 }
527 
528 
VisitStatements(ZoneList<Statement * > * statements)529 void AstNumberingVisitor::VisitStatements(ZoneList<Statement*>* statements) {
530   if (statements == NULL) return;
531   for (int i = 0; i < statements->length(); i++) {
532     Visit(statements->at(i));
533   }
534 }
535 
536 
VisitDeclarations(ZoneList<Declaration * > * declarations)537 void AstNumberingVisitor::VisitDeclarations(
538     ZoneList<Declaration*>* declarations) {
539   for (int i = 0; i < declarations->length(); i++) {
540     Visit(declarations->at(i));
541   }
542 }
543 
544 
VisitArguments(ZoneList<Expression * > * arguments)545 void AstNumberingVisitor::VisitArguments(ZoneList<Expression*>* arguments) {
546   for (int i = 0; i < arguments->length(); i++) {
547     Visit(arguments->at(i));
548   }
549 }
550 
551 
VisitFunctionLiteral(FunctionLiteral * node)552 void AstNumberingVisitor::VisitFunctionLiteral(FunctionLiteral* node) {
553   IncrementNodeCount();
554   node->set_base_id(ReserveIdRange(FunctionLiteral::num_ids()));
555   // We don't recurse into the declarations or body of the function literal:
556   // you have to separately Renumber() each FunctionLiteral that you compile.
557 }
558 
559 
VisitRewritableExpression(RewritableExpression * node)560 void AstNumberingVisitor::VisitRewritableExpression(
561     RewritableExpression* node) {
562   IncrementNodeCount();
563   node->set_base_id(ReserveIdRange(RewritableExpression::num_ids()));
564   Visit(node->expression());
565 }
566 
567 
Renumber(FunctionLiteral * node)568 bool AstNumberingVisitor::Renumber(FunctionLiteral* node) {
569   Scope* scope = node->scope();
570   if (scope->new_target_var()) DisableCrankshaft(kSuperReference);
571   if (scope->calls_eval()) DisableOptimization(kFunctionCallsEval);
572   if (scope->arguments() != NULL && !scope->arguments()->IsStackAllocated()) {
573     DisableCrankshaft(kContextAllocatedArguments);
574   }
575 
576   int rest_index;
577   if (scope->rest_parameter(&rest_index)) {
578     DisableCrankshaft(kRestParameter);
579   }
580 
581   if (IsGeneratorFunction(node->kind()) || IsAsyncFunction(node->kind())) {
582     // TODO(neis): We may want to allow Turbofan optimization here if
583     // --turbo-from-bytecode is set and we know that Ignition is used.
584     // Unfortunately we can't express that here.
585     DisableOptimization(kGenerator);
586   }
587 
588   VisitDeclarations(scope->declarations());
589   VisitStatements(node->body());
590 
591   node->set_ast_properties(&properties_);
592   node->set_dont_optimize_reason(dont_optimize_reason());
593   node->set_yield_count(yield_count_);
594   return !HasStackOverflow();
595 }
596 
597 
Renumber(Isolate * isolate,Zone * zone,FunctionLiteral * function)598 bool AstNumbering::Renumber(Isolate* isolate, Zone* zone,
599                             FunctionLiteral* function) {
600   AstNumberingVisitor visitor(isolate, zone);
601   return visitor.Renumber(function);
602 }
603 }  // namespace internal
604 }  // namespace v8
605