Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/ast/scopes.cc

Issue 2231813003: Make Variable::is_this always return the correct value (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: remove patch Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/ast/scopes.h" 5 #include "src/ast/scopes.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 MaybeAssignedFlag maybe_assigned_flag) { 667 MaybeAssignedFlag maybe_assigned_flag) {
668 DCHECK(!already_resolved()); 668 DCHECK(!already_resolved());
669 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are 669 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are
670 // introduced during variable allocation, and TEMPORARY variables are 670 // introduced during variable allocation, and TEMPORARY variables are
671 // allocated via NewTemporary(). 671 // allocated via NewTemporary().
672 DCHECK(IsDeclaredVariableMode(mode)); 672 DCHECK(IsDeclaredVariableMode(mode));
673 return variables_.Declare(zone(), this, name, mode, kind, init_flag, 673 return variables_.Declare(zone(), this, name, mode, kind, init_flag,
674 maybe_assigned_flag); 674 maybe_assigned_flag);
675 } 675 }
676 676
677 Variable* DeclarationScope::DeclareDynamicGlobal(const AstRawString* name) { 677 Variable* DeclarationScope::DeclareDynamicGlobal(const AstRawString* name,
678 Variable::Kind kind) {
678 DCHECK(is_script_scope()); 679 DCHECK(is_script_scope());
679 return variables_.Declare(zone(), this, name, DYNAMIC_GLOBAL, 680 return variables_.Declare(zone(), this, name, DYNAMIC_GLOBAL, kind,
680 Variable::NORMAL, kCreatedInitialized); 681 kCreatedInitialized);
681 } 682 }
682 683
683 684
684 bool Scope::RemoveUnresolved(VariableProxy* var) { 685 bool Scope::RemoveUnresolved(VariableProxy* var) {
685 if (unresolved_ == var) { 686 if (unresolved_ == var) {
686 unresolved_ = var->next_unresolved(); 687 unresolved_ = var->next_unresolved();
687 var->set_next_unresolved(nullptr); 688 var->set_next_unresolved(nullptr);
688 return true; 689 return true;
689 } 690 }
690 VariableProxy* current = unresolved_; 691 VariableProxy* current = unresolved_;
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 } 1245 }
1245 } 1246 }
1246 1247
1247 void Scope::CheckZones() { 1248 void Scope::CheckZones() {
1248 for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { 1249 for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) {
1249 CHECK_EQ(scope->zone(), zone()); 1250 CHECK_EQ(scope->zone(), zone());
1250 } 1251 }
1251 } 1252 }
1252 #endif // DEBUG 1253 #endif // DEBUG
1253 1254
1254 1255 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode,
1255 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) { 1256 Variable::Kind kind) {
1256 if (dynamics_ == NULL) dynamics_ = new (zone()) DynamicScopePart(zone()); 1257 if (dynamics_ == NULL) dynamics_ = new (zone()) DynamicScopePart(zone());
1257 VariableMap* map = dynamics_->GetMap(mode); 1258 VariableMap* map = dynamics_->GetMap(mode);
1258 Variable* var = map->Lookup(name); 1259 Variable* var = map->Lookup(name);
1259 if (var == NULL) { 1260 if (var == NULL) {
1260 // Declare a new non-local. 1261 // Declare a new non-local.
1261 InitializationFlag init_flag = (mode == VAR) 1262 InitializationFlag init_flag = (mode == VAR)
1262 ? kCreatedInitialized : kNeedsInitialization; 1263 ? kCreatedInitialized : kNeedsInitialization;
1263 var = map->Declare(zone(), NULL, name, mode, Variable::NORMAL, init_flag); 1264 var = map->Declare(zone(), NULL, name, mode, kind, init_flag);
1264 // Allocate it by giving it a dynamic lookup. 1265 // Allocate it by giving it a dynamic lookup.
1265 var->AllocateTo(VariableLocation::LOOKUP, -1); 1266 var->AllocateTo(VariableLocation::LOOKUP, -1);
1266 } 1267 }
1267 return var; 1268 return var;
1268 } 1269 }
1269 1270
1270 Variable* Scope::LookupRecursive(VariableProxy* proxy, 1271 Variable* Scope::LookupRecursive(VariableProxy* proxy,
1271 BindingKind* binding_kind, 1272 BindingKind* binding_kind,
1272 AstNodeFactory* factory, 1273 AstNodeFactory* factory,
1273 Scope* max_outer_scope) { 1274 Scope* max_outer_scope) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 // (functions and consts may be resolved by the parser). 1355 // (functions and consts may be resolved by the parser).
1355 if (proxy->is_resolved()) return; 1356 if (proxy->is_resolved()) return;
1356 1357
1357 // Otherwise, try to resolve the variable. 1358 // Otherwise, try to resolve the variable.
1358 BindingKind binding_kind; 1359 BindingKind binding_kind;
1359 Variable* var = LookupRecursive(proxy, &binding_kind, factory); 1360 Variable* var = LookupRecursive(proxy, &binding_kind, factory);
1360 1361
1361 ResolveTo(info, binding_kind, proxy, var); 1362 ResolveTo(info, binding_kind, proxy, var);
1362 } 1363 }
1363 1364
1364 void Scope::ResolveTo(ParseInfo* info, BindingKind binding_kind, 1365 void Scope::ResolveTo(ParseInfo* info, BindingKind binding_kind,
adamk 2016/08/10 17:57:39 It looks like this is the only code that calls Var
Toon Verwaest 2016/08/11 08:46:25 Done.
1365 VariableProxy* proxy, Variable* var) { 1366 VariableProxy* proxy, Variable* var) {
1366 #ifdef DEBUG 1367 #ifdef DEBUG
1367 if (info->script_is_native()) { 1368 if (info->script_is_native()) {
1368 // To avoid polluting the global object in native scripts 1369 // To avoid polluting the global object in native scripts
1369 // - Variables must not be allocated to the global scope. 1370 // - Variables must not be allocated to the global scope.
1370 CHECK_NOT_NULL(outer_scope()); 1371 CHECK_NOT_NULL(outer_scope());
1371 // - Variables must be bound locally or unallocated. 1372 // - Variables must be bound locally or unallocated.
1372 if (BOUND != binding_kind) { 1373 if (BOUND != binding_kind) {
1373 // The following variable name may be minified. If so, disable 1374 // The following variable name may be minified. If so, disable
1374 // minification in js2c.py for better output. 1375 // minification in js2c.py for better output.
(...skipping 12 matching lines...) Expand all
1387 switch (binding_kind) { 1388 switch (binding_kind) {
1388 case BOUND: 1389 case BOUND:
1389 break; 1390 break;
1390 1391
1391 case BOUND_EVAL_SHADOWED: 1392 case BOUND_EVAL_SHADOWED:
1392 // We either found a variable binding that might be shadowed by eval or 1393 // We either found a variable binding that might be shadowed by eval or
1393 // gave up on it (e.g. by encountering a local with the same in the outer 1394 // gave up on it (e.g. by encountering a local with the same in the outer
1394 // scope which was not promoted to a context, this can happen if we use 1395 // scope which was not promoted to a context, this can happen if we use
1395 // debugger to evaluate arbitrary expressions at a break point). 1396 // debugger to evaluate arbitrary expressions at a break point).
1396 if (var->IsGlobalObjectProperty()) { 1397 if (var->IsGlobalObjectProperty()) {
1397 var = NonLocal(proxy->raw_name(), DYNAMIC_GLOBAL); 1398 var = NonLocal(proxy->raw_name(), DYNAMIC_GLOBAL, proxy->var_kind());
1398 } else if (var->is_dynamic()) { 1399 } else if (var->is_dynamic()) {
1399 var = NonLocal(proxy->raw_name(), DYNAMIC); 1400 var = NonLocal(proxy->raw_name(), DYNAMIC, proxy->var_kind());
1400 } else { 1401 } else {
1401 Variable* invalidated = var; 1402 Variable* invalidated = var;
1402 var = NonLocal(proxy->raw_name(), DYNAMIC_LOCAL); 1403 var = NonLocal(proxy->raw_name(), DYNAMIC_LOCAL, proxy->var_kind());
1403 var->set_local_if_not_shadowed(invalidated); 1404 var->set_local_if_not_shadowed(invalidated);
1404 } 1405 }
1405 break; 1406 break;
1406 1407
1407 case UNBOUND: 1408 case UNBOUND:
1408 // No binding has been found. Declare a variable on the global object. 1409 // No binding has been found. Declare a variable on the global object.
1409 var = info->script_scope()->DeclareDynamicGlobal(proxy->raw_name()); 1410 var = info->script_scope()->DeclareDynamicGlobal(proxy->raw_name(),
1411 proxy->var_kind());
1410 break; 1412 break;
1411 1413
1412 case UNBOUND_EVAL_SHADOWED: 1414 case UNBOUND_EVAL_SHADOWED:
1413 // No binding has been found. But some scope makes a sloppy 'eval' call. 1415 // No binding has been found. But some scope makes a sloppy 'eval' call.
1414 var = NonLocal(proxy->raw_name(), DYNAMIC_GLOBAL); 1416 var = NonLocal(proxy->raw_name(), DYNAMIC_GLOBAL, proxy->var_kind());
1415 break; 1417 break;
1416 1418
1417 case DYNAMIC_LOOKUP: 1419 case DYNAMIC_LOOKUP:
1418 // The variable could not be resolved statically. 1420 // The variable could not be resolved statically.
1419 var = NonLocal(proxy->raw_name(), DYNAMIC); 1421 var = NonLocal(proxy->raw_name(), DYNAMIC, proxy->var_kind());
1420 break; 1422 break;
1421 } 1423 }
1422 1424
1423 DCHECK(var != NULL); 1425 DCHECK(var != NULL);
1424 if (proxy->is_assigned()) var->set_maybe_assigned(); 1426 if (proxy->is_assigned()) var->set_maybe_assigned();
1425 1427
1426 proxy->BindTo(var); 1428 proxy->BindTo(var);
1427 } 1429 }
1428 1430
1429 void Scope::ResolveVariablesRecursively(ParseInfo* info, 1431 void Scope::ResolveVariablesRecursively(ParseInfo* info,
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 function != NULL && function->proxy()->var()->IsContextSlot(); 1793 function != NULL && function->proxy()->var()->IsContextSlot();
1792 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - 1794 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() -
1793 (is_function_var_in_context ? 1 : 0); 1795 (is_function_var_in_context ? 1 : 0);
1794 } 1796 }
1795 1797
1796 1798
1797 int Scope::ContextGlobalCount() const { return num_global_slots(); } 1799 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1798 1800
1799 } // namespace internal 1801 } // namespace internal
1800 } // namespace v8 1802 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698