| Index: src/ast.h
|
| ===================================================================
|
| --- src/ast.h (revision 854)
|
| +++ src/ast.h (working copy)
|
| @@ -81,6 +81,7 @@
|
| V(Throw) \
|
| V(Property) \
|
| V(Call) \
|
| + V(CallEval) \
|
| V(CallNew) \
|
| V(CallRuntime) \
|
| V(UnaryOperation) \
|
| @@ -104,7 +105,7 @@
|
| public:
|
| Node(): statement_pos_(RelocInfo::kNoPosition) { }
|
| virtual ~Node() { }
|
| - virtual void Accept(Visitor* v) = 0;
|
| + virtual void Accept(AstVisitor* v) = 0;
|
|
|
| // Type testing & conversion.
|
| virtual Statement* AsStatement() { return NULL; }
|
| @@ -168,7 +169,7 @@
|
| class ValidLeftHandSideSentinel: public Expression {
|
| public:
|
| virtual bool IsValidLeftHandSide() { return true; }
|
| - virtual void Accept(Visitor* v) { UNREACHABLE(); }
|
| + virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
|
| static ValidLeftHandSideSentinel* instance() { return &instance_; }
|
| private:
|
| static ValidLeftHandSideSentinel instance_;
|
| @@ -221,7 +222,7 @@
|
| statements_(capacity),
|
| is_initializer_block_(is_initializer_block) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| void AddStatement(Statement* statement) { statements_.Add(statement); }
|
|
|
| @@ -245,7 +246,7 @@
|
| ASSERT(fun == NULL || mode == Variable::VAR);
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| VariableProxy* proxy() const { return proxy_; }
|
| Variable::Mode mode() const { return mode_; }
|
| @@ -302,7 +303,7 @@
|
| next_ = next;
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Type type() const { return type_; }
|
| Statement* init() const { return init_; }
|
| @@ -332,7 +333,7 @@
|
| enumerable_ = enumerable;
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Expression* each() const { return each_; }
|
| Expression* enumerable() const { return enumerable_; }
|
| @@ -348,7 +349,7 @@
|
| explicit ExpressionStatement(Expression* expression)
|
| : expression_(expression) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| virtual ExpressionStatement* AsExpressionStatement() { return this; }
|
| @@ -366,7 +367,7 @@
|
| explicit ContinueStatement(IterationStatement* target)
|
| : target_(target) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| IterationStatement* target() const { return target_; }
|
|
|
| @@ -380,7 +381,7 @@
|
| explicit BreakStatement(BreakableStatement* target)
|
| : target_(target) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| BreakableStatement* target() const { return target_; }
|
|
|
| @@ -394,7 +395,7 @@
|
| explicit ReturnStatement(Expression* expression)
|
| : expression_(expression) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| virtual ReturnStatement* AsReturnStatement() { return this; }
|
| @@ -411,7 +412,7 @@
|
| explicit WithEnterStatement(Expression* expression)
|
| : expression_(expression) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Expression* expression() const { return expression_; }
|
|
|
| @@ -424,7 +425,7 @@
|
| public:
|
| WithExitStatement() { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| };
|
|
|
|
|
| @@ -457,7 +458,7 @@
|
| cases_ = cases;
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Expression* tag() const { return tag_; }
|
| ZoneList<CaseClause*>* cases() const { return cases_; }
|
| @@ -482,7 +483,7 @@
|
| then_statement_(then_statement),
|
| else_statement_(else_statement) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
|
| bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
|
| @@ -510,7 +511,7 @@
|
| void AddLabel(Label* label);
|
|
|
| // Virtual behaviour. LabelCollectors are never part of the AST.
|
| - virtual void Accept(Visitor* v) { UNREACHABLE(); }
|
| + virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
|
| virtual LabelCollector* AsLabelCollector() { return this; }
|
|
|
| ZoneList<Label*>* labels() { return labels_; }
|
| @@ -547,7 +548,7 @@
|
| ASSERT(catch_var->AsVariableProxy() != NULL);
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Expression* catch_var() const { return catch_var_; }
|
| Block* catch_block() const { return catch_block_; }
|
| @@ -564,7 +565,7 @@
|
| : TryStatement(try_block),
|
| finally_block_(finally_block) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Block* finally_block() const { return finally_block_; }
|
|
|
| @@ -575,13 +576,13 @@
|
|
|
| class DebuggerStatement: public Statement {
|
| public:
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| };
|
|
|
|
|
| class EmptyStatement: public Statement {
|
| public:
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| virtual EmptyStatement* AsEmptyStatement() { return this; }
|
| @@ -592,7 +593,7 @@
|
| public:
|
| explicit Literal(Handle<Object> handle) : handle_(handle) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion.
|
| virtual Literal* AsLiteral() { return this; }
|
| @@ -665,7 +666,7 @@
|
| properties_(properties) {
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Handle<FixedArray> constant_properties() const {
|
| return constant_properties_;
|
| @@ -688,7 +689,7 @@
|
| pattern_(pattern),
|
| flags_(flags) {}
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Handle<String> pattern() const { return pattern_; }
|
| Handle<String> flags() const { return flags_; }
|
| @@ -707,7 +708,7 @@
|
| : literals_(literals), values_(values) {
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Handle<FixedArray> literals() const { return literals_; }
|
| ZoneList<Expression*>* values() const { return values_; }
|
| @@ -720,7 +721,7 @@
|
|
|
| class VariableProxy: public Expression {
|
| public:
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual Property* AsProperty() {
|
| @@ -816,7 +817,7 @@
|
| ASSERT(var != NULL);
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual Slot* AsSlot() { return this; }
|
| @@ -838,7 +839,7 @@
|
| Property(Expression* obj, Expression* key, int pos)
|
| : obj_(obj), key_(key), pos_(pos) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual Property* AsProperty() { return this; }
|
| @@ -867,21 +868,18 @@
|
| public:
|
| Call(Expression* expression,
|
| ZoneList<Expression*>* arguments,
|
| - bool is_eval,
|
| int pos)
|
| : expression_(expression),
|
| arguments_(arguments),
|
| - is_eval_(is_eval),
|
| pos_(pos) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing and conversion.
|
| virtual Call* AsCall() { return this; }
|
|
|
| Expression* expression() const { return expression_; }
|
| ZoneList<Expression*>* arguments() const { return arguments_; }
|
| - bool is_eval() { return is_eval_; }
|
| int position() { return pos_; }
|
|
|
| static Call* sentinel() { return &sentinel_; }
|
| @@ -889,7 +887,6 @@
|
| private:
|
| Expression* expression_;
|
| ZoneList<Expression*>* arguments_;
|
| - bool is_eval_;
|
| int pos_;
|
|
|
| static Call sentinel_;
|
| @@ -899,12 +896,30 @@
|
| class CallNew: public Call {
|
| public:
|
| CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos)
|
| - : Call(expression, arguments, false, pos) { }
|
| + : Call(expression, arguments, pos) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| };
|
|
|
|
|
| +// The CallEval class represents a call of the form 'eval(...)' where eval
|
| +// cannot be seen to be overwritten at compile time. It is potentially a
|
| +// direct (i.e. not aliased) eval call. The real nature of the call is
|
| +// determined at runtime.
|
| +class CallEval: public Call {
|
| + public:
|
| + CallEval(Expression* expression, ZoneList<Expression*>* arguments, int pos)
|
| + : Call(expression, arguments, pos) { }
|
| +
|
| + virtual void Accept(AstVisitor* v);
|
| +
|
| + static CallEval* sentinel() { return &sentinel_; }
|
| +
|
| + private:
|
| + static CallEval sentinel_;
|
| +};
|
| +
|
| +
|
| // The CallRuntime class does not represent any official JavaScript
|
| // language construct. Instead it is used to call a C or JS function
|
| // with a set of arguments. This is used from the builtins that are
|
| @@ -916,7 +931,7 @@
|
| ZoneList<Expression*>* arguments)
|
| : name_(name), function_(function), arguments_(arguments) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Handle<String> name() const { return name_; }
|
| Runtime::Function* function() const { return function_; }
|
| @@ -936,7 +951,7 @@
|
| ASSERT(Token::IsUnaryOp(op));
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual UnaryOperation* AsUnaryOperation() { return this; }
|
| @@ -957,7 +972,7 @@
|
| ASSERT(Token::IsBinaryOp(op));
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual BinaryOperation* AsBinaryOperation() { return this; }
|
| @@ -1006,7 +1021,7 @@
|
| ASSERT(Token::IsCountOp(op));
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| bool is_prefix() const { return is_prefix_; }
|
| bool is_postfix() const { return !is_prefix_; }
|
| @@ -1029,7 +1044,7 @@
|
| ASSERT(Token::IsCompareOp(op));
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Token::Value op() const { return op_; }
|
| Expression* left() const { return left_; }
|
| @@ -1051,7 +1066,7 @@
|
| then_expression_(then_expression),
|
| else_expression_(else_expression) { }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| Expression* condition() const { return condition_; }
|
| Expression* then_expression() const { return then_expression_; }
|
| @@ -1071,7 +1086,7 @@
|
| ASSERT(Token::IsAssignmentOp(op));
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| virtual Assignment* AsAssignment() { return this; }
|
|
|
| Token::Value binary_op() const;
|
| @@ -1094,7 +1109,7 @@
|
| Throw(Expression* exception, int pos)
|
| : exception_(exception), pos_(pos) {}
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| Expression* exception() const { return exception_; }
|
| int position() const { return pos_; }
|
|
|
| @@ -1130,7 +1145,7 @@
|
| function_token_position_(RelocInfo::kNoPosition) {
|
| }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| // Type testing & conversion
|
| virtual FunctionLiteral* AsFunctionLiteral() { return this; }
|
| @@ -1179,7 +1194,7 @@
|
|
|
| Handle<JSFunction> boilerplate() const { return boilerplate_; }
|
|
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
|
|
| private:
|
| Handle<JSFunction> boilerplate_;
|
| @@ -1188,7 +1203,7 @@
|
|
|
| class ThisFunction: public Expression {
|
| public:
|
| - virtual void Accept(Visitor* v);
|
| + virtual void Accept(AstVisitor* v);
|
| };
|
|
|
|
|
| @@ -1465,10 +1480,10 @@
|
| // Basic visitor
|
| // - leaf node visitors are abstract.
|
|
|
| -class Visitor BASE_EMBEDDED {
|
| +class AstVisitor BASE_EMBEDDED {
|
| public:
|
| - Visitor() : stack_overflow_(false) { }
|
| - virtual ~Visitor() { }
|
| + AstVisitor() : stack_overflow_(false) { }
|
| + virtual ~AstVisitor() { }
|
|
|
| // Dispatch
|
| void Visit(Node* node) { node->Accept(this); }
|
|
|