Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 9b90d816d93ab3a54c9c571f81c70d1722621ee6..78e7153d302aeecc07b02ad8415eb624146a18eb 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -1,4 +1,4 @@ |
-// Copyright 2011 the V8 project authors. All rights reserved. |
+// Copyright 2012 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -120,6 +120,83 @@ typedef ZoneList<Handle<Object> > ZoneObjectList; |
virtual AstNode::Type node_type() const { return AstNode::k##type; } \ |
+class AstNodeType { |
+ public: |
+ enum FlagIndex { |
+ kIfStatement = 0, |
+ kContinueStatement, |
+ kBreakStatement, |
+ kReturnStatement, |
+ kWithStatement, |
+ kSwitchStatement, |
+ kDoWhileStatement, |
+ kWhileStatement, |
+ kForStatement, |
+ kForInStatement, |
+ kTryCatchStatement, |
+ kTryFinallyStatement, |
+ kDebuggerStatement, |
+ kFunctionLiteral, |
+ kSharedFunctionInfoLiteral, |
+ kConditional, |
+ kRegExpLiteral, |
+ kObjectLiteral, |
+ kArrayLiteral, |
+ kThrow, |
+ kProperty, |
+ kCall, |
+ kCallNew, |
+ kCallRuntime, |
+ kThisFunction |
+ }; |
+ |
+ typedef int Flag; |
Sven Panne
2012/01/17 13:46:58
Drive-by comment: One could use EnumSet<FlagIndex>
|
+ |
+ static const Flag kIfStatementMask = (1 << kIfStatement); |
+ static const Flag kContinueStatementMask = (1 << kContinueStatement); |
+ static const Flag kBreakStatementMask = (1 << kBreakStatement); |
+ static const Flag kReturnStatementMask = (1 << kReturnStatement); |
+ static const Flag kWithStatementMask = (1 << kWithStatement); |
+ static const Flag kSwitchStatementMask = (1 << kSwitchStatement); |
+ static const Flag kDoWhileStatementMask = (1 << kDoWhileStatement); |
+ static const Flag kWhileStatementMask = (1 << kWhileStatement); |
+ static const Flag kForStatementMask = (1 << kForStatement); |
+ static const Flag kForInStatementMask = (1 << kForInStatement); |
+ static const Flag kTryCatchStatementMask = (1 << kTryCatchStatement); |
+ static const Flag kTryFinallyStatementMask = (1 << kTryFinallyStatement); |
+ static const Flag kDebuggerStatementMask = (1 << kDebuggerStatement); |
+ static const Flag kFunctionLiteralMask = (1 << kFunctionLiteral); |
+ static const Flag kSharedFunctionInfoLiteralMask = |
+ (1 << kSharedFunctionInfoLiteral); |
+ static const Flag kConditionalMask = (1 << kConditional); |
+ static const Flag kRegExpLiteralMask = (1 << kRegExpLiteral); |
+ static const Flag kObjectLiteralMask = (1 << kObjectLiteral); |
+ static const Flag kArrayLiteralMask = (1 << kArrayLiteral); |
+ static const Flag kThrowMask = (1 << kThrow); |
+ static const Flag kPropertyMask = (1 << kProperty); |
+ static const Flag kCallMask = (1 << kCall); |
+ static const Flag kCallNewMask = (1 << kCallNew); |
+ static const Flag kCallRuntimeMask = (1 << kCallRuntime); |
+ static const Flag kThisFunctionMask = (1 << kThisFunction); |
+ |
+ static const Flag kContainsBackEdgesMask = |
+ kDoWhileStatementMask | |
+ kWhileStatementMask | |
+ kForStatementMask | |
+ kForInStatementMask; |
+ |
+ static const Flag kContainsCallsMask = |
+ kCallMask | kCallNewMask | kCallRuntimeMask; |
+ |
+ static const Flag kPreventsOptimizationMask = |
+ kWithStatementMask | |
+ kForInStatementMask | |
+ kTryCatchStatementMask | |
+ kTryFinallyStatementMask | |
+ kDebuggerStatementMask | |
+ kSharedFunctionInfoLiteral; |
+}; |
+ |
class AstNode: public ZoneObject { |
public: |
#define DECLARE_TYPE_ENUM(type) k##type, |
@@ -167,6 +244,10 @@ class AstNode: public ZoneObject { |
// True if the node is simple enough for us to inline calls containing it. |
virtual bool IsInlineable() const = 0; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const { |
+ *node_count += 1; |
+ } |
+ |
static int Count() { return Isolate::Current()->ast_node_count(); } |
static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } |
@@ -369,6 +450,7 @@ class Block: public BreakableStatement { |
DECLARE_NODE_TYPE(Block) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
void AddStatement(Statement* statement) { statements_.Add(statement); } |
@@ -409,6 +491,7 @@ class Declaration: public AstNode { |
VariableMode mode() const { return mode_; } |
FunctionLiteral* fun() const { return fun_; } // may be NULL |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Scope* scope() const { return scope_; } |
private: |
@@ -484,6 +567,7 @@ class DoWhileStatement: public IterationStatement { |
int BackEdgeId() const { return back_edge_id_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Expression* cond_; |
@@ -517,6 +601,7 @@ class WhileStatement: public IterationStatement { |
may_have_function_literal_ = value; |
} |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
// Bailout support. |
virtual int ContinueId() const { return EntryId(); } |
@@ -576,6 +661,7 @@ class ForStatement: public IterationStatement { |
Variable* loop_variable() { return loop_variable_; } |
void set_loop_variable(Variable* var) { loop_variable_ = var; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Statement* init_; |
@@ -609,6 +695,7 @@ class ForInStatement: public IterationStatement { |
Expression* each() const { return each_; } |
Expression* enumerable() const { return enumerable_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
// Bailout support. |
int AssignmentId() const { return assignment_id_; } |
@@ -630,6 +717,7 @@ class ExpressionStatement: public Statement { |
DECLARE_NODE_TYPE(ExpressionStatement) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
void set_expression(Expression* e) { expression_ = e; } |
Expression* expression() const { return expression_; } |
@@ -648,6 +736,7 @@ class ContinueStatement: public Statement { |
IterationStatement* target() const { return target_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
IterationStatement* target_; |
@@ -663,6 +752,7 @@ class BreakStatement: public Statement { |
BreakableStatement* target() const { return target_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
BreakableStatement* target_; |
@@ -678,6 +768,7 @@ class ReturnStatement: public Statement { |
Expression* expression() const { return expression_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Expression* expression_; |
@@ -695,6 +786,7 @@ class WithStatement: public Statement { |
Statement* statement() const { return statement_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Expression* expression_; |
@@ -767,6 +859,7 @@ class SwitchStatement: public BreakableStatement { |
Expression* tag() const { return tag_; } |
ZoneList<CaseClause*>* cases() const { return cases_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Expression* tag_; |
@@ -796,6 +889,7 @@ class IfStatement: public Statement { |
DECLARE_NODE_TYPE(IfStatement) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
bool HasThenStatement() const { return !then_statement()->IsEmpty(); } |
bool HasElseStatement() const { return !else_statement()->IsEmpty(); } |
@@ -885,7 +979,7 @@ class TryCatchStatement: public TryStatement { |
Scope* scope() { return scope_; } |
Variable* variable() { return variable_; } |
Block* catch_block() const { return catch_block_; } |
- virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Scope* scope_; |
@@ -903,7 +997,7 @@ class TryFinallyStatement: public TryStatement { |
DECLARE_NODE_TYPE(TryFinallyStatement) |
Block* finally_block() const { return finally_block_; } |
- virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Block* finally_block_; |
@@ -914,6 +1008,7 @@ class DebuggerStatement: public Statement { |
public: |
DECLARE_NODE_TYPE(DebuggerStatement) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
}; |
@@ -922,6 +1017,7 @@ class EmptyStatement: public Statement { |
DECLARE_NODE_TYPE(EmptyStatement) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
}; |
@@ -1077,6 +1173,8 @@ class ObjectLiteral: public MaterializedLiteral { |
kHasFunction = 1 << 1 |
}; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
+ |
private: |
Handle<FixedArray> constant_properties_; |
ZoneList<Property*>* properties_; |
@@ -1101,6 +1199,8 @@ class RegExpLiteral: public MaterializedLiteral { |
Handle<String> pattern() const { return pattern_; } |
Handle<String> flags() const { return flags_; } |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
+ |
private: |
Handle<String> pattern_; |
Handle<String> flags_; |
@@ -1129,6 +1229,8 @@ class ArrayLiteral: public MaterializedLiteral { |
// Return an AST id for an element that is used in simulate instructions. |
int GetIdForElement(int i) { return first_element_id_ + i; } |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
+ |
private: |
Handle<FixedArray> constant_elements_; |
ZoneList<Expression*>* values_; |
@@ -1206,6 +1308,7 @@ class Property: public Expression { |
virtual bool IsValidLeftHandSide() { return true; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Expression* obj() const { return obj_; } |
Expression* key() const { return key_; } |
@@ -1253,6 +1356,7 @@ class Call: public Expression { |
DECLARE_NODE_TYPE(Call) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Expression* expression() const { return expression_; } |
ZoneList<Expression*>* arguments() const { return arguments_; } |
@@ -1308,6 +1412,7 @@ class CallNew: public Expression { |
DECLARE_NODE_TYPE(CallNew) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Expression* expression() const { return expression_; } |
ZoneList<Expression*>* arguments() const { return arguments_; } |
@@ -1338,6 +1443,7 @@ class CallRuntime: public Expression { |
DECLARE_NODE_TYPE(CallRuntime) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Handle<String> name() const { return name_; } |
const Runtime::Function* function() const { return function_; } |
@@ -1373,6 +1479,7 @@ class UnaryOperation: public Expression { |
DECLARE_NODE_TYPE(UnaryOperation) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
virtual bool ResultOverwriteAllowed(); |
@@ -1412,6 +1519,7 @@ class BinaryOperation: public Expression { |
DECLARE_NODE_TYPE(BinaryOperation) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
virtual bool ResultOverwriteAllowed(); |
@@ -1465,6 +1573,7 @@ class CountOperation: public Expression { |
virtual void MarkAsStatement() { is_prefix_ = true; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
virtual bool IsMonomorphic() { return is_monomorphic_; } |
@@ -1510,6 +1619,7 @@ class CompareOperation: public Expression { |
virtual int position() const { return pos_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
// Type feedback information. |
void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
@@ -1553,6 +1663,7 @@ class Conditional: public Expression { |
DECLARE_NODE_TYPE(Conditional) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Expression* condition() const { return condition_; } |
Expression* then_expression() const { return then_expression_; } |
@@ -1586,6 +1697,7 @@ class Assignment: public Expression { |
DECLARE_NODE_TYPE(Assignment) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
@@ -1645,6 +1757,7 @@ class Throw: public Expression { |
Expression* exception() const { return exception_; } |
virtual int position() const { return pos_; } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Expression* exception_; |
@@ -1732,11 +1845,15 @@ class FunctionLiteral: public Expression { |
bool pretenure() { return Pretenure::decode(bitfield_); } |
void set_pretenure() { bitfield_ |= Pretenure::encode(true); } |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
bool has_duplicate_parameters() { |
return HasDuplicateParameters::decode(bitfield_); |
} |
+ bool ShouldSelfOptimize(); |
+ int AstNodeCount(); |
+ |
private: |
Handle<String> name_; |
Scope* scope_; |
@@ -1772,6 +1889,7 @@ class SharedFunctionInfoLiteral: public Expression { |
return shared_function_info_; |
} |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
private: |
Handle<SharedFunctionInfo> shared_function_info_; |
@@ -1783,6 +1901,7 @@ class ThisFunction: public Expression { |
explicit ThisFunction(Isolate* isolate) : Expression(isolate) {} |
DECLARE_NODE_TYPE(ThisFunction) |
virtual bool IsInlineable() const; |
+ virtual void CollectInfo(AstNodeType::Flag* flags, int* node_count) const; |
}; |