Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index 95ab56a46c20978bcb8fc0c204c369b9c0d92623..f5e3e7405567d5563b9d90a5778c62c3f98a1d1e 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -141,7 +141,7 @@ Scope::Scope(Zone* zone, Scope* inner_scope, |
zone_(zone) { |
SetDefaults(CATCH_SCOPE, NULL, Handle<ScopeInfo>::null()); |
AddInnerScope(inner_scope); |
- ++num_var_or_const_; |
+ ++num_var_; |
num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; |
Variable* variable = variables_.Declare(this, |
catch_variable_name, |
@@ -185,7 +185,7 @@ void Scope::SetDefaults(ScopeType scope_type, Scope* outer_scope, |
force_eager_compilation_ = false; |
force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) |
? outer_scope->has_forced_context_allocation() : false; |
- num_var_or_const_ = 0; |
+ num_var_ = 0; |
num_stack_slots_ = 0; |
num_heap_slots_ = 0; |
num_global_slots_ = 0; |
@@ -339,8 +339,7 @@ Scope* Scope::FinalizeBlockScope() { |
DCHECK(temps_.is_empty()); |
DCHECK(params_.is_empty()); |
- if (num_var_or_const() > 0 || |
- (is_declaration_scope() && calls_sloppy_eval())) { |
+ if (num_var() > 0 || (is_declaration_scope() && calls_sloppy_eval())) { |
return this; |
} |
@@ -512,7 +511,7 @@ Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode, |
// introduced during variable allocation, and TEMPORARY variables are |
// allocated via NewTemporary(). |
DCHECK(IsDeclaredVariableMode(mode)); |
- ++num_var_or_const_; |
+ ++num_var_; |
return variables_.Declare(this, name, mode, kind, init_flag, |
maybe_assigned_flag); |
} |
@@ -611,6 +610,25 @@ Declaration* Scope::CheckConflictingVarDeclarations() { |
return NULL; |
} |
+Declaration* Scope::CheckLexDeclarationsConflictingWith( |
adamk
2016/07/01 19:14:03
Is this only called on block scopes? Can you add a
|
+ ZoneList<const AstRawString*>* names) { |
+ int length = names->length(); |
adamk
2016/07/01 19:14:04
Nit: should be no need to hoist this.
|
+ for (int i = 0; i < length; ++i) { |
+ Variable* var = LookupLocal(names->at(i)); |
+ if (var != nullptr && IsLexicalVariableMode(var->mode())) { |
adamk
2016/07/01 19:14:03
If my DCHECK suggestion above is correct, then can
|
+ // Conflict; find and return its declaration. |
+ const AstRawString* name = names->at(i); |
+ int decls_length = decls_.length(); |
adamk
2016/07/01 19:14:04
Again, no need to hoist this out of the loop.
|
+ for (int j = 0; j < decls_length; ++j) { |
+ if (decls_[j]->proxy()->raw_name() == name) { |
+ return decls_[j]; |
+ } |
+ } |
+ DCHECK(false); |
+ } |
+ } |
+ return nullptr; |
+} |
class VarAndOrder { |
public: |