Index: src/ast.h |
diff --git a/src/ast.h b/src/ast.h |
index 5398775483ec7c9766922d27c6f7e024bc6f6b4e..3342de479b7d87a1a96d0211e63aeb0b43babe72 100644 |
--- a/src/ast.h |
+++ b/src/ast.h |
@@ -41,6 +41,7 @@ |
#include "token.h" |
#include "utils.h" |
#include "variables.h" |
+#include "interface.h" |
#include "zone-inl.h" |
namespace v8 { |
@@ -589,9 +590,15 @@ class ExportDeclaration: public Declaration { |
class Module: public AstNode { |
- // TODO(rossberg): stuff to come... |
+ public: |
+ Interface* interface() const { return interface_; } |
+ |
protected: |
- Module() {} |
+ Module() : interface_(Interface::NewModule()) {} |
+ explicit Module(Interface* interface) : interface_(interface) {} |
+ |
+ private: |
+ Interface* interface_; |
}; |
@@ -604,8 +611,9 @@ class ModuleLiteral: public Module { |
protected: |
template<class> friend class AstNodeFactory; |
- explicit ModuleLiteral(Block* body) |
- : body_(body) { |
+ ModuleLiteral(Block* body, Interface* interface) |
+ : Module(interface), |
+ body_(body) { |
} |
private: |
@@ -622,9 +630,7 @@ class ModuleVariable: public Module { |
protected: |
template<class> friend class AstNodeFactory; |
- explicit ModuleVariable(VariableProxy* proxy) |
- : proxy_(proxy) { |
- } |
+ inline explicit ModuleVariable(VariableProxy* proxy); |
private: |
VariableProxy* proxy_; |
@@ -1451,6 +1457,8 @@ class VariableProxy: public Expression { |
Variable* var() const { return var_; } |
bool is_this() const { return is_this_; } |
int position() const { return position_; } |
+ Interface* interface() const { return interface_; } |
+ |
void MarkAsTrivial() { is_trivial_ = true; } |
void MarkAsLValue() { is_lvalue_ = true; } |
@@ -1466,7 +1474,8 @@ class VariableProxy: public Expression { |
VariableProxy(Isolate* isolate, |
Handle<String> name, |
bool is_this, |
- int position); |
+ int position, |
+ Interface* interface); |
Handle<String> name_; |
Variable* var_; // resolved variable, or NULL |
@@ -1476,6 +1485,7 @@ class VariableProxy: public Expression { |
// or with a increment/decrement operator. |
bool is_lvalue_; |
int position_; |
+ Interface* interface_; |
}; |
@@ -2506,6 +2516,15 @@ class RegExpEmpty: public RegExpTree { |
// ---------------------------------------------------------------------------- |
+// Out-of-line inline constructors (to side-step cyclic dependencies). |
+ |
+inline ModuleVariable::ModuleVariable(VariableProxy* proxy) |
+ : Module(proxy->interface()), |
+ proxy_(proxy) { |
+} |
+ |
+ |
+// ---------------------------------------------------------------------------- |
// Basic visitor |
// - leaf node visitors are abstract. |
@@ -2639,8 +2658,8 @@ class AstNodeFactory BASE_EMBEDDED { |
VISIT_AND_RETURN(ExportDeclaration, decl) |
} |
- ModuleLiteral* NewModuleLiteral(Block* body) { |
- ModuleLiteral* module = new(zone_) ModuleLiteral(body); |
+ ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface) { |
+ ModuleLiteral* module = new(zone_) ModuleLiteral(body, interface); |
VISIT_AND_RETURN(ModuleLiteral, module) |
} |
@@ -2796,9 +2815,11 @@ class AstNodeFactory BASE_EMBEDDED { |
VariableProxy* NewVariableProxy(Handle<String> name, |
bool is_this, |
- int position = RelocInfo::kNoPosition) { |
+ int position = RelocInfo::kNoPosition, |
+ Interface* interface = |
+ Interface::NewValue()) { |
VariableProxy* proxy = |
- new(zone_) VariableProxy(isolate_, name, is_this, position); |
+ new(zone_) VariableProxy(isolate_, name, is_this, position, interface); |
VISIT_AND_RETURN(VariableProxy, proxy) |
} |