Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index a89fc24fa0364887c572ae129c4da263c79ed370..7bbf04d765c4d34f8000b935e3853b1d8e9eb09d 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -114,7 +114,6 @@ namespace internal { |
// Forward declarations |
class AstNodeFactory; |
-class AstVisitor; |
class Declaration; |
class Module; |
class BreakableStatement; |
@@ -135,8 +134,6 @@ typedef ZoneList<Handle<Object>> ZoneObjectList; |
#define DECLARE_NODE_TYPE(type) \ |
- void Accept(AstVisitor* v) override; \ |
- AstNode::NodeType node_type() const final { return AstNode::k##type; } \ |
friend class AstNodeFactory; |
@@ -196,19 +193,12 @@ DEFINE_OPERATORS_FOR_FLAGS(AstProperties::Flags) |
class AstNode: public ZoneObject { |
public: |
#define DECLARE_TYPE_ENUM(type) k##type, |
- enum NodeType { |
- AST_NODE_LIST(DECLARE_TYPE_ENUM) |
- kInvalid = -1 |
- }; |
+ enum NodeType : uint8_t { kModule = 0, AST_NODE_LIST(DECLARE_TYPE_ENUM) }; |
#undef DECLARE_TYPE_ENUM |
void* operator new(size_t size, Zone* zone) { return zone->New(size); } |
- explicit AstNode(int position): position_(position) {} |
- virtual ~AstNode() {} |
- |
- virtual void Accept(AstVisitor* v) = 0; |
- virtual NodeType node_type() const = 0; |
+ NodeType node_type() const { return node_type_; } |
int position() const { return position_; } |
#ifdef DEBUG |
@@ -227,6 +217,10 @@ class AstNode: public ZoneObject { |
IterationStatement* AsIterationStatement(); |
MaterializedLiteral* AsMaterializedLiteral(); |
+ protected: |
+ AstNode(int position, NodeType type) |
+ : position_(position), node_type_(type) {} |
+ |
private: |
// Hidden to prevent accidental usage. It would have to load the |
// current zone from the TLS. |
@@ -235,15 +229,18 @@ class AstNode: public ZoneObject { |
friend class CaseClause; // Generates AST IDs. |
int position_; |
+ NodeType node_type_; |
}; |
class Statement : public AstNode { |
public: |
- explicit Statement(Zone* zone, int position) : AstNode(position) {} |
- |
bool IsEmpty() { return AsEmptyStatement() != NULL; } |
bool IsJump() const; |
+ |
+ protected: |
+ Statement(Zone* zone, int position, NodeType type) |
+ : AstNode(position, type) {} |
}; |
@@ -360,8 +357,8 @@ class Expression : public AstNode { |
TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } |
protected: |
- Expression(Zone* zone, int pos) |
- : AstNode(pos), |
+ Expression(Zone* zone, int pos, NodeType type) |
+ : AstNode(pos, type), |
base_id_(BailoutId::None().ToInt()), |
bit_field_(0) {} |
static int parent_num_ids() { return 0; } |
@@ -411,8 +408,8 @@ class BreakableStatement : public Statement { |
protected: |
BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, |
- BreakableType breakable_type, int position) |
- : Statement(zone, position), |
+ BreakableType breakable_type, int position, NodeType type) |
+ : Statement(zone, position, type), |
labels_(labels), |
breakable_type_(breakable_type), |
base_id_(BailoutId::None().ToInt()) { |
@@ -456,7 +453,7 @@ class Block final : public BreakableStatement { |
protected: |
Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, |
bool ignore_completion_value, int pos) |
- : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos), |
+ : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), |
statements_(capacity, zone), |
ignore_completion_value_(ignore_completion_value), |
scope_(NULL) {} |
@@ -482,7 +479,7 @@ class DoExpression final : public Expression { |
protected: |
DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) |
- : Expression(zone, pos), block_(block), result_(result) { |
+ : Expression(zone, pos, kDoExpression), block_(block), result_(result) { |
DCHECK_NOT_NULL(block_); |
DCHECK_NOT_NULL(result_); |
} |
@@ -505,8 +502,8 @@ class Declaration : public AstNode { |
protected: |
Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, |
- int pos) |
- : AstNode(pos), mode_(mode), proxy_(proxy), scope_(scope) { |
+ int pos, NodeType type) |
+ : AstNode(pos, type), mode_(mode), proxy_(proxy), scope_(scope) { |
DCHECK(IsDeclaredVariableMode(mode)); |
} |
@@ -530,7 +527,7 @@ class VariableDeclaration final : public Declaration { |
protected: |
VariableDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
Scope* scope, int pos) |
- : Declaration(zone, proxy, mode, scope, pos) {} |
+ : Declaration(zone, proxy, mode, scope, pos, kVariableDeclaration) {} |
}; |
@@ -543,13 +540,9 @@ class FunctionDeclaration final : public Declaration { |
InitializationFlag initialization() const { return kCreatedInitialized; } |
protected: |
- FunctionDeclaration(Zone* zone, |
- VariableProxy* proxy, |
- VariableMode mode, |
- FunctionLiteral* fun, |
- Scope* scope, |
- int pos) |
- : Declaration(zone, proxy, mode, scope, pos), |
+ FunctionDeclaration(Zone* zone, VariableProxy* proxy, VariableMode mode, |
+ FunctionLiteral* fun, Scope* scope, int pos) |
+ : Declaration(zone, proxy, mode, scope, pos, kFunctionDeclaration), |
fun_(fun) { |
DCHECK(mode == VAR || mode == LET || mode == CONST); |
DCHECK(fun != NULL); |
@@ -576,7 +569,7 @@ class ImportDeclaration final : public Declaration { |
ImportDeclaration(Zone* zone, VariableProxy* proxy, |
const AstRawString* import_name, |
const AstRawString* module_specifier, Scope* scope, int pos) |
- : Declaration(zone, proxy, CONST, scope, pos), |
+ : Declaration(zone, proxy, CONST, scope, pos, kImportDeclaration), |
import_name_(import_name), |
module_specifier_(module_specifier) {} |
@@ -585,17 +578,18 @@ class ImportDeclaration final : public Declaration { |
const AstRawString* module_specifier_; |
}; |
- |
-class Module : public AstNode { |
+class Module final : public AstNode { |
public: |
ModuleDescriptor* descriptor() const { return descriptor_; } |
Block* body() const { return body_; } |
protected: |
Module(Zone* zone, int pos) |
- : AstNode(pos), descriptor_(ModuleDescriptor::New(zone)), body_(NULL) {} |
+ : AstNode(pos, kModule), |
+ descriptor_(ModuleDescriptor::New(zone)), |
+ body_(NULL) {} |
Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL) |
- : AstNode(pos), descriptor_(descriptor), body_(body) {} |
+ : AstNode(pos, kModule), descriptor_(descriptor), body_(body) {} |
private: |
ModuleDescriptor* descriptor_; |
@@ -622,8 +616,9 @@ class IterationStatement : public BreakableStatement { |
Label* continue_target() { return &continue_target_; } |
protected: |
- IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), |
+ IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
+ NodeType type) |
+ : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, type), |
body_(NULL), |
yield_count_(0), |
first_yield_id_(0) {} |
@@ -659,7 +654,7 @@ class DoWhileStatement final : public IterationStatement { |
protected: |
DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : IterationStatement(zone, labels, pos), cond_(NULL) {} |
+ : IterationStatement(zone, labels, pos, kDoWhileStatement), cond_(NULL) {} |
static int parent_num_ids() { return IterationStatement::num_ids(); } |
private: |
@@ -688,7 +683,7 @@ class WhileStatement final : public IterationStatement { |
protected: |
WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : IterationStatement(zone, labels, pos), cond_(NULL) {} |
+ : IterationStatement(zone, labels, pos, kWhileStatement), cond_(NULL) {} |
static int parent_num_ids() { return IterationStatement::num_ids(); } |
private: |
@@ -727,7 +722,7 @@ class ForStatement final : public IterationStatement { |
protected: |
ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : IterationStatement(zone, labels, pos), |
+ : IterationStatement(zone, labels, pos, kForStatement), |
init_(NULL), |
cond_(NULL), |
next_(NULL) {} |
@@ -756,8 +751,9 @@ class ForEachStatement : public IterationStatement { |
} |
protected: |
- ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : IterationStatement(zone, labels, pos) {} |
+ ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
+ NodeType type) |
+ : IterationStatement(zone, labels, pos, type) {} |
}; |
@@ -806,7 +802,7 @@ class ForInStatement final : public ForEachStatement { |
protected: |
ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : ForEachStatement(zone, labels, pos), |
+ : ForEachStatement(zone, labels, pos, kForInStatement), |
each_(nullptr), |
subject_(nullptr), |
for_in_type_(SLOW_FOR_IN) {} |
@@ -875,7 +871,7 @@ class ForOfStatement final : public ForEachStatement { |
protected: |
ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : ForEachStatement(zone, labels, pos), |
+ : ForEachStatement(zone, labels, pos, kForOfStatement), |
iterator_(NULL), |
assign_iterator_(NULL), |
next_result_(NULL), |
@@ -904,7 +900,7 @@ class ExpressionStatement final : public Statement { |
protected: |
ExpressionStatement(Zone* zone, Expression* expression, int pos) |
- : Statement(zone, pos), expression_(expression) { } |
+ : Statement(zone, pos, kExpressionStatement), expression_(expression) {} |
private: |
Expression* expression_; |
@@ -916,7 +912,8 @@ class JumpStatement : public Statement { |
bool IsJump() const { return true; } |
protected: |
- explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} |
+ JumpStatement(Zone* zone, int pos, NodeType type) |
+ : Statement(zone, pos, type) {} |
}; |
@@ -927,8 +924,8 @@ class ContinueStatement final : public JumpStatement { |
IterationStatement* target() const { return target_; } |
protected: |
- explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) |
- : JumpStatement(zone, pos), target_(target) { } |
+ ContinueStatement(Zone* zone, IterationStatement* target, int pos) |
+ : JumpStatement(zone, pos, kContinueStatement), target_(target) {} |
private: |
IterationStatement* target_; |
@@ -942,8 +939,8 @@ class BreakStatement final : public JumpStatement { |
BreakableStatement* target() const { return target_; } |
protected: |
- explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) |
- : JumpStatement(zone, pos), target_(target) { } |
+ BreakStatement(Zone* zone, BreakableStatement* target, int pos) |
+ : JumpStatement(zone, pos, kBreakStatement), target_(target) {} |
private: |
BreakableStatement* target_; |
@@ -959,8 +956,8 @@ class ReturnStatement final : public JumpStatement { |
void set_expression(Expression* e) { expression_ = e; } |
protected: |
- explicit ReturnStatement(Zone* zone, Expression* expression, int pos) |
- : JumpStatement(zone, pos), expression_(expression) { } |
+ ReturnStatement(Zone* zone, Expression* expression, int pos) |
+ : JumpStatement(zone, pos, kReturnStatement), expression_(expression) {} |
private: |
Expression* expression_; |
@@ -985,7 +982,7 @@ class WithStatement final : public Statement { |
protected: |
WithStatement(Zone* zone, Scope* scope, Expression* expression, |
Statement* statement, int pos) |
- : Statement(zone, pos), |
+ : Statement(zone, pos, kWithStatement), |
scope_(scope), |
expression_(expression), |
statement_(statement), |
@@ -1058,7 +1055,8 @@ class SwitchStatement final : public BreakableStatement { |
protected: |
SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
- : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), |
+ : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, |
+ kSwitchStatement), |
tag_(NULL), |
cases_(NULL) {} |
@@ -1102,7 +1100,7 @@ class IfStatement final : public Statement { |
protected: |
IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
Statement* else_statement, int pos) |
- : Statement(zone, pos), |
+ : Statement(zone, pos, kIfStatement), |
condition_(condition), |
then_statement_(then_statement), |
else_statement_(else_statement), |
@@ -1143,8 +1141,10 @@ class TryStatement : public Statement { |
void set_catch_predicted(bool b) { catch_predicted_ = b; } |
protected: |
- TryStatement(Zone* zone, Block* try_block, int pos) |
- : Statement(zone, pos), try_block_(try_block), catch_predicted_(false) {} |
+ TryStatement(Zone* zone, Block* try_block, int pos, NodeType type) |
+ : Statement(zone, pos, type), |
+ try_block_(try_block), |
+ catch_predicted_(false) {} |
private: |
Block* try_block_; |
@@ -1177,7 +1177,7 @@ class TryCatchStatement final : public TryStatement { |
TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, |
Variable* variable, Block* catch_block, |
bool clear_pending_message, int pos) |
- : TryStatement(zone, try_block, pos), |
+ : TryStatement(zone, try_block, pos, kTryCatchStatement), |
scope_(scope), |
variable_(variable), |
catch_block_(catch_block), |
@@ -1201,7 +1201,8 @@ class TryFinallyStatement final : public TryStatement { |
protected: |
TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, |
int pos) |
- : TryStatement(zone, try_block, pos), finally_block_(finally_block) {} |
+ : TryStatement(zone, try_block, pos, kTryFinallyStatement), |
+ finally_block_(finally_block) {} |
private: |
Block* finally_block_; |
@@ -1217,8 +1218,9 @@ class DebuggerStatement final : public Statement { |
BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } |
protected: |
- explicit DebuggerStatement(Zone* zone, int pos) |
- : Statement(zone, pos), base_id_(BailoutId::None().ToInt()) {} |
+ DebuggerStatement(Zone* zone, int pos) |
+ : Statement(zone, pos, kDebuggerStatement), |
+ base_id_(BailoutId::None().ToInt()) {} |
static int parent_num_ids() { return 0; } |
int base_id() const { |
@@ -1238,7 +1240,7 @@ class EmptyStatement final : public Statement { |
DECLARE_NODE_TYPE(EmptyStatement) |
protected: |
- explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} |
+ EmptyStatement(Zone* zone, int pos) : Statement(zone, pos, kEmptyStatement) {} |
}; |
@@ -1256,7 +1258,7 @@ class SloppyBlockFunctionStatement final : public Statement { |
private: |
SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) |
- : Statement(zone, kNoSourcePosition), |
+ : Statement(zone, kNoSourcePosition, kSloppyBlockFunctionStatement), |
statement_(statement), |
scope_(scope) {} |
@@ -1299,7 +1301,7 @@ class Literal final : public Expression { |
protected: |
Literal(Zone* zone, const AstValue* value, int position) |
- : Expression(zone, position), value_(value) {} |
+ : Expression(zone, position, kLiteral), value_(value) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
@@ -1323,8 +1325,8 @@ class MaterializedLiteral : public Expression { |
} |
protected: |
- MaterializedLiteral(Zone* zone, int literal_index, int pos) |
- : Expression(zone, pos), |
+ MaterializedLiteral(Zone* zone, int literal_index, int pos, NodeType type) |
+ : Expression(zone, pos, type), |
literal_index_(literal_index), |
is_simple_(false), |
depth_(0) {} |
@@ -1507,7 +1509,7 @@ class ObjectLiteral final : public MaterializedLiteral { |
protected: |
ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
int boilerplate_properties, int pos) |
- : MaterializedLiteral(zone, literal_index, pos), |
+ : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), |
properties_(properties), |
boilerplate_properties_(boilerplate_properties), |
fast_elements_(false), |
@@ -1560,7 +1562,7 @@ class RegExpLiteral final : public MaterializedLiteral { |
protected: |
RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, |
int literal_index, int pos) |
- : MaterializedLiteral(zone, literal_index, pos), |
+ : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), |
pattern_(pattern), |
flags_(flags) { |
set_depth(1); |
@@ -1634,7 +1636,7 @@ class ArrayLiteral final : public MaterializedLiteral { |
protected: |
ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
int first_spread_index, int literal_index, int pos) |
- : MaterializedLiteral(zone, literal_index, pos), |
+ : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), |
values_(values), |
first_spread_index_(first_spread_index) {} |
static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
@@ -1820,7 +1822,7 @@ class Property final : public Expression { |
protected: |
Property(Zone* zone, Expression* obj, Expression* key, int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kProperty), |
bit_field_(IsForCallField::encode(false) | |
IsStringAccessField::encode(false) | |
InlineCacheStateField::encode(UNINITIALIZED)), |
@@ -1940,7 +1942,7 @@ class Call final : public Expression { |
protected: |
Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kCall), |
expression_(expression), |
arguments_(arguments), |
bit_field_(IsUninitializedField::encode(false)) { |
@@ -2011,7 +2013,7 @@ class CallNew final : public Expression { |
protected: |
CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kCallNew), |
expression_(expression), |
arguments_(arguments), |
is_monomorphic_(false) {} |
@@ -2060,11 +2062,13 @@ class CallRuntime final : public Expression { |
protected: |
CallRuntime(Zone* zone, const Runtime::Function* function, |
ZoneList<Expression*>* arguments, int pos) |
- : Expression(zone, pos), function_(function), arguments_(arguments) {} |
+ : Expression(zone, pos, kCallRuntime), |
+ function_(function), |
+ arguments_(arguments) {} |
CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, |
int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kCallRuntime), |
function_(NULL), |
context_index_(context_index), |
arguments_(arguments) {} |
@@ -2098,7 +2102,9 @@ class UnaryOperation final : public Expression { |
protected: |
UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) |
- : Expression(zone, pos), op_(op), expression_(expression) { |
+ : Expression(zone, pos, kUnaryOperation), |
+ op_(op), |
+ expression_(expression) { |
DCHECK(Token::IsUnaryOp(op)); |
} |
static int parent_num_ids() { return Expression::num_ids(); } |
@@ -2157,7 +2163,7 @@ class BinaryOperation final : public Expression { |
protected: |
BinaryOperation(Zone* zone, Token::Value op, Expression* left, |
Expression* right, int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kBinaryOperation), |
op_(static_cast<byte>(op)), |
has_fixed_right_arg_(false), |
fixed_right_arg_value_(0), |
@@ -2228,7 +2234,7 @@ class CountOperation final : public Expression { |
protected: |
CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kCountOperation), |
bit_field_( |
IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
@@ -2281,7 +2287,7 @@ class CompareOperation final : public Expression { |
protected: |
CompareOperation(Zone* zone, Token::Value op, Expression* left, |
Expression* right, int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kCompareOperation), |
op_(op), |
left_(left), |
right_(right), |
@@ -2314,7 +2320,9 @@ class Spread final : public Expression { |
protected: |
Spread(Zone* zone, Expression* expression, int pos, int expr_pos) |
- : Expression(zone, pos), expression_(expression), expr_pos_(expr_pos) {} |
+ : Expression(zone, pos, kSpread), |
+ expression_(expression), |
+ expr_pos_(expr_pos) {} |
static int parent_num_ids() { return Expression::num_ids(); } |
private: |
@@ -2349,7 +2357,7 @@ class Conditional final : public Expression { |
protected: |
Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
Expression* else_expression, int position) |
- : Expression(zone, position), |
+ : Expression(zone, position, kConditional), |
condition_(condition), |
then_expression_(then_expression), |
else_expression_(else_expression) {} |
@@ -2476,7 +2484,7 @@ class RewritableExpression : public Expression { |
protected: |
RewritableExpression(Zone* zone, Expression* expression) |
- : Expression(zone, expression->position()), |
+ : Expression(zone, expression->position(), kRewritableExpression), |
is_rewritten_(false), |
expr_(expression) { |
DCHECK(!expression->IsRewritableExpression()); |
@@ -2512,7 +2520,7 @@ class Yield final : public Expression { |
protected: |
Yield(Zone* zone, Expression* generator_object, Expression* expression, |
int pos, OnException on_exception) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kYield), |
generator_object_(generator_object), |
expression_(expression), |
on_exception_(on_exception), |
@@ -2535,7 +2543,7 @@ class Throw final : public Expression { |
protected: |
Throw(Zone* zone, Expression* exception, int pos) |
- : Expression(zone, pos), exception_(exception) {} |
+ : Expression(zone, pos, kThrow), exception_(exception) {} |
private: |
Expression* exception_; |
@@ -2684,7 +2692,7 @@ class FunctionLiteral final : public Expression { |
ParameterFlag has_duplicate_parameters, |
EagerCompileHint eager_compile_hint, FunctionKind kind, |
int position, bool is_function) |
- : Expression(zone, position), |
+ : Expression(zone, position, kFunctionLiteral), |
raw_name_(name), |
scope_(scope), |
body_(body), |
@@ -2786,7 +2794,7 @@ class ClassLiteral final : public Expression { |
Expression* extends, FunctionLiteral* constructor, |
ZoneList<Property*>* properties, int start_position, |
int end_position) |
- : Expression(zone, start_position), |
+ : Expression(zone, start_position, kClassLiteral), |
scope_(scope), |
class_variable_proxy_(class_variable_proxy), |
extends_(extends), |
@@ -2820,7 +2828,9 @@ class NativeFunctionLiteral final : public Expression { |
protected: |
NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
v8::Extension* extension, int pos) |
- : Expression(zone, pos), name_(name), extension_(extension) {} |
+ : Expression(zone, pos, kNativeFunctionLiteral), |
+ name_(name), |
+ extension_(extension) {} |
private: |
const AstRawString* name_; |
@@ -2833,7 +2843,7 @@ class ThisFunction final : public Expression { |
DECLARE_NODE_TYPE(ThisFunction) |
protected: |
- ThisFunction(Zone* zone, int pos) : Expression(zone, pos) {} |
+ ThisFunction(Zone* zone, int pos) : Expression(zone, pos, kThisFunction) {} |
}; |
@@ -2849,7 +2859,9 @@ class SuperPropertyReference final : public Expression { |
protected: |
SuperPropertyReference(Zone* zone, VariableProxy* this_var, |
Expression* home_object, int pos) |
- : Expression(zone, pos), this_var_(this_var), home_object_(home_object) { |
+ : Expression(zone, pos, kSuperPropertyReference), |
+ this_var_(this_var), |
+ home_object_(home_object) { |
DCHECK(this_var->is_this()); |
DCHECK(home_object->IsProperty()); |
} |
@@ -2875,7 +2887,7 @@ class SuperCallReference final : public Expression { |
SuperCallReference(Zone* zone, VariableProxy* this_var, |
VariableProxy* new_target_var, |
VariableProxy* this_function_var, int pos) |
- : Expression(zone, pos), |
+ : Expression(zone, pos, kSuperCallReference), |
this_var_(this_var), |
new_target_var_(new_target_var), |
this_function_var_(this_function_var) { |
@@ -2898,7 +2910,8 @@ class EmptyParentheses final : public Expression { |
DECLARE_NODE_TYPE(EmptyParentheses) |
private: |
- EmptyParentheses(Zone* zone, int pos) : Expression(zone, pos) {} |
+ EmptyParentheses(Zone* zone, int pos) |
+ : Expression(zone, pos, kEmptyParentheses) {} |
}; |
@@ -2907,32 +2920,59 @@ class EmptyParentheses final : public Expression { |
// ---------------------------------------------------------------------------- |
// Basic visitor |
-// - leaf node visitors are abstract. |
+// Sub-class should parametrize AstVisitor with itself, e.g.: |
+// class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } |
+template <class Subclass> |
class AstVisitor BASE_EMBEDDED { |
public: |
- AstVisitor() {} |
- virtual ~AstVisitor() {} |
+ void Visit(AstNode* node) { This()->Visit(node); } |
- // Stack overflow check and dynamic dispatch. |
- virtual void Visit(AstNode* node) = 0; |
+ void VisitDeclarations(ZoneList<Declaration*>* declarations) { |
+ for (int i = 0; i < declarations->length(); i++) { |
+ Visit(declarations->at(i)); |
+ } |
+ } |
- // Iteration left-to-right. |
- virtual void VisitDeclarations(ZoneList<Declaration*>* declarations); |
- virtual void VisitStatements(ZoneList<Statement*>* statements); |
- virtual void VisitExpressions(ZoneList<Expression*>* expressions); |
+ void VisitStatements(ZoneList<Statement*>* statements) { |
+ for (int i = 0; i < statements->length(); i++) { |
+ Statement* stmt = statements->at(i); |
+ Visit(stmt); |
+ if (stmt->IsJump()) break; |
+ } |
+ } |
+ |
+ void VisitExpressions(ZoneList<Expression*>* expressions) { |
+ for (int i = 0; i < expressions->length(); i++) { |
+ // The variable statement visiting code may pass NULL expressions |
+ // to this code. Maybe this should be handled by introducing an |
+ // undefined expression or literal? Revisit this code if this |
+ // changes |
+ Expression* expression = expressions->at(i); |
+ if (expression != NULL) Visit(expression); |
+ } |
+ } |
- // Individual AST nodes. |
-#define DEF_VISIT(type) \ |
- virtual void Visit##type(type* node) = 0; |
- AST_NODE_LIST(DEF_VISIT) |
-#undef DEF_VISIT |
+ private: |
+ Subclass* This() { return static_cast<Subclass*>(this); } |
}; |
+#define GENERATE_VISIT_CASE(NodeType) \ |
+ case AstNode::k##NodeType: \ |
+ return Visit##NodeType(static_cast<NodeType*>(node)); |
+ |
+#define GENERATE_AST_VISITOR_SWITCH() \ |
+ switch (node->node_type()) { \ |
+ AST_NODE_LIST(GENERATE_VISIT_CASE) \ |
+ case AstNode::kModule: \ |
+ UNREACHABLE(); \ |
+ } |
+ |
#define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ |
public: \ |
- void Visit(AstNode* node) final { \ |
- if (!CheckStackOverflow()) node->Accept(this); \ |
+ void Visit(AstNode* node) { \ |
+ if (CheckStackOverflow()) return; \ |
+ GENERATE_AST_VISITOR_SWITCH() \ |
} \ |
\ |
void SetStackOverflow() { stack_overflow_ = true; } \ |
@@ -2962,6 +3002,12 @@ class AstVisitor BASE_EMBEDDED { |
uintptr_t stack_limit_; \ |
bool stack_overflow_ |
+#define DEFINE_AST_VISITOR_MEMBERS_WITHOUT_STACKOVERFLOW() \ |
+ public: \ |
+ void Visit(AstNode* node) { GENERATE_AST_VISITOR_SWITCH() } \ |
+ \ |
+ private: |
+ |
#define DEFINE_AST_REWRITER_SUBCLASS_MEMBERS() \ |
public: \ |
AstNode* Rewrite(AstNode* node) { \ |
@@ -2990,7 +3036,6 @@ class AstVisitor BASE_EMBEDDED { |
\ |
protected: \ |
AstNode* replacement_ |
- |
// Generic macro for rewriting things; `GET` is the expression to be |
// rewritten; `SET` is a command that should do the rewriting, i.e. |
// something sensible with the variable called `replacement`. |
@@ -3030,18 +3075,20 @@ class AstVisitor BASE_EMBEDDED { |
// Traversing visitor |
// - fully traverses the entire AST. |
-class AstTraversalVisitor : public AstVisitor { |
+// This AstVistor is not final, and provides the AstVisitor methods as virtual |
+// methods so they can be specialized by subclasses. |
+class AstTraversalVisitor : public AstVisitor<AstTraversalVisitor> { |
public: |
explicit AstTraversalVisitor(Isolate* isolate); |
explicit AstTraversalVisitor(uintptr_t stack_limit); |
virtual ~AstTraversalVisitor() {} |
// Iteration left-to-right. |
- void VisitDeclarations(ZoneList<Declaration*>* declarations) override; |
- void VisitStatements(ZoneList<Statement*>* statements) override; |
+ void VisitDeclarations(ZoneList<Declaration*>* declarations); |
+ void VisitStatements(ZoneList<Statement*>* statements); |
// Individual nodes |
-#define DECLARE_VISIT(type) void Visit##type(type* node) override; |
+#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
AST_NODE_LIST(DECLARE_VISIT) |
#undef DECLARE_VISIT |