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

Side by Side Diff: src/scopes.cc

Issue 1224793002: Loads and stores to global vars are now made via property cell shortcuts installed into parent scri… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressing comments Created 5 years, 5 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
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/messages.h" 9 #include "src/messages.h"
10 #include "src/parser.h" 10 #include "src/parser.h"
11 #include "src/scopeinfo.h" 11 #include "src/scopeinfo.h"
12 #include "src/scopes.h" 12 #include "src/scopes.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 16
17 // TODO(ishell): remove this once compiler support is landed.
18 bool enable_context_globals = false;
19
20 // ---------------------------------------------------------------------------- 17 // ----------------------------------------------------------------------------
21 // Implementation of LocalsMap 18 // Implementation of LocalsMap
22 // 19 //
23 // Note: We are storing the handle locations as key values in the hash map. 20 // Note: We are storing the handle locations as key values in the hash map.
24 // When inserting a new variable via Declare(), we rely on the fact that 21 // When inserting a new variable via Declare(), we rely on the fact that
25 // the handle location remains alive for the duration of that variable 22 // the handle location remains alive for the duration of that variable
26 // use. Because a Variable holding a handle with the same location exists 23 // use. Because a Variable holding a handle with the same location exists
27 // this is ensured. 24 // this is ensured.
28 25
29 VariableMap::VariableMap(Zone* zone) 26 VariableMap::VariableMap(Zone* zone)
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 AllocateStackSlot(var); 1468 AllocateStackSlot(var);
1472 } 1469 }
1473 } 1470 }
1474 } 1471 }
1475 1472
1476 1473
1477 void Scope::AllocateDeclaredGlobal(Isolate* isolate, Variable* var) { 1474 void Scope::AllocateDeclaredGlobal(Isolate* isolate, Variable* var) {
1478 DCHECK(var->scope() == this); 1475 DCHECK(var->scope() == this);
1479 DCHECK(!var->IsVariable(isolate->factory()->dot_result_string()) || 1476 DCHECK(!var->IsVariable(isolate->factory()->dot_result_string()) ||
1480 !var->IsStackLocal()); 1477 !var->IsStackLocal());
1481 if (var->IsUnallocated() && var->IsStaticGlobalObjectProperty()) { 1478 if (var->IsUnallocated()) {
1482 DCHECK_EQ(-1, var->index()); 1479 if (var->IsStaticGlobalObjectProperty()) {
1483 DCHECK(var->name()->IsString()); 1480 DCHECK_EQ(-1, var->index());
1484 var->AllocateTo(VariableLocation::GLOBAL, num_heap_slots_); 1481 DCHECK(var->name()->IsString());
1485 num_global_slots_++; 1482 var->AllocateTo(VariableLocation::GLOBAL, num_heap_slots_);
1486 // Each global variable occupies two slots in the context: for reads 1483 num_global_slots_++;
1487 // and writes. 1484 // Each global variable occupies two slots in the context: for reads
1488 num_heap_slots_ += 2; 1485 // and writes.
1486 num_heap_slots_ += 2;
1487 } else {
1488 // There must be only DYNAMIC_GLOBAL in the script scope.
1489 DCHECK(!is_script_scope() || DYNAMIC_GLOBAL == var->mode());
1490 }
1489 } 1491 }
1490 } 1492 }
1491 1493
1492 1494
1493 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals(Isolate* isolate) { 1495 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals(Isolate* isolate) {
1494 // All variables that have no rewrite yet are non-parameter locals. 1496 // All variables that have no rewrite yet are non-parameter locals.
1495 for (int i = 0; i < temps_.length(); i++) { 1497 for (int i = 0; i < temps_.length(); i++) {
1496 AllocateNonParameterLocal(isolate, temps_[i]); 1498 AllocateNonParameterLocal(isolate, temps_[i]);
1497 } 1499 }
1498 1500
1499 for (int i = 0; i < internals_.length(); i++) { 1501 for (int i = 0; i < internals_.length(); i++) {
1500 AllocateNonParameterLocal(isolate, internals_[i]); 1502 AllocateNonParameterLocal(isolate, internals_[i]);
1501 } 1503 }
1502 1504
1503 ZoneList<VarAndOrder> vars(variables_.occupancy(), zone()); 1505 ZoneList<VarAndOrder> vars(variables_.occupancy(), zone());
1504 for (VariableMap::Entry* p = variables_.Start(); 1506 for (VariableMap::Entry* p = variables_.Start();
1505 p != NULL; 1507 p != NULL;
1506 p = variables_.Next(p)) { 1508 p = variables_.Next(p)) {
1507 Variable* var = reinterpret_cast<Variable*>(p->value); 1509 Variable* var = reinterpret_cast<Variable*>(p->value);
1508 vars.Add(VarAndOrder(var, p->order), zone()); 1510 vars.Add(VarAndOrder(var, p->order), zone());
1509 } 1511 }
1510 vars.Sort(VarAndOrder::Compare); 1512 vars.Sort(VarAndOrder::Compare);
1511 int var_count = vars.length(); 1513 int var_count = vars.length();
1512 for (int i = 0; i < var_count; i++) { 1514 for (int i = 0; i < var_count; i++) {
1513 AllocateNonParameterLocal(isolate, vars[i].var()); 1515 AllocateNonParameterLocal(isolate, vars[i].var());
1514 } 1516 }
1515 1517
1516 if (enable_context_globals) { 1518 if (FLAG_global_var_shortcuts) {
1517 for (int i = 0; i < var_count; i++) { 1519 for (int i = 0; i < var_count; i++) {
1518 AllocateDeclaredGlobal(isolate, vars[i].var()); 1520 AllocateDeclaredGlobal(isolate, vars[i].var());
1519 } 1521 }
1520 } 1522 }
1521 1523
1522 // For now, function_ must be allocated at the very end. If it gets 1524 // For now, function_ must be allocated at the very end. If it gets
1523 // allocated in the context, it must be the last slot in the context, 1525 // allocated in the context, it must be the last slot in the context,
1524 // because of the current ScopeInfo implementation (see 1526 // because of the current ScopeInfo implementation (see
1525 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor). 1527 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor).
1526 if (function_ != nullptr) { 1528 if (function_ != nullptr) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 bool is_function_var_in_context = 1613 bool is_function_var_in_context =
1612 function_ != NULL && function_->proxy()->var()->IsContextSlot(); 1614 function_ != NULL && function_->proxy()->var()->IsContextSlot();
1613 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - 1615 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS -
1614 2 * num_global_slots() - (is_function_var_in_context ? 1 : 0); 1616 2 * num_global_slots() - (is_function_var_in_context ? 1 : 0);
1615 } 1617 }
1616 1618
1617 1619
1618 int Scope::ContextGlobalCount() const { return num_global_slots(); } 1620 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1619 } // namespace internal 1621 } // namespace internal
1620 } // namespace v8 1622 } // namespace v8
OLDNEW
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698