50#define DECLARE_VISIT(type) void Visit##type(type* node);
67#define PROCESS_NODE(node) do { \
68 if (!(this->impl()->VisitNode(node))) return; \
71#define PROCESS_EXPRESSION(node) do { \
73 if (!(this->impl()->VisitExpression(node))) return; \
76#define RECURSE(call) \
78 DCHECK(!HasStackOverflow()); \
80 if (HasStackOverflow()) return; \
83#define RECURSE_EXPRESSION(call) \
85 DCHECK(!HasStackOverflow()); \
89 if (HasStackOverflow()) return; \
92template <
class Sub
class>
95 : root_(root), depth_(0) {
96 InitializeAstVisitor(isolate);
99template <
class Sub
class>
102 : root_(root), depth_(0) {
103 InitializeAstVisitor(stack_limit);
106template <
class Sub
class>
114template <
class Sub
class>
117 for (
int i = 0;
i < stmts->
length(); ++
i) {
123template <
class Sub
class>
129template <
class Sub
class>
130void AstTraversalVisitor<Subclass>::VisitFunctionDeclaration(
131 FunctionDeclaration* decl) {
136template <
class Sub
class>
137void AstTraversalVisitor<Subclass>::VisitBlock(Block* stmt) {
139 if (stmt->scope() !=
nullptr) {
142 RECURSE(VisitStatements(stmt->statements()));
145template <
class Sub
class>
146void AstTraversalVisitor<Subclass>::VisitExpressionStatement(
147 ExpressionStatement* stmt) {
149 RECURSE(Visit(stmt->expression()));
152template <
class Sub
class>
153void AstTraversalVisitor<Subclass>::VisitEmptyStatement(EmptyStatement* stmt) {}
155template <
class Sub
class>
156void AstTraversalVisitor<Subclass>::VisitSloppyBlockFunctionStatement(
157 SloppyBlockFunctionStatement* stmt) {
159 RECURSE(Visit(stmt->statement()));
162template <
class Sub
class>
163void AstTraversalVisitor<Subclass>::VisitIfStatement(IfStatement* stmt) {
165 RECURSE(Visit(stmt->condition()));
166 RECURSE(Visit(stmt->then_statement()));
167 RECURSE(Visit(stmt->else_statement()));
170template <
class Sub
class>
171void AstTraversalVisitor<Subclass>::VisitContinueStatement(
172 ContinueStatement* stmt) {
176template <
class Sub
class>
177void AstTraversalVisitor<Subclass>::VisitBreakStatement(BreakStatement* stmt) {
181template <
class Sub
class>
182void AstTraversalVisitor<Subclass>::VisitReturnStatement(
183 ReturnStatement* stmt) {
185 RECURSE(Visit(stmt->expression()));
188template <
class Sub
class>
189void AstTraversalVisitor<Subclass>::VisitWithStatement(WithStatement* stmt) {
191 RECURSE(Visit(stmt->expression()));
192 RECURSE(Visit(stmt->statement()));
195template <
class Sub
class>
196void AstTraversalVisitor<Subclass>::VisitSwitchStatement(
197 SwitchStatement* stmt) {
202 for (
int i = 0;
i < clauses->
length(); ++
i) {
203 CaseClause* clause = clauses->at(
i);
204 if (!clause->is_default()) {
205 Expression*
label = clause->label();
209 RECURSE(VisitStatements(stmts));
213template <
class Sub
class>
214void AstTraversalVisitor<Subclass>::VisitDoWhileStatement(
215 DoWhileStatement* stmt) {
221template <
class Sub
class>
222void AstTraversalVisitor<Subclass>::VisitWhileStatement(WhileStatement* stmt) {
228template <
class Sub
class>
229void AstTraversalVisitor<Subclass>::VisitForStatement(ForStatement* stmt) {
231 if (stmt->init() !=
nullptr) {
234 if (stmt->cond() !=
nullptr) {
237 if (stmt->next() !=
nullptr) {
243template <
class Sub
class>
244void AstTraversalVisitor<Subclass>::VisitForInStatement(ForInStatement* stmt) {
247 RECURSE(Visit(stmt->subject()));
251template <
class Sub
class>
252void AstTraversalVisitor<Subclass>::VisitForOfStatement(ForOfStatement* stmt) {
255 RECURSE(Visit(stmt->subject()));
259template <
class Sub
class>
260void AstTraversalVisitor<Subclass>::VisitTryCatchStatement(
261 TryCatchStatement* stmt) {
263 RECURSE(Visit(stmt->try_block()));
264 RECURSE(Visit(stmt->catch_block()));
267template <
class Sub
class>
268void AstTraversalVisitor<Subclass>::VisitTryFinallyStatement(
269 TryFinallyStatement* stmt) {
271 RECURSE(Visit(stmt->try_block()));
272 RECURSE(Visit(stmt->finally_block()));
275template <
class Sub
class>
276void AstTraversalVisitor<Subclass>::VisitDebuggerStatement(
277 DebuggerStatement* stmt) {
281template <
class Sub
class>
282void AstTraversalVisitor<Subclass>::VisitFunctionLiteral(
283 FunctionLiteral* expr) {
285 DeclarationScope* scope = expr->scope();
288 if (expr->scope()->was_lazily_parsed())
return;
292template <
class Sub
class>
293void AstTraversalVisitor<Subclass>::VisitNativeFunctionLiteral(
294 NativeFunctionLiteral* expr) {
298template <
class Sub
class>
299void AstTraversalVisitor<Subclass>::VisitConditionalChain(
300 ConditionalChain* expr) {
302 for (
size_t i = 0;
i < expr->conditional_chain_length(); ++
i) {
306 RECURSE(Visit(expr->else_expression()));
309template <
class Sub
class>
310void AstTraversalVisitor<Subclass>::VisitConditional(Conditional* expr) {
317template <
class Sub
class>
318void AstTraversalVisitor<Subclass>::VisitVariableProxy(VariableProxy* expr) {
322template <
class Sub
class>
323void AstTraversalVisitor<Subclass>::VisitLiteral(Literal* expr) {
327template <
class Sub
class>
328void AstTraversalVisitor<Subclass>::VisitRegExpLiteral(RegExpLiteral* expr) {
332template <
class Sub
class>
333void AstTraversalVisitor<Subclass>::VisitObjectLiteral(ObjectLiteral* expr) {
336 for (
int i = 0;
i < props->
length(); ++
i) {
337 ObjectLiteralProperty* prop = props->at(
i);
343template <
class Sub
class>
344void AstTraversalVisitor<Subclass>::VisitArrayLiteral(ArrayLiteral* expr) {
347 for (
int i = 0;
i < values->
length(); ++
i) {
348 Expression* value = values->at(
i);
353template <
class Sub
class>
354void AstTraversalVisitor<Subclass>::VisitAssignment(Assignment* expr) {
360template <
class Sub
class>
361void AstTraversalVisitor<Subclass>::VisitCompoundAssignment(
362 CompoundAssignment* expr) {
363 VisitAssignment(expr);
366template <
class Sub
class>
367void AstTraversalVisitor<Subclass>::VisitYield(Yield* expr) {
372template <
class Sub
class>
373void AstTraversalVisitor<Subclass>::VisitYieldStar(YieldStar* expr) {
378template <
class Sub
class>
379void AstTraversalVisitor<Subclass>::VisitAwait(Await* expr) {
384template <
class Sub
class>
385void AstTraversalVisitor<Subclass>::VisitThrow(Throw* expr) {
390template <
class Sub
class>
391void AstTraversalVisitor<Subclass>::VisitOptionalChain(OptionalChain* expr) {
396template <
class Sub
class>
397void AstTraversalVisitor<Subclass>::VisitProperty(Property* expr) {
403template <
class Sub
class>
404void AstTraversalVisitor<Subclass>::VisitCall(Call* expr) {
409 Expression* arg =
args->at(
i);
414template <
class Sub
class>
415void AstTraversalVisitor<Subclass>::VisitCallNew(CallNew* expr) {
420 Expression* arg =
args->at(
i);
425template <
class Sub
class>
426void AstTraversalVisitor<Subclass>::VisitCallRuntime(CallRuntime* expr) {
430 Expression* arg =
args->at(
i);
435template <
class Sub
class>
436void AstTraversalVisitor<Subclass>::VisitUnaryOperation(UnaryOperation* expr) {
441template <
class Sub
class>
442void AstTraversalVisitor<Subclass>::VisitCountOperation(CountOperation* expr) {
447template <
class Sub
class>
448void AstTraversalVisitor<Subclass>::VisitBinaryOperation(
449 BinaryOperation* expr) {
455template <
class Sub
class>
456void AstTraversalVisitor<Subclass>::VisitNaryOperation(NaryOperation* expr) {
459 for (
size_t i = 0;
i < expr->subsequent_length(); ++
i) {
464template <
class Sub
class>
465void AstTraversalVisitor<Subclass>::VisitCompareOperation(
466 CompareOperation* expr) {
472template <
class Sub
class>
473void AstTraversalVisitor<Subclass>::VisitThisExpression(ThisExpression* expr) {
477template <
class Sub
class>
478void AstTraversalVisitor<Subclass>::VisitClassLiteral(ClassLiteral* expr) {
480 if (expr->extends() !=
nullptr) {
484 if (expr->static_initializer() !=
nullptr) {
487 if (expr->instance_members_initializer_function() !=
nullptr) {
491 expr->private_members();
492 for (
int i = 0;
i < private_members->
length(); ++
i) {
493 ClassLiteralProperty* prop = private_members->at(
i);
497 for (
int i = 0;
i < props->
length(); ++
i) {
498 ClassLiteralProperty* prop = props->at(
i);
499 if (!prop->key()->IsLiteral()) {
506template <
class Sub
class>
507void AstTraversalVisitor<Subclass>::VisitInitializeClassMembersStatement(
508 InitializeClassMembersStatement* stmt) {
511 for (
int i = 0;
i < props->
length(); ++
i) {
512 ClassLiteralProperty* prop = props->at(
i);
513 if (!prop->key()->IsLiteral()) {
520template <
class Sub
class>
521void AstTraversalVisitor<Subclass>::VisitInitializeClassStaticElementsStatement(
522 InitializeClassStaticElementsStatement* stmt) {
525 for (
int i = 0;
i < elements->
length(); ++
i) {
527 switch (element->kind()) {
530 if (!prop->key()->IsLiteral()) {
537 RECURSE(Visit(element->static_block()));
543template <
class Sub
class>
544void AstTraversalVisitor<Subclass>::VisitAutoAccessorGetterBody(
545 AutoAccessorGetterBody* stmt) {
549template <
class Sub
class>
550void AstTraversalVisitor<Subclass>::VisitAutoAccessorSetterBody(
551 AutoAccessorSetterBody* stmt) {
555template <
class Sub
class>
556void AstTraversalVisitor<Subclass>::VisitSpread(Spread* expr) {
561template <
class Sub
class>
562void AstTraversalVisitor<Subclass>::VisitEmptyParentheses(
563 EmptyParentheses* expr) {
567template <
class Sub
class>
568void AstTraversalVisitor<Subclass>::VisitGetTemplateObject(
569 GetTemplateObject* expr) {
573template <
class Sub
class>
574void AstTraversalVisitor<Subclass>::VisitTemplateLiteral(
575 TemplateLiteral* expr) {
577 for (Expression* sub : *expr->substitutions()) {
582template <
class Sub
class>
583void AstTraversalVisitor<Subclass>::VisitImportCallExpression(
584 ImportCallExpression* expr) {
587 if (expr->import_options()) {
592template <
class Sub
class>
593void AstTraversalVisitor<Subclass>::VisitSuperPropertyReference(
594 SuperPropertyReference* expr) {
598template <
class Sub
class>
599void AstTraversalVisitor<Subclass>::VisitSuperCallReference(
600 SuperCallReference* expr) {
606template <
class Sub
class>
607void AstTraversalVisitor<Subclass>::VisitSuperCallForwardArgs(
608 SuperCallForwardArgs* expr) {
614#undef PROCESS_EXPRESSION
615#undef RECURSE_EXPRESSION