Index: src/scopes.h |
diff --git a/src/scopes.h b/src/scopes.h |
index af0449e93c7dea6895f06d42cf7a95ca7624071c..06202c493baa9ba43e3642238d96472460e73b33 100644 |
--- a/src/scopes.h |
+++ b/src/scopes.h |
@@ -1,4 +1,4 @@ |
-// Copyright 2011 the V8 project authors. All rights reserved. |
+// Copyright 2012 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -115,7 +115,8 @@ class Scope: public ZoneObject { |
// between this scope and the outer scope. (ECMA-262, 3rd., requires that |
// the name of named function literal is kept in an intermediate scope |
// in between this scope and the next outer scope.) |
- Variable* LookupFunctionVar(Handle<String> name); |
+ Variable* LookupFunctionVar(Handle<String> name, |
+ AstNodeFactory<AstNullVisitor>* factory); |
// Lookup a variable in this scope or outer scopes. |
// Returns the variable or NULL if not found. |
@@ -124,7 +125,16 @@ class Scope: public ZoneObject { |
// Declare the function variable for a function literal. This variable |
// is in an intermediate scope between this function scope and the the |
// outer scope. Only possible for function scopes; at most one variable. |
- Variable* DeclareFunctionVar(Handle<String> name, VariableMode mode); |
+ template<class Visitor> |
+ Variable* DeclareFunctionVar(Handle<String> name, |
+ VariableMode mode, |
+ AstNodeFactory<Visitor>* factory) { |
+ ASSERT(is_function_scope() && function_ == NULL); |
+ Variable* function_var = new Variable( |
+ this, name, mode, true, Variable::NORMAL, kCreatedInitialized); |
+ function_ = factory->NewVariableProxy(function_var); |
+ return function_var; |
+ } |
// Declare a parameter in this scope. When there are duplicated |
// parameters the rightmost one 'wins'. However, the implementation |
@@ -144,8 +154,18 @@ class Scope: public ZoneObject { |
Variable* DeclareGlobal(Handle<String> name); |
// Create a new unresolved variable. |
- VariableProxy* NewUnresolved(Handle<String> name, |
- int position = RelocInfo::kNoPosition); |
+ template<class Visitor> |
+ VariableProxy* NewUnresolved(AstNodeFactory<Visitor>* factory, |
+ Handle<String> name, |
+ int position = RelocInfo::kNoPosition) { |
+ // Note that we must not share the unresolved variables with |
+ // the same name because they may be removed selectively via |
+ // RemoveUnresolved(). |
+ ASSERT(!already_resolved()); |
+ VariableProxy* proxy = factory->NewVariableProxy(name, false, position); |
+ unresolved_.Add(proxy); |
+ return proxy; |
+ } |
// Remove a unresolved variable. During parsing, an unresolved variable |
// may have been added optimistically, but then only the variable name |
@@ -332,7 +352,8 @@ class Scope: public ZoneObject { |
// In the case of code compiled and run using 'eval', the context |
// parameter is the context in which eval was called. In all other |
// cases the context parameter is an empty handle. |
- void AllocateVariables(Scope* global_scope); |
+ void AllocateVariables(Scope* global_scope, |
+ AstNodeFactory<AstNullVisitor>* factory); |
// Current number of var or const locals. |
int num_var_or_const() { return num_var_or_const_; } |
@@ -519,10 +540,13 @@ class Scope: public ZoneObject { |
// scope. If the code is executed because of a call to 'eval', the context |
// parameter should be set to the calling context of 'eval'. |
Variable* LookupRecursive(Handle<String> name, |
- BindingKind* binding_kind); |
+ BindingKind* binding_kind, |
+ AstNodeFactory<AstNullVisitor>* factory); |
void ResolveVariable(Scope* global_scope, |
- VariableProxy* proxy); |
- void ResolveVariablesRecursively(Scope* global_scope); |
+ VariableProxy* proxy, |
+ AstNodeFactory<AstNullVisitor>* factory); |
+ void ResolveVariablesRecursively(Scope* global_scope, |
+ AstNodeFactory<AstNullVisitor>* factory); |
// Scope analysis. |
bool PropagateScopeInfo(bool outer_scope_calls_non_strict_eval); |