| Index: src/ast.h
|
| diff --git a/src/ast.h b/src/ast.h
|
| index bc2c67e0e27ddf5ccbbfb046085a46d3989508a8..12337023c1f47f67f482cfe0c04a4e5953762644 100644
|
| --- a/src/ast.h
|
| +++ b/src/ast.h
|
| @@ -59,6 +59,9 @@ namespace internal {
|
| // Nodes of the abstract syntax tree. Only concrete classes are
|
| // enumerated here.
|
|
|
| +#define DECLARATION_NODE_LIST(V) \
|
| + V(VariableDeclaration) \
|
| +
|
| #define STATEMENT_NODE_LIST(V) \
|
| V(Block) \
|
| V(ExpressionStatement) \
|
| @@ -99,7 +102,7 @@ namespace internal {
|
| V(ThisFunction)
|
|
|
| #define AST_NODE_LIST(V) \
|
| - V(Declaration) \
|
| + DECLARATION_NODE_LIST(V) \
|
| STATEMENT_NODE_LIST(V) \
|
| EXPRESSION_NODE_LIST(V)
|
|
|
| @@ -107,6 +110,7 @@ namespace internal {
|
| class AstConstructionVisitor;
|
| template<class> class AstNodeFactory;
|
| class AstVisitor;
|
| +class Declaration;
|
| class BreakableStatement;
|
| class Expression;
|
| class IterationStatement;
|
| @@ -202,6 +206,7 @@ class AstNode: public ZoneObject {
|
| AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
|
| #undef DECLARE_NODE_FUNCTIONS
|
|
|
| + virtual Declaration* AsDeclaration() { return NULL; }
|
| virtual Statement* AsStatement() { return NULL; }
|
| virtual Expression* AsExpression() { return NULL; }
|
| virtual TargetCollector* AsTargetCollector() { return NULL; }
|
| @@ -433,43 +438,63 @@ class Block: public BreakableStatement {
|
|
|
| class Declaration: public AstNode {
|
| public:
|
| - DECLARE_NODE_TYPE(Declaration)
|
| -
|
| VariableProxy* proxy() const { return proxy_; }
|
| VariableMode mode() const { return mode_; }
|
| - FunctionLiteral* fun() const { return fun_; } // may be NULL
|
| - bool IsInlineable() const;
|
| Scope* scope() const { return scope_; }
|
| + virtual bool IsInlineable() const;
|
|
|
| - protected:
|
| - template<class> friend class AstNodeFactory;
|
| + virtual Declaration* AsDeclaration() { return this; }
|
| + virtual VariableDeclaration* AsVariableDeclaration() { return NULL; }
|
|
|
| + protected:
|
| Declaration(VariableProxy* proxy,
|
| VariableMode mode,
|
| - FunctionLiteral* fun,
|
| Scope* scope)
|
| : proxy_(proxy),
|
| mode_(mode),
|
| - fun_(fun),
|
| scope_(scope) {
|
| ASSERT(mode == VAR ||
|
| mode == CONST ||
|
| mode == CONST_HARMONY ||
|
| mode == LET);
|
| - // At the moment there are no "const functions"'s in JavaScript...
|
| - ASSERT(fun == NULL || mode == VAR || mode == LET);
|
| }
|
|
|
| private:
|
| VariableProxy* proxy_;
|
| VariableMode mode_;
|
| - FunctionLiteral* fun_;
|
|
|
| // Nested scope from which the declaration originated.
|
| Scope* scope_;
|
| };
|
|
|
|
|
| +class VariableDeclaration: public Declaration {
|
| + public:
|
| + DECLARE_NODE_TYPE(VariableDeclaration)
|
| +
|
| + virtual VariableDeclaration* AsVariableDeclaration() { return this; }
|
| +
|
| + FunctionLiteral* fun() const { return fun_; } // may be NULL
|
| + virtual bool IsInlineable() const;
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + VariableDeclaration(VariableProxy* proxy,
|
| + VariableMode mode,
|
| + FunctionLiteral* fun,
|
| + Scope* scope)
|
| + : Declaration(proxy, mode, scope),
|
| + fun_(fun) {
|
| + // At the moment there are no "const functions"'s in JavaScript...
|
| + ASSERT(fun == NULL || mode == VAR || mode == LET);
|
| + }
|
| +
|
| + private:
|
| + FunctionLiteral* fun_;
|
| +};
|
| +
|
| +
|
| class IterationStatement: public BreakableStatement {
|
| public:
|
| // Type testing & conversion.
|
| @@ -2368,6 +2393,15 @@ class AstNodeFactory BASE_EMBEDDED {
|
| visitor_.Visit##NodeType((node)); \
|
| return node;
|
|
|
| + VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy,
|
| + VariableMode mode,
|
| + FunctionLiteral* fun,
|
| + Scope* scope) {
|
| + VariableDeclaration* decl =
|
| + new(zone_) VariableDeclaration(proxy, mode, fun, scope);
|
| + VISIT_AND_RETURN(VariableDeclaration, decl)
|
| + }
|
| +
|
| Block* NewBlock(ZoneStringList* labels,
|
| int capacity,
|
| bool is_initializer_block) {
|
| @@ -2376,14 +2410,6 @@ class AstNodeFactory BASE_EMBEDDED {
|
| VISIT_AND_RETURN(Block, block)
|
| }
|
|
|
| - Declaration* NewDeclaration(VariableProxy* proxy,
|
| - VariableMode mode,
|
| - FunctionLiteral* fun,
|
| - Scope* scope) {
|
| - Declaration* decl = new(zone_) Declaration(proxy, mode, fun, scope);
|
| - VISIT_AND_RETURN(Declaration, decl)
|
| - }
|
| -
|
| #define STATEMENT_WITH_LABELS(NodeType) \
|
| NodeType* New##NodeType(ZoneStringList* labels) { \
|
| NodeType* stmt = new(zone_) NodeType(isolate_, labels); \
|
|
|