Chromium Code Reviews| Index: src/scopes.cc |
| diff --git a/src/scopes.cc b/src/scopes.cc |
| index a5af8c015783152c94ae3b24a9cf6c137bb93dd6..34cda67598ad91c86d8181de9dae7880406e02ec 100644 |
| --- a/src/scopes.cc |
| +++ b/src/scopes.cc |
| @@ -77,6 +77,7 @@ Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type, |
| internals_(4, zone), |
| temps_(4, zone), |
| params_(4, zone), |
| + param_positions_(4, zone), |
| unresolved_(16, zone), |
| decls_(4, zone), |
| module_descriptor_( |
| @@ -100,6 +101,7 @@ Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type, |
| internals_(4, zone), |
| temps_(4, zone), |
| params_(4, zone), |
| + param_positions_(4, zone), |
| unresolved_(16, zone), |
| decls_(4, zone), |
| module_descriptor_(NULL), |
| @@ -126,6 +128,7 @@ Scope::Scope(Zone* zone, Scope* inner_scope, |
| internals_(0, zone), |
| temps_(0, zone), |
| params_(0, zone), |
| + param_positions_(0, zone), |
| unresolved_(0, zone), |
| decls_(0, zone), |
| module_descriptor_(NULL), |
| @@ -449,7 +452,7 @@ Variable* Scope::Lookup(const AstRawString* name) { |
| Variable* Scope::DeclareParameter(const AstRawString* name, VariableMode mode, |
| - bool is_rest, bool* is_duplicate) { |
| + bool is_rest, bool* is_duplicate, int pos) { |
| DCHECK(!already_resolved()); |
| DCHECK(is_function_scope()); |
| Variable* var = variables_.Declare(this, name, mode, Variable::NORMAL, |
| @@ -462,6 +465,7 @@ Variable* Scope::DeclareParameter(const AstRawString* name, VariableMode mode, |
| // TODO(wingo): Avoid O(n^2) check. |
| *is_duplicate = IsDeclaredParameter(name); |
| params_.Add(var, zone()); |
| + param_positions_.Add(pos, zone()); |
|
wingo
2015/05/11 15:02:51
Don't we require already that parameters are decla
caitp (gmail)
2015/05/11 15:34:24
It's needed because they end up as lexical declara
|
| return var; |
| } |
| @@ -491,6 +495,18 @@ Variable* Scope::DeclareDynamicGlobal(const AstRawString* name) { |
| } |
| +void Scope::ShadowParametersForExpressions() { |
| + // Parameters have expressions --- ensure that the declared parameters can |
| + // never be resolved |
| + DCHECK(is_function_scope()); |
| + for (int i = 0; i < num_parameters(); ++i) { |
| + Variable* p = parameter(i); |
| + const AstRawString* name = p->raw_name(); |
| + variables_.Remove(const_cast<AstRawString*>(name), name->hash()); |
| + } |
| +} |
| + |
| + |
| void Scope::RemoveUnresolved(VariableProxy* var) { |
| // Most likely (always?) any variable we want to remove |
| // was just added before, so we search backwards. |