Chromium Code Reviews| 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; | 
| }; |