Index: src/scopes.h |
diff --git a/src/scopes.h b/src/scopes.h |
index b9d151cba5d69af23793c93e8e54da103fc825c1..c60c2e7d49c2f0587c79120e8e62ba3ea78cef1e 100644 |
--- a/src/scopes.h |
+++ b/src/scopes.h |
@@ -186,6 +186,12 @@ class Scope: public ZoneObject { |
// such a variable again if it was added; otherwise this is a no-op. |
void RemoveUnresolved(VariableProxy* var); |
+ // Creates a new internal variable in this scope. The name is only used |
+ // for printing and cannot be used to find the variable. In particular, |
+ // the only way to get hold of the temporary is by keeping the Variable* |
+ // around. |
+ Variable* NewInternal(Handle<String> name); |
+ |
// Creates a new temporary variable in this scope. The name is only used |
// for printing and cannot be used to find the variable. In particular, |
// the only way to get hold of the temporary is by keeping the Variable* |
@@ -369,6 +375,12 @@ class Scope: public ZoneObject { |
int StackLocalCount() const; |
int ContextLocalCount() const; |
+ // For global scopes, the number of module literals (including nested ones). |
+ int num_modules() const { return num_modules_; } |
+ |
+ // For module scopes, the host scope's internal variable binding this module. |
+ Variable* module_var() const { return module_var_; } |
+ |
// Make sure this scope and all outer scopes are eagerly compiled. |
void ForceEagerCompilation() { force_eager_compilation_ = true; } |
@@ -387,6 +399,9 @@ class Scope: public ZoneObject { |
// The number of contexts between this and scope; zero if this == scope. |
int ContextChainLength(Scope* scope); |
+ // Find the innermost global scope. |
+ Scope* GlobalScope(); |
+ |
// Find the first function, global, or eval scope. This is the scope |
// where var declarations will be hoisted to in the implementation. |
Scope* DeclarationScope(); |
@@ -441,6 +456,8 @@ class Scope: public ZoneObject { |
// variables may be implicitly 'declared' by being used (possibly in |
// an inner scope) with no intervening with statements or eval calls. |
VariableMap variables_; |
+ // Compiler-allocated (user-invisible) internals. |
+ ZoneList<Variable*> internals_; |
// Compiler-allocated (user-invisible) temporaries. |
ZoneList<Variable*> temps_; |
// Parameter list in source order. |
@@ -494,6 +511,12 @@ class Scope: public ZoneObject { |
int num_stack_slots_; |
int num_heap_slots_; |
+ // The number of modules (including nested ones). |
+ int num_modules_; |
+ |
+ // For module scopes, the host scope's internal variable binding this module. |
+ Variable* module_var_; |
+ |
// Serialized scope info support. |
Handle<ScopeInfo> scope_info_; |
bool already_resolved() { return already_resolved_; } |
@@ -578,6 +601,7 @@ class Scope: public ZoneObject { |
void AllocateNonParameterLocal(Variable* var); |
void AllocateNonParameterLocals(); |
void AllocateVariablesRecursively(); |
+ void AllocateModulesRecursively(Scope* host_scope); |
// Resolve and fill in the allocation information for all variables |
// in this scopes. Must be called *after* all scopes have been |
@@ -591,13 +615,6 @@ class Scope: public ZoneObject { |
bool AllocateVariables(CompilationInfo* info, |
AstNodeFactory<AstNullVisitor>* factory); |
- // Instance objects have to be created ahead of time (before code generation) |
- // because of potentially cyclic references between them. |
- // Linking also has to be a separate stage, since populating one object may |
- // potentially require (forward) references to others. |
- void AllocateModules(CompilationInfo* info); |
- void LinkModules(CompilationInfo* info); |
- |
private: |
// Construct a scope based on the scope info. |
Scope(Scope* inner_scope, ScopeType type, Handle<ScopeInfo> scope_info, |