Chromium Code Reviews| Index: src/ast.h |
| diff --git a/src/ast.h b/src/ast.h |
| index 3acd121582a5e44150cc6c1cd01a321daa045f8e..d2aa1214d9a86beb83dae8501de00785d6495ec7 100644 |
| --- a/src/ast.h |
| +++ b/src/ast.h |
| @@ -61,6 +61,7 @@ namespace internal { |
| #define DECLARATION_NODE_LIST(V) \ |
| V(VariableDeclaration) \ |
| + V(FunctionDeclaration) \ |
| V(ModuleDeclaration) \ |
| #define MODULE_NODE_LIST(V) \ |
| @@ -444,10 +445,10 @@ class Declaration: public AstNode { |
| VariableProxy* proxy() const { return proxy_; } |
| VariableMode mode() const { return mode_; } |
| Scope* scope() const { return scope_; } |
| + virtual InitializationFlag initialization() const = 0; |
| virtual bool IsInlineable() const; |
| virtual Declaration* AsDeclaration() { return this; } |
| - virtual VariableDeclaration* AsVariableDeclaration() { return NULL; } |
| protected: |
| Declaration(VariableProxy* proxy, |
| @@ -475,22 +476,43 @@ class VariableDeclaration: public Declaration { |
| public: |
| DECLARE_NODE_TYPE(VariableDeclaration) |
| - virtual VariableDeclaration* AsVariableDeclaration() { return this; } |
| + virtual InitializationFlag initialization() const { |
| + return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
| + } |
| + |
| + protected: |
| + template<class> friend class AstNodeFactory; |
| + |
| + VariableDeclaration(VariableProxy* proxy, |
| + VariableMode mode, |
| + Scope* scope) |
| + : Declaration(proxy, mode, scope) { |
| + } |
| +}; |
| + |
| - FunctionLiteral* fun() const { return fun_; } // may be NULL |
| +class FunctionDeclaration: public Declaration { |
| + public: |
| + DECLARE_NODE_TYPE(FunctionDeclaration) |
| + |
| + FunctionLiteral* fun() const { return fun_; } |
| + virtual InitializationFlag initialization() const { |
| + return kCreatedInitialized; |
| + } |
| virtual bool IsInlineable() const; |
| protected: |
| template<class> friend class AstNodeFactory; |
| - VariableDeclaration(VariableProxy* proxy, |
| + FunctionDeclaration(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... |
|
Jakob Kummerow
2012/02/27 14:22:18
nit: while you're at it, please s/'s//.
|
| - ASSERT(fun == NULL || mode == VAR || mode == LET); |
| + ASSERT(mode == VAR || mode == LET); |
| + ASSERT(fun != NULL); |
| } |
| private: |
| @@ -503,6 +525,9 @@ class ModuleDeclaration: public Declaration { |
| DECLARE_NODE_TYPE(ModuleDeclaration) |
| Module* module() const { return module_; } |
| + virtual InitializationFlag initialization() const { |
| + return kCreatedInitialized; |
| + } |
| protected: |
| template<class> friend class AstNodeFactory; |
| @@ -2518,13 +2543,21 @@ class AstNodeFactory BASE_EMBEDDED { |
| VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy, |
| VariableMode mode, |
| - FunctionLiteral* fun, |
| Scope* scope) { |
| VariableDeclaration* decl = |
| - new(zone_) VariableDeclaration(proxy, mode, fun, scope); |
| + new(zone_) VariableDeclaration(proxy, mode, scope); |
| VISIT_AND_RETURN(VariableDeclaration, decl) |
| } |
| + FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy, |
| + VariableMode mode, |
| + FunctionLiteral* fun, |
| + Scope* scope) { |
| + FunctionDeclaration* decl = |
| + new(zone_) FunctionDeclaration(proxy, mode, fun, scope); |
| + VISIT_AND_RETURN(FunctionDeclaration, decl) |
| + } |
| + |
| ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy, |
| Module* module, |
| Scope* scope) { |