| Index: src/ast.h
|
| diff --git a/src/ast.h b/src/ast.h
|
| index d2dd5e661df1954fc429042a160f0ed09b89af7f..48fb823c41b7dad0cddbc8893603a0a1e2de382c 100644
|
| --- a/src/ast.h
|
| +++ b/src/ast.h
|
| @@ -61,6 +61,13 @@ namespace internal {
|
|
|
| #define DECLARATION_NODE_LIST(V) \
|
| V(VariableDeclaration) \
|
| + V(ModuleDeclaration) \
|
| +
|
| +#define MODULE_NODE_LIST(V) \
|
| + V(ModuleLiteral) \
|
| + V(ModuleVariable) \
|
| + V(ModulePath) \
|
| + V(ModuleUrl)
|
|
|
| #define STATEMENT_NODE_LIST(V) \
|
| V(Block) \
|
| @@ -103,6 +110,7 @@ namespace internal {
|
|
|
| #define AST_NODE_LIST(V) \
|
| DECLARATION_NODE_LIST(V) \
|
| + MODULE_NODE_LIST(V) \
|
| STATEMENT_NODE_LIST(V) \
|
| EXPRESSION_NODE_LIST(V)
|
|
|
| @@ -111,6 +119,7 @@ class AstConstructionVisitor;
|
| template<class> class AstNodeFactory;
|
| class AstVisitor;
|
| class Declaration;
|
| +class Module;
|
| class BreakableStatement;
|
| class Expression;
|
| class IterationStatement;
|
| @@ -301,10 +310,6 @@ class Expression: public AstNode {
|
| kTest
|
| };
|
|
|
| - explicit Expression(Isolate* isolate)
|
| - : id_(GetNextId(isolate)),
|
| - test_id_(GetNextId(isolate)) {}
|
| -
|
| virtual int position() const {
|
| UNREACHABLE();
|
| return 0;
|
| @@ -355,6 +360,11 @@ class Expression: public AstNode {
|
| unsigned id() const { return id_; }
|
| unsigned test_id() const { return test_id_; }
|
|
|
| + protected:
|
| + explicit Expression(Isolate* isolate)
|
| + : id_(GetNextId(isolate)),
|
| + test_id_(GetNextId(isolate)) {}
|
| +
|
| private:
|
| int id_;
|
| int test_id_;
|
| @@ -495,6 +505,108 @@ class VariableDeclaration: public Declaration {
|
| };
|
|
|
|
|
| +class ModuleDeclaration: public Declaration {
|
| + public:
|
| + DECLARE_NODE_TYPE(ModuleDeclaration)
|
| +
|
| + Module* module() const { return module_; }
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + ModuleDeclaration(VariableProxy* proxy,
|
| + Module* module,
|
| + Scope* scope)
|
| + : Declaration(proxy, LET, scope),
|
| + module_(module) {
|
| + }
|
| +
|
| + private:
|
| + Module* module_;
|
| +};
|
| +
|
| +
|
| +class Module: public AstNode {
|
| + // TODO(rossberg): stuff to come...
|
| + protected:
|
| + Module() {}
|
| +};
|
| +
|
| +
|
| +class ModuleLiteral: public Module {
|
| + public:
|
| + DECLARE_NODE_TYPE(ModuleLiteral)
|
| +
|
| + Block* body() const { return body_; }
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + ModuleLiteral(Block* body)
|
| + : body_(body) {
|
| + }
|
| +
|
| + private:
|
| + Block* body_;
|
| +};
|
| +
|
| +
|
| +class ModuleVariable: public Module {
|
| + public:
|
| + DECLARE_NODE_TYPE(ModuleVariable)
|
| +
|
| + Variable* var() const { return var_; }
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + ModuleVariable(Variable* var)
|
| + : var_(var) {
|
| + }
|
| +
|
| + private:
|
| + Variable* var_;
|
| +};
|
| +
|
| +
|
| +class ModulePath: public Module {
|
| + public:
|
| + DECLARE_NODE_TYPE(ModulePath)
|
| +
|
| + Module* module() const { return module_; }
|
| + Handle<String> name() const { return name_; }
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + ModulePath(Module* module, Handle<String> name)
|
| + : module_(module),
|
| + name_(name) {
|
| + }
|
| +
|
| + private:
|
| + Module* module_;
|
| + Handle<String> name_;
|
| +};
|
| +
|
| +
|
| +class ModuleUrl: public Module {
|
| + public:
|
| + DECLARE_NODE_TYPE(ModuleUrl)
|
| +
|
| + Handle<String> url() const { return url_; }
|
| +
|
| + protected:
|
| + template<class> friend class AstNodeFactory;
|
| +
|
| + ModuleUrl(Handle<String> url) : url_(url) {
|
| + }
|
| +
|
| + private:
|
| + Handle<String> url_;
|
| +};
|
| +
|
| +
|
| class IterationStatement: public BreakableStatement {
|
| public:
|
| // Type testing & conversion.
|
| @@ -2400,6 +2512,34 @@ class AstNodeFactory BASE_EMBEDDED {
|
| VISIT_AND_RETURN(VariableDeclaration, decl)
|
| }
|
|
|
| + ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy,
|
| + Module* module,
|
| + Scope* scope) {
|
| + ModuleDeclaration* decl =
|
| + new(zone_) ModuleDeclaration(proxy, module, scope);
|
| + VISIT_AND_RETURN(ModuleDeclaration, decl)
|
| + }
|
| +
|
| + ModuleLiteral* NewModuleLiteral(Block* body) {
|
| + ModuleLiteral* module = new(zone_) ModuleLiteral(body);
|
| + VISIT_AND_RETURN(ModuleLiteral, module)
|
| + }
|
| +
|
| + ModuleVariable* NewModuleVariable(Variable* var) {
|
| + ModuleVariable* module = new(zone_) ModuleVariable(var);
|
| + VISIT_AND_RETURN(ModuleLiteral, module)
|
| + }
|
| +
|
| + ModulePath* NewModulePath(Module* origin, Handle<String> name) {
|
| + ModulePath* module = new(zone_) ModulePath(origin, name);
|
| + VISIT_AND_RETURN(ModuleLiteral, module)
|
| + }
|
| +
|
| + ModuleUrl* NewModuleUrl(Handle<String> url) {
|
| + ModuleUrl* module = new(zone_) ModuleUrl(url);
|
| + VISIT_AND_RETURN(ModuleLiteral, module)
|
| + }
|
| +
|
| Block* NewBlock(ZoneStringList* labels,
|
| int capacity,
|
| bool is_initializer_block) {
|
|
|