| Index: src/ast.h
|
| ===================================================================
|
| --- src/ast.h (revision 5322)
|
| +++ src/ast.h (working copy)
|
| @@ -92,6 +92,7 @@
|
| V(CountOperation) \
|
| V(BinaryOperation) \
|
| V(CompareOperation) \
|
| + V(CompareToNull) \
|
| V(ThisFunction)
|
|
|
| #define AST_NODE_LIST(V) \
|
| @@ -118,12 +119,6 @@
|
|
|
| class AstNode: public ZoneObject {
|
| public:
|
| - static const int kNoNumber = -1;
|
| -
|
| - AstNode() : num_(kNoNumber) {}
|
| -
|
| - explicit AstNode(AstNode* other);
|
| -
|
| virtual ~AstNode() { }
|
| virtual void Accept(AstVisitor* v) = 0;
|
|
|
| @@ -151,20 +146,6 @@
|
| virtual ObjectLiteral* AsObjectLiteral() { return NULL; }
|
| virtual ArrayLiteral* AsArrayLiteral() { return NULL; }
|
| virtual CompareOperation* AsCompareOperation() { return NULL; }
|
| -
|
| - // True if the AST node is critical (its execution is needed or externally
|
| - // visible in some way).
|
| - virtual bool IsCritical() {
|
| - UNREACHABLE();
|
| - return true;
|
| - }
|
| -
|
| - int num() { return num_; }
|
| - void set_num(int n) { num_ = n; }
|
| -
|
| - private:
|
| - // Support for ast node numbering.
|
| - int num_;
|
| };
|
|
|
|
|
| @@ -172,8 +153,6 @@
|
| public:
|
| Statement() : statement_pos_(RelocInfo::kNoPosition) {}
|
|
|
| - explicit Statement(Statement* other);
|
| -
|
| virtual Statement* AsStatement() { return this; }
|
| virtual ReturnStatement* AsReturnStatement() { return NULL; }
|
|
|
| @@ -206,32 +185,16 @@
|
|
|
| Expression() : bitfields_(0) {}
|
|
|
| - explicit Expression(Expression* other);
|
| -
|
| virtual Expression* AsExpression() { return this; }
|
|
|
| + virtual bool IsTrivial() { return false; }
|
| virtual bool IsValidLeftHandSide() { return false; }
|
|
|
| - virtual Variable* AssignedVariable() { return NULL; }
|
| -
|
| // 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() { return false; }
|
|
|
| - // True if the expression does not have (evaluated) subexpressions.
|
| - // Function literals are leaves because their subexpressions are not
|
| - // evaluated.
|
| - virtual bool IsLeaf() { return false; }
|
| -
|
| - // True if the expression has no side effects and is safe to
|
| - // evaluate out of order.
|
| - virtual bool IsTrivial() { return false; }
|
| -
|
| - // True if the expression always has one of the non-Object JS types
|
| - // (Undefined, Null, Boolean, String, or Number).
|
| - virtual bool IsPrimitive() = 0;
|
| -
|
| // Mark the expression as being compiled as an expression
|
| // statement. This is used to transform postfix increments to
|
| // (faster) prefix increments.
|
| @@ -253,7 +216,8 @@
|
| // top operation is a bit operation with a mask, or a shift.
|
| bool GuaranteedSmiResult();
|
|
|
| - // AST analysis results
|
| + // AST analysis results.
|
| + void CopyAnalysisResultsFrom(Expression* other);
|
|
|
| // True if the expression rooted at this node can be compiled by the
|
| // side-effect free compiler.
|
| @@ -314,11 +278,6 @@
|
| virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
|
| static ValidLeftHandSideSentinel* instance() { return &instance_; }
|
|
|
| - virtual bool IsPrimitive() {
|
| - UNREACHABLE();
|
| - return false;
|
| - }
|
| -
|
| private:
|
| static ValidLeftHandSideSentinel instance_;
|
| };
|
| @@ -347,8 +306,6 @@
|
| protected:
|
| inline BreakableStatement(ZoneStringList* labels, Type type);
|
|
|
| - explicit BreakableStatement(BreakableStatement* other);
|
| -
|
| private:
|
| ZoneStringList* labels_;
|
| Type type_;
|
| @@ -360,10 +317,6 @@
|
| public:
|
| inline Block(ZoneStringList* labels, int capacity, bool is_initializer_block);
|
|
|
| - // Construct a clone initialized from the original block and
|
| - // a deep copy of all statements of the original block.
|
| - Block(Block* other, ZoneList<Statement*>* statements);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| virtual Block* AsBlock() { return this; }
|
| @@ -427,10 +380,6 @@
|
| protected:
|
| explicit inline IterationStatement(ZoneStringList* labels);
|
|
|
| - // Construct a clone initialized from original and
|
| - // a deep copy of the original body.
|
| - IterationStatement(IterationStatement* other, Statement* body);
|
| -
|
| void Initialize(Statement* body) {
|
| body_ = body;
|
| }
|
| @@ -480,13 +429,14 @@
|
| bool may_have_function_literal() const {
|
| return may_have_function_literal_;
|
| }
|
| + void set_may_have_function_literal(bool value) {
|
| + may_have_function_literal_ = value;
|
| + }
|
|
|
| private:
|
| Expression* cond_;
|
| // True if there is a function literal subexpression in the condition.
|
| bool may_have_function_literal_;
|
| -
|
| - friend class AstOptimizer;
|
| };
|
|
|
|
|
| @@ -494,14 +444,6 @@
|
| public:
|
| explicit inline ForStatement(ZoneStringList* labels);
|
|
|
| - // Construct a for-statement initialized from another for-statement
|
| - // and deep copies of all parts of the original statement.
|
| - ForStatement(ForStatement* other,
|
| - Statement* init,
|
| - Expression* cond,
|
| - Statement* next,
|
| - Statement* body);
|
| -
|
| virtual ForStatement* AsForStatement() { return this; }
|
|
|
| void Initialize(Statement* init,
|
| @@ -522,17 +464,18 @@
|
| void set_cond(Expression* expr) { cond_ = expr; }
|
| Statement* next() const { return next_; }
|
| void set_next(Statement* stmt) { next_ = stmt; }
|
| +
|
| bool may_have_function_literal() const {
|
| return may_have_function_literal_;
|
| }
|
| + void set_may_have_function_literal(bool value) {
|
| + may_have_function_literal_ = value;
|
| + }
|
|
|
| bool is_fast_smi_loop() { return loop_variable_ != NULL; }
|
| Variable* loop_variable() { return loop_variable_; }
|
| void set_loop_variable(Variable* var) { loop_variable_ = var; }
|
|
|
| - bool peel_this_loop() { return peel_this_loop_; }
|
| - void set_peel_this_loop(bool b) { peel_this_loop_ = b; }
|
| -
|
| private:
|
| Statement* init_;
|
| Expression* cond_;
|
| @@ -540,9 +483,6 @@
|
| // True if there is a function literal subexpression in the condition.
|
| bool may_have_function_literal_;
|
| Variable* loop_variable_;
|
| - bool peel_this_loop_;
|
| -
|
| - friend class AstOptimizer;
|
| };
|
|
|
|
|
| @@ -572,10 +512,6 @@
|
| explicit ExpressionStatement(Expression* expression)
|
| : expression_(expression) { }
|
|
|
| - // Construct an expression statement initialized from another
|
| - // expression statement and a deep copy of the original expression.
|
| - ExpressionStatement(ExpressionStatement* other, Expression* expression);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| @@ -715,13 +651,6 @@
|
| then_statement_(then_statement),
|
| else_statement_(else_statement) { }
|
|
|
| - // Construct an if-statement initialized from another if-statement
|
| - // and deep copies of all parts of the original.
|
| - IfStatement(IfStatement* other,
|
| - Expression* condition,
|
| - Statement* then_statement,
|
| - Statement* else_statement);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
|
| @@ -828,8 +757,6 @@
|
| public:
|
| EmptyStatement() {}
|
|
|
| - explicit EmptyStatement(EmptyStatement* other);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| @@ -842,6 +769,7 @@
|
| explicit Literal(Handle<Object> handle) : handle_(handle) { }
|
|
|
| virtual void Accept(AstVisitor* v);
|
| + virtual bool IsTrivial() { return true; }
|
|
|
| // Type testing & conversion.
|
| virtual Literal* AsLiteral() { return this; }
|
| @@ -859,11 +787,6 @@
|
| return false;
|
| }
|
|
|
| - virtual bool IsLeaf() { return true; }
|
| - virtual bool IsTrivial() { return true; }
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| // Identity testers.
|
| bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); }
|
| bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); }
|
| @@ -910,7 +833,6 @@
|
| // to the code generator.
|
| class Property: public ZoneObject {
|
| public:
|
| -
|
| enum Kind {
|
| CONSTANT, // Property with constant value (compile time).
|
| COMPUTED, // Property with computed value (execution time).
|
| @@ -948,10 +870,6 @@
|
| virtual ObjectLiteral* AsObjectLiteral() { return this; }
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsLeaf() { return properties()->is_empty(); }
|
| -
|
| - virtual bool IsPrimitive();
|
| -
|
| Handle<FixedArray> constant_properties() const {
|
| return constant_properties_;
|
| }
|
| @@ -978,10 +896,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsLeaf() { return true; }
|
| -
|
| - virtual bool IsPrimitive();
|
| -
|
| Handle<String> pattern() const { return pattern_; }
|
| Handle<String> flags() const { return flags_; }
|
|
|
| @@ -1006,10 +920,6 @@
|
| virtual void Accept(AstVisitor* v);
|
| virtual ArrayLiteral* AsArrayLiteral() { return this; }
|
|
|
| - virtual bool IsLeaf() { return values()->is_empty(); }
|
| -
|
| - virtual bool IsPrimitive();
|
| -
|
| Handle<FixedArray> constant_elements() const { return constant_elements_; }
|
| ZoneList<Expression*>* values() const { return values_; }
|
|
|
| @@ -1030,8 +940,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| Literal* key() const { return key_; }
|
| VariableProxy* value() const { return value_; }
|
|
|
| @@ -1049,8 +957,11 @@
|
| virtual Property* AsProperty() {
|
| return var_ == NULL ? NULL : var_->AsProperty();
|
| }
|
| - virtual VariableProxy* AsVariableProxy() { return this; }
|
|
|
| + virtual VariableProxy* AsVariableProxy() {
|
| + return this;
|
| + }
|
| +
|
| Variable* AsVariable() {
|
| return this == NULL || var_ == NULL ? NULL : var_->AsVariable();
|
| }
|
| @@ -1059,20 +970,12 @@
|
| return var_ == NULL ? true : var_->IsValidLeftHandSide();
|
| }
|
|
|
| - virtual bool IsLeaf() {
|
| - ASSERT(var_ != NULL); // Variable must be resolved.
|
| - return var()->is_global() || var()->rewrite()->IsLeaf();
|
| + virtual bool IsTrivial() {
|
| + // Reading from a mutable variable is a side effect, but the
|
| + // variable for 'this' is immutable.
|
| + return is_this_ || is_trivial_;
|
| }
|
|
|
| - // Reading from a mutable variable is a side effect, but 'this' is
|
| - // immutable.
|
| - virtual bool IsTrivial() { return is_trivial_; }
|
| -
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| - void SetIsPrimitive(bool value) { is_primitive_ = value; }
|
| -
|
| bool IsVariable(Handle<String> n) {
|
| return !is_this() && name().is_identical_to(n);
|
| }
|
| @@ -1086,11 +989,8 @@
|
| Variable* var() const { return var_; }
|
| bool is_this() const { return is_this_; }
|
| bool inside_with() const { return inside_with_; }
|
| - bool is_trivial() { return is_trivial_; }
|
| - void set_is_trivial(bool b) { is_trivial_ = b; }
|
|
|
| - BitVector* reaching_definitions() { return reaching_definitions_; }
|
| - void set_reaching_definitions(BitVector* rd) { reaching_definitions_ = rd; }
|
| + void MarkAsTrivial() { is_trivial_ = true; }
|
|
|
| // Bind this proxy to the variable var.
|
| void BindTo(Variable* var);
|
| @@ -1101,8 +1001,6 @@
|
| bool is_this_;
|
| bool inside_with_;
|
| bool is_trivial_;
|
| - BitVector* reaching_definitions_;
|
| - bool is_primitive_;
|
|
|
| VariableProxy(Handle<String> name, bool is_this, bool inside_with);
|
| explicit VariableProxy(bool is_this);
|
| @@ -1119,11 +1017,6 @@
|
| return &identifier_proxy_;
|
| }
|
|
|
| - virtual bool IsPrimitive() {
|
| - UNREACHABLE();
|
| - return false;
|
| - }
|
| -
|
| private:
|
| explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { }
|
| static VariableProxySentinel this_proxy_;
|
| @@ -1165,13 +1058,6 @@
|
| // Type testing & conversion
|
| virtual Slot* AsSlot() { return this; }
|
|
|
| - virtual bool IsLeaf() { return true; }
|
| -
|
| - virtual bool IsPrimitive() {
|
| - UNREACHABLE();
|
| - return false;
|
| - }
|
| -
|
| bool IsStackAllocated() { return type_ == PARAMETER || type_ == LOCAL; }
|
|
|
| // Accessors
|
| @@ -1197,8 +1083,6 @@
|
| Property(Expression* obj, Expression* key, int pos, Type type = NORMAL)
|
| : obj_(obj), key_(key), pos_(pos), type_(type) { }
|
|
|
| - Property(Property* other, Expression* obj, Expression* key);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| @@ -1206,9 +1090,6 @@
|
|
|
| virtual bool IsValidLeftHandSide() { return true; }
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| Expression* obj() const { return obj_; }
|
| Expression* key() const { return key_; }
|
| int position() const { return pos_; }
|
| @@ -1234,16 +1115,11 @@
|
| Call(Expression* expression, ZoneList<Expression*>* arguments, int pos)
|
| : expression_(expression), arguments_(arguments), pos_(pos) { }
|
|
|
| - Call(Call* other, Expression* expression, ZoneList<Expression*>* arguments);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing and conversion.
|
| virtual Call* AsCall() { return this; }
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| Expression* expression() const { return expression_; }
|
| ZoneList<Expression*>* arguments() const { return arguments_; }
|
| int position() { return pos_; }
|
| @@ -1266,8 +1142,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| Expression* expression() const { return expression_; }
|
| ZoneList<Expression*>* arguments() const { return arguments_; }
|
| int position() { return pos_; }
|
| @@ -1292,8 +1166,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| Handle<String> name() const { return name_; }
|
| Runtime::Function* function() const { return function_; }
|
| ZoneList<Expression*>* arguments() const { return arguments_; }
|
| @@ -1313,16 +1185,11 @@
|
| ASSERT(Token::IsUnaryOp(op));
|
| }
|
|
|
| - UnaryOperation(UnaryOperation* other, Expression* expression);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual UnaryOperation* AsUnaryOperation() { return this; }
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| Token::Value op() const { return op_; }
|
| Expression* expression() const { return expression_; }
|
|
|
| @@ -1339,22 +1206,11 @@
|
| ASSERT(Token::IsBinaryOp(op));
|
| }
|
|
|
| - // Construct a binary operation with a given operator and left and right
|
| - // subexpressions. The rest of the expression state is copied from
|
| - // another expression.
|
| - BinaryOperation(Expression* other,
|
| - Token::Value op,
|
| - Expression* left,
|
| - Expression* right);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual BinaryOperation* AsBinaryOperation() { return this; }
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| // True iff the result can be safely overwritten (to avoid allocation).
|
| // False for operations that can return one of their operands.
|
| bool ResultOverwriteAllowed() {
|
| @@ -1399,19 +1255,10 @@
|
| ASSERT(Token::IsCountOp(op));
|
| }
|
|
|
| - CountOperation(CountOperation* other, Expression* expression);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| virtual CountOperation* AsCountOperation() { return this; }
|
|
|
| - virtual Variable* AssignedVariable() {
|
| - return expression()->AsVariableProxy()->AsVariable();
|
| - }
|
| -
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| bool is_prefix() const { return is_prefix_; }
|
| bool is_postfix() const { return !is_prefix_; }
|
| Token::Value op() const { return op_; }
|
| @@ -1436,15 +1283,8 @@
|
| ASSERT(Token::IsCompareOp(op));
|
| }
|
|
|
| - CompareOperation(CompareOperation* other,
|
| - Expression* left,
|
| - Expression* right);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| Token::Value op() const { return op_; }
|
| Expression* left() const { return left_; }
|
| Expression* right() const { return right_; }
|
| @@ -1459,6 +1299,23 @@
|
| };
|
|
|
|
|
| +class CompareToNull: public Expression {
|
| + public:
|
| + CompareToNull(bool is_strict, Expression* expression)
|
| + : is_strict_(is_strict), expression_(expression) { }
|
| +
|
| + virtual void Accept(AstVisitor* v);
|
| +
|
| + bool is_strict() const { return is_strict_; }
|
| + Token::Value op() const { return is_strict_ ? Token::EQ_STRICT : Token::EQ; }
|
| + Expression* expression() const { return expression_; }
|
| +
|
| + private:
|
| + bool is_strict_;
|
| + Expression* expression_;
|
| +};
|
| +
|
| +
|
| class Conditional: public Expression {
|
| public:
|
| Conditional(Expression* condition,
|
| @@ -1474,8 +1331,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| Expression* condition() const { return condition_; }
|
| Expression* then_expression() const { return then_expression_; }
|
| Expression* else_expression() const { return else_expression_; }
|
| @@ -1500,20 +1355,11 @@
|
| ASSERT(Token::IsAssignmentOp(op));
|
| }
|
|
|
| - Assignment(Assignment* other, Expression* target, Expression* value);
|
| -
|
| virtual void Accept(AstVisitor* v);
|
| virtual Assignment* AsAssignment() { return this; }
|
|
|
| - virtual bool IsPrimitive();
|
| - virtual bool IsCritical();
|
| -
|
| Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
|
|
|
| - virtual Variable* AssignedVariable() {
|
| - return target()->AsVariableProxy()->AsVariable();
|
| - }
|
| -
|
| Token::Value binary_op() const;
|
|
|
| Token::Value op() const { return op_; }
|
| @@ -1549,8 +1395,6 @@
|
|
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| Expression* exception() const { return exception_; }
|
| int position() const { return pos_; }
|
|
|
| @@ -1598,10 +1442,6 @@
|
| // Type testing & conversion
|
| virtual FunctionLiteral* AsFunctionLiteral() { return this; }
|
|
|
| - virtual bool IsLeaf() { return true; }
|
| -
|
| - virtual bool IsPrimitive();
|
| -
|
| Handle<String> name() const { return name_; }
|
| Scope* scope() const { return scope_; }
|
| ZoneList<Statement*>* body() const { return body_; }
|
| @@ -1669,12 +1509,8 @@
|
| return shared_function_info_;
|
| }
|
|
|
| - virtual bool IsLeaf() { return true; }
|
| -
|
| virtual void Accept(AstVisitor* v);
|
|
|
| - virtual bool IsPrimitive();
|
| -
|
| private:
|
| Handle<SharedFunctionInfo> shared_function_info_;
|
| };
|
| @@ -1683,8 +1519,6 @@
|
| class ThisFunction: public Expression {
|
| public:
|
| virtual void Accept(AstVisitor* v);
|
| - virtual bool IsLeaf() { return true; }
|
| - virtual bool IsPrimitive();
|
| };
|
|
|
|
|
| @@ -2072,29 +1906,6 @@
|
| bool stack_overflow_;
|
| };
|
|
|
| -
|
| -class CopyAstVisitor : public AstVisitor {
|
| - public:
|
| - Expression* DeepCopyExpr(Expression* expr);
|
| -
|
| - Statement* DeepCopyStmt(Statement* stmt);
|
| -
|
| - private:
|
| - ZoneList<Expression*>* DeepCopyExprList(ZoneList<Expression*>* expressions);
|
| -
|
| - ZoneList<Statement*>* DeepCopyStmtList(ZoneList<Statement*>* statements);
|
| -
|
| - // AST node visit functions.
|
| -#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
|
| - AST_NODE_LIST(DECLARE_VISIT)
|
| -#undef DECLARE_VISIT
|
| -
|
| - // Holds the result of copying an expression.
|
| - Expression* expr_;
|
| - // Holds the result of copying a statement.
|
| - Statement* stmt_;
|
| -};
|
| -
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_AST_H_
|
|
|