Index: src/ast/ast.h |
diff --git a/src/ast/ast.h b/src/ast/ast.h |
index 100e7a760036ea21b305a6647ca541d42d9f977c..a89fc24fa0364887c572ae129c4da263c79ed370 100644 |
--- a/src/ast/ast.h |
+++ b/src/ast/ast.h |
@@ -42,8 +42,20 @@ namespace internal { |
V(FunctionDeclaration) \ |
V(ImportDeclaration) |
+#define ITERATION_NODE_LIST(V) \ |
+ V(DoWhileStatement) \ |
+ V(WhileStatement) \ |
+ V(ForStatement) \ |
+ V(ForInStatement) \ |
+ V(ForOfStatement) |
+ |
+#define BREAKABLE_NODE_LIST(V) \ |
+ V(Block) \ |
+ V(SwitchStatement) |
+ |
#define STATEMENT_NODE_LIST(V) \ |
- V(Block) \ |
+ ITERATION_NODE_LIST(V) \ |
+ BREAKABLE_NODE_LIST(V) \ |
V(ExpressionStatement) \ |
V(EmptyStatement) \ |
V(SloppyBlockFunctionStatement) \ |
@@ -52,35 +64,38 @@ namespace internal { |
V(BreakStatement) \ |
V(ReturnStatement) \ |
V(WithStatement) \ |
- V(SwitchStatement) \ |
- V(DoWhileStatement) \ |
- V(WhileStatement) \ |
- V(ForStatement) \ |
- V(ForInStatement) \ |
- V(ForOfStatement) \ |
V(TryCatchStatement) \ |
V(TryFinallyStatement) \ |
V(DebuggerStatement) |
+#define LITERAL_NODE_LIST(V) \ |
+ V(RegExpLiteral) \ |
+ V(ObjectLiteral) \ |
+ V(ArrayLiteral) |
+ |
+#define PROPERTY_NODE_LIST(V) \ |
+ V(Assignment) \ |
+ V(CountOperation) \ |
+ V(Property) |
+ |
+#define CALL_NODE_LIST(V) \ |
+ V(Call) \ |
+ V(CallNew) |
+ |
#define EXPRESSION_NODE_LIST(V) \ |
+ LITERAL_NODE_LIST(V) \ |
+ PROPERTY_NODE_LIST(V) \ |
+ CALL_NODE_LIST(V) \ |
V(FunctionLiteral) \ |
V(ClassLiteral) \ |
V(NativeFunctionLiteral) \ |
V(Conditional) \ |
V(VariableProxy) \ |
V(Literal) \ |
- V(RegExpLiteral) \ |
- V(ObjectLiteral) \ |
- V(ArrayLiteral) \ |
- V(Assignment) \ |
V(Yield) \ |
V(Throw) \ |
- V(Property) \ |
- V(Call) \ |
- V(CallNew) \ |
V(CallRuntime) \ |
V(UnaryOperation) \ |
- V(CountOperation) \ |
V(BinaryOperation) \ |
V(CompareOperation) \ |
V(Spread) \ |
@@ -208,9 +223,9 @@ class AstNode: public ZoneObject { |
AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
#undef DECLARE_NODE_FUNCTIONS |
- virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
- virtual IterationStatement* AsIterationStatement() { return NULL; } |
- virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
+ BreakableStatement* AsBreakableStatement(); |
+ IterationStatement* AsIterationStatement(); |
+ MaterializedLiteral* AsMaterializedLiteral(); |
private: |
// Hidden to prevent accidental usage. It would have to load the |
@@ -228,7 +243,7 @@ class Statement : public AstNode { |
explicit Statement(Zone* zone, int position) : AstNode(position) {} |
bool IsEmpty() { return AsEmptyStatement() != NULL; } |
- virtual bool IsJump() const { return false; } |
+ bool IsJump() const; |
}; |
@@ -294,23 +309,23 @@ class Expression : public AstNode { |
}; |
// Mark this expression as being in tail position. |
- virtual void MarkTail() {} |
+ void MarkTail(); |
// True iff the expression is a valid reference expression. |
- virtual bool IsValidReferenceExpression() const { return false; } |
+ bool IsValidReferenceExpression() const; |
// Helpers for ToBoolean conversion. |
- virtual bool ToBooleanIsTrue() const { return false; } |
- virtual bool ToBooleanIsFalse() const { return false; } |
+ bool ToBooleanIsTrue() const; |
+ bool ToBooleanIsFalse() const; |
// Symbols that cannot be parsed as array indices are considered property |
// names. We do not treat symbols that can be array indexes as property |
// names because [] for string objects is handled only by keyed ICs. |
- virtual bool IsPropertyName() const { return false; } |
+ bool IsPropertyName() const; |
// True iff the expression is a class or function expression without |
// a syntactic name. |
- virtual bool IsAnonymousFunctionDefinition() const { return false; } |
+ bool IsAnonymousFunctionDefinition() const; |
// True iff the expression is a literal represented as a smi. |
bool IsSmiLiteral() const; |
@@ -328,30 +343,17 @@ class Expression : public AstNode { |
// True iff the expression is a valid target for an assignment. |
bool IsValidReferenceExpressionOrThis() const; |
- // Type feedback information for assignments and properties. |
- virtual bool IsMonomorphic() { |
- UNREACHABLE(); |
- return false; |
- } |
- virtual SmallMapList* GetReceiverTypes() { |
- UNREACHABLE(); |
- return NULL; |
- } |
- virtual KeyedAccessStoreMode GetStoreMode() const { |
- UNREACHABLE(); |
- return STANDARD_STORE; |
- } |
- virtual IcCheckType GetKeyType() const { |
- UNREACHABLE(); |
- return ELEMENT; |
- } |
- |
// TODO(rossberg): this should move to its own AST node eventually. |
- virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
+ void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
uint16_t to_boolean_types() const { |
return ToBooleanTypesField::decode(bit_field_); |
} |
+ SmallMapList* GetReceiverTypes(); |
+ KeyedAccessStoreMode GetStoreMode() const; |
+ IcCheckType GetKeyType() const; |
+ bool IsMonomorphic() const; |
+ |
void set_base_id(int id) { base_id_ = id; } |
static int num_ids() { return parent_num_ids() + 2; } |
BailoutId id() const { return BailoutId(local_id(0)); } |
@@ -394,9 +396,6 @@ class BreakableStatement : public Statement { |
// if it is != NULL, guaranteed to contain at least one entry. |
ZoneList<const AstRawString*>* labels() const { return labels_; } |
- // Type testing & conversion. |
- BreakableStatement* AsBreakableStatement() final { return this; } |
- |
// Code generation |
Label* break_target() { return &break_target_; } |
@@ -446,7 +445,7 @@ class Block final : public BreakableStatement { |
static int num_ids() { return parent_num_ids() + 1; } |
BailoutId DeclsId() const { return BailoutId(local_id(0)); } |
- bool IsJump() const override { |
+ bool IsJump() const { |
return !statements_.is_empty() && statements_.last()->IsJump() |
&& labels() == NULL; // Good enough as an approximation... |
} |
@@ -502,7 +501,7 @@ class Declaration : public AstNode { |
VariableProxy* proxy() const { return proxy_; } |
VariableMode mode() const { return mode_; } |
Scope* scope() const { return scope_; } |
- virtual InitializationFlag initialization() const = 0; |
+ InitializationFlag initialization() const; |
protected: |
Declaration(Zone* zone, VariableProxy* proxy, VariableMode mode, Scope* scope, |
@@ -524,7 +523,7 @@ class VariableDeclaration final : public Declaration { |
public: |
DECLARE_NODE_TYPE(VariableDeclaration) |
- InitializationFlag initialization() const override { |
+ InitializationFlag initialization() const { |
return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
} |
@@ -541,9 +540,7 @@ class FunctionDeclaration final : public Declaration { |
FunctionLiteral* fun() const { return fun_; } |
void set_fun(FunctionLiteral* f) { fun_ = f; } |
- InitializationFlag initialization() const override { |
- return kCreatedInitialized; |
- } |
+ InitializationFlag initialization() const { return kCreatedInitialized; } |
protected: |
FunctionDeclaration(Zone* zone, |
@@ -573,9 +570,7 @@ class ImportDeclaration final : public Declaration { |
DCHECK(module_specifier_ == NULL); |
module_specifier_ = module_specifier; |
} |
- InitializationFlag initialization() const override { |
- return kNeedsInitialization; |
- } |
+ InitializationFlag initialization() const { return kNeedsInitialization; } |
protected: |
ImportDeclaration(Zone* zone, VariableProxy* proxy, |
@@ -610,9 +605,6 @@ class Module : public AstNode { |
class IterationStatement : public BreakableStatement { |
public: |
- // Type testing & conversion. |
- IterationStatement* AsIterationStatement() final { return this; } |
- |
Statement* body() const { return body_; } |
void set_body(Statement* s) { body_ = s; } |
@@ -625,8 +617,6 @@ class IterationStatement : public BreakableStatement { |
static int num_ids() { return parent_num_ids() + 1; } |
BailoutId OsrEntryId() const { return BailoutId(local_id(0)); } |
- virtual BailoutId ContinueId() const = 0; |
- virtual BailoutId StackCheckId() const = 0; |
// Code generation |
Label* continue_target() { return &continue_target_; } |
@@ -663,8 +653,8 @@ class DoWhileStatement final : public IterationStatement { |
void set_cond(Expression* e) { cond_ = e; } |
static int num_ids() { return parent_num_ids() + 2; } |
- BailoutId ContinueId() const override { return BailoutId(local_id(0)); } |
- BailoutId StackCheckId() const override { return BackEdgeId(); } |
+ BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
+ BailoutId StackCheckId() const { return BackEdgeId(); } |
BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } |
protected: |
@@ -692,8 +682,8 @@ class WhileStatement final : public IterationStatement { |
void set_cond(Expression* e) { cond_ = e; } |
static int num_ids() { return parent_num_ids() + 1; } |
- BailoutId ContinueId() const override { return EntryId(); } |
- BailoutId StackCheckId() const override { return BodyId(); } |
+ BailoutId ContinueId() const { return EntryId(); } |
+ BailoutId StackCheckId() const { return BodyId(); } |
BailoutId BodyId() const { return BailoutId(local_id(0)); } |
protected: |
@@ -731,8 +721,8 @@ class ForStatement final : public IterationStatement { |
void set_next(Statement* s) { next_ = s; } |
static int num_ids() { return parent_num_ids() + 2; } |
- BailoutId ContinueId() const override { return BailoutId(local_id(0)); } |
- BailoutId StackCheckId() const override { return BodyId(); } |
+ BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
+ BailoutId StackCheckId() const { return BodyId(); } |
BailoutId BodyId() const { return BailoutId(local_id(1)); } |
protected: |
@@ -811,8 +801,8 @@ class ForInStatement final : public ForEachStatement { |
BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
BailoutId FilterId() const { return BailoutId(local_id(4)); } |
BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
- BailoutId ContinueId() const override { return EntryId(); } |
- BailoutId StackCheckId() const override { return BodyId(); } |
+ BailoutId ContinueId() const { return EntryId(); } |
+ BailoutId StackCheckId() const { return BodyId(); } |
protected: |
ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
@@ -877,8 +867,8 @@ class ForOfStatement final : public ForEachStatement { |
void set_result_done(Expression* e) { result_done_ = e; } |
void set_assign_each(Expression* e) { assign_each_ = e; } |
- BailoutId ContinueId() const override { return EntryId(); } |
- BailoutId StackCheckId() const override { return BackEdgeId(); } |
+ BailoutId ContinueId() const { return EntryId(); } |
+ BailoutId StackCheckId() const { return BackEdgeId(); } |
static int num_ids() { return parent_num_ids() + 1; } |
BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } |
@@ -910,7 +900,7 @@ class ExpressionStatement final : public Statement { |
void set_expression(Expression* e) { expression_ = e; } |
Expression* expression() const { return expression_; } |
- bool IsJump() const override { return expression_->IsThrow(); } |
+ bool IsJump() const { return expression_->IsThrow(); } |
protected: |
ExpressionStatement(Zone* zone, Expression* expression, int pos) |
@@ -923,7 +913,7 @@ class ExpressionStatement final : public Statement { |
class JumpStatement : public Statement { |
public: |
- bool IsJump() const final { return true; } |
+ bool IsJump() const { return true; } |
protected: |
explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} |
@@ -1098,7 +1088,7 @@ class IfStatement final : public Statement { |
void set_then_statement(Statement* s) { then_statement_ = s; } |
void set_else_statement(Statement* s) { else_statement_ = s; } |
- bool IsJump() const override { |
+ bool IsJump() const { |
return HasThenStatement() && then_statement()->IsJump() |
&& HasElseStatement() && else_statement()->IsJump(); |
} |
@@ -1279,7 +1269,7 @@ class Literal final : public Expression { |
public: |
DECLARE_NODE_TYPE(Literal) |
- bool IsPropertyName() const override { return value_->IsPropertyName(); } |
+ bool IsPropertyName() const { return value_->IsPropertyName(); } |
Handle<String> AsPropertyName() { |
DCHECK(IsPropertyName()); |
@@ -1291,8 +1281,8 @@ class Literal final : public Expression { |
return value_->AsString(); |
} |
- bool ToBooleanIsTrue() const override { return value()->BooleanValue(); } |
- bool ToBooleanIsFalse() const override { return !value()->BooleanValue(); } |
+ bool ToBooleanIsTrue() const { return value()->BooleanValue(); } |
+ bool ToBooleanIsFalse() const { return !value()->BooleanValue(); } |
Handle<Object> value() const { return value_->value(); } |
const AstValue* raw_value() const { return value_; } |
@@ -1324,8 +1314,6 @@ class AstLiteralReindexer; |
// Base class for literals that needs space in the corresponding JSFunction. |
class MaterializedLiteral : public Expression { |
public: |
- MaterializedLiteral* AsMaterializedLiteral() final { return this; } |
- |
int literal_index() { return literal_index_; } |
int depth() const { |
@@ -1665,7 +1653,7 @@ class VariableProxy final : public Expression { |
public: |
DECLARE_NODE_TYPE(VariableProxy) |
- bool IsValidReferenceExpression() const override { |
+ bool IsValidReferenceExpression() const { |
return !is_this() && !is_new_target(); |
} |
@@ -1765,7 +1753,7 @@ class Property final : public Expression { |
public: |
DECLARE_NODE_TYPE(Property) |
- bool IsValidReferenceExpression() const override { return true; } |
+ bool IsValidReferenceExpression() const { return true; } |
Expression* obj() const { return obj_; } |
Expression* key() const { return key_; } |
@@ -1781,12 +1769,10 @@ class Property final : public Expression { |
} |
// Type feedback information. |
- bool IsMonomorphic() override { return receiver_types_.length() == 1; } |
- SmallMapList* GetReceiverTypes() override { return &receiver_types_; } |
- KeyedAccessStoreMode GetStoreMode() const override { return STANDARD_STORE; } |
- IcCheckType GetKeyType() const override { |
- return KeyTypeField::decode(bit_field_); |
- } |
+ bool IsMonomorphic() const { return receiver_types_.length() == 1; } |
+ SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
+ KeyedAccessStoreMode GetStoreMode() const { return STANDARD_STORE; } |
+ IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); } |
bool IsUninitialized() const { |
return !is_for_call() && HasNoTypeInformation(); |
} |
@@ -1874,14 +1860,14 @@ class Call final : public Expression { |
FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } |
- SmallMapList* GetReceiverTypes() override { |
+ SmallMapList* GetReceiverTypes() { |
if (expression()->IsProperty()) { |
return expression()->AsProperty()->GetReceiverTypes(); |
} |
- return NULL; |
+ return nullptr; |
} |
- bool IsMonomorphic() override { |
+ bool IsMonomorphic() const { |
if (expression()->IsProperty()) { |
return expression()->AsProperty()->IsMonomorphic(); |
} |
@@ -1927,9 +1913,7 @@ class Call final : public Expression { |
return IsTailField::decode(bit_field_) ? TailCallMode::kAllow |
: TailCallMode::kDisallow; |
} |
- void MarkTail() override { |
- bit_field_ = IsTailField::update(bit_field_, true); |
- } |
+ void MarkTail() { bit_field_ = IsTailField::update(bit_field_, true); } |
enum CallType { |
POSSIBLY_EVAL_CALL, |
@@ -2004,7 +1988,7 @@ class CallNew final : public Expression { |
return callnew_feedback_slot_; |
} |
- bool IsMonomorphic() override { return is_monomorphic_; } |
+ bool IsMonomorphic() const { return is_monomorphic_; } |
Handle<JSFunction> target() const { return target_; } |
Handle<AllocationSite> allocation_site() const { |
return allocation_site_; |
@@ -2110,7 +2094,7 @@ class UnaryOperation final : public Expression { |
BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } |
BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } |
- void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override; |
+ void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
protected: |
UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) |
@@ -2141,7 +2125,7 @@ class BinaryOperation final : public Expression { |
allocation_site_ = allocation_site; |
} |
- void MarkTail() override { |
+ void MarkTail() { |
switch (op()) { |
case Token::COMMA: |
case Token::AND: |
@@ -2168,7 +2152,7 @@ class BinaryOperation final : public Expression { |
if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
} |
- void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override; |
+ void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
protected: |
BinaryOperation(Zone* zone, Token::Value op, Expression* left, |
@@ -2212,12 +2196,10 @@ class CountOperation final : public Expression { |
Expression* expression() const { return expression_; } |
void set_expression(Expression* e) { expression_ = e; } |
- bool IsMonomorphic() override { return receiver_types_.length() == 1; } |
- SmallMapList* GetReceiverTypes() override { return &receiver_types_; } |
- IcCheckType GetKeyType() const override { |
- return KeyTypeField::decode(bit_field_); |
- } |
- KeyedAccessStoreMode GetStoreMode() const override { |
+ bool IsMonomorphic() const { return receiver_types_.length() == 1; } |
+ SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
+ IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); } |
+ KeyedAccessStoreMode GetStoreMode() const { |
return StoreModeField::decode(bit_field_); |
} |
Type* type() const { return type_; } |
@@ -2355,7 +2337,7 @@ class Conditional final : public Expression { |
void set_then_expression(Expression* e) { then_expression_ = e; } |
void set_else_expression(Expression* e) { else_expression_ = e; } |
- void MarkTail() override { |
+ void MarkTail() { |
then_expression_->MarkTail(); |
else_expression_->MarkTail(); |
} |
@@ -2407,18 +2389,16 @@ class Assignment final : public Expression { |
// Type feedback information. |
TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } |
- bool IsMonomorphic() override { return receiver_types_.length() == 1; } |
bool IsUninitialized() const { |
return IsUninitializedField::decode(bit_field_); |
} |
bool HasNoTypeInformation() { |
return IsUninitializedField::decode(bit_field_); |
} |
- SmallMapList* GetReceiverTypes() override { return &receiver_types_; } |
- IcCheckType GetKeyType() const override { |
- return KeyTypeField::decode(bit_field_); |
- } |
- KeyedAccessStoreMode GetStoreMode() const override { |
+ bool IsMonomorphic() const { return receiver_types_.length() == 1; } |
+ SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
+ IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); } |
+ KeyedAccessStoreMode GetStoreMode() const { |
return StoreModeField::decode(bit_field_); |
} |
void set_is_uninitialized(bool b) { |
@@ -2688,7 +2668,7 @@ class FunctionLiteral final : public Expression { |
dont_optimize_reason_ = reason; |
} |
- bool IsAnonymousFunctionDefinition() const final { |
+ bool IsAnonymousFunctionDefinition() const { |
return is_anonymous_expression(); |
} |
@@ -2797,7 +2777,7 @@ class ClassLiteral final : public Expression { |
FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } |
FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } |
- bool IsAnonymousFunctionDefinition() const final { |
+ bool IsAnonymousFunctionDefinition() const { |
return constructor()->raw_name()->length() == 0; |
} |