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

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

Issue 2287173002: Replace CollectVariables with locals(), update callsites to walk locals instead (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: restore undefined handling Created 4 years, 3 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/ast/scopes.h ('k') | src/ast/variables.h » ('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/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 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 #endif 225 #endif
226 inner_scope_ = nullptr; 226 inner_scope_ = nullptr;
227 sibling_ = nullptr; 227 sibling_ = nullptr;
228 unresolved_ = nullptr; 228 unresolved_ = nullptr;
229 229
230 start_position_ = kNoSourcePosition; 230 start_position_ = kNoSourcePosition;
231 end_position_ = kNoSourcePosition; 231 end_position_ = kNoSourcePosition;
232 232
233 num_stack_slots_ = 0; 233 num_stack_slots_ = 0;
234 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; 234 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS;
235 num_global_slots_ = 0;
236 235
237 set_language_mode(SLOPPY); 236 set_language_mode(SLOPPY);
238 237
239 scope_calls_eval_ = false; 238 scope_calls_eval_ = false;
240 scope_nonlinear_ = false; 239 scope_nonlinear_ = false;
241 is_hidden_ = false; 240 is_hidden_ = false;
242 is_debug_evaluate_scope_ = false; 241 is_debug_evaluate_scope_ = false;
243 242
244 inner_scope_calls_eval_ = false; 243 inner_scope_calls_eval_ = false;
245 force_context_allocation_ = false; 244 force_context_allocation_ = false;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 script_scope->PropagateScopeInfo(); 332 script_scope->PropagateScopeInfo();
334 return innermost_scope; 333 return innermost_scope;
335 } 334 }
336 335
337 void Scope::DeserializeScopeInfo(Isolate* isolate, 336 void Scope::DeserializeScopeInfo(Isolate* isolate,
338 AstValueFactory* ast_value_factory) { 337 AstValueFactory* ast_value_factory) {
339 if (scope_info_.is_null()) return; 338 if (scope_info_.is_null()) return;
340 339
341 DCHECK(ThreadId::Current().Equals(isolate->thread_id())); 340 DCHECK(ThreadId::Current().Equals(isolate->thread_id()));
342 341
343 // Internalize context local & globals variables. 342 // Internalize context local variables.
344 for (int var = 0; var < scope_info_->ContextLocalCount() + 343 for (int var = 0; var < scope_info_->ContextLocalCount(); ++var) {
345 scope_info_->ContextGlobalCount();
346 ++var) {
347 Handle<String> name_handle(scope_info_->ContextLocalName(var), isolate); 344 Handle<String> name_handle(scope_info_->ContextLocalName(var), isolate);
348 const AstRawString* name = ast_value_factory->GetString(name_handle); 345 const AstRawString* name = ast_value_factory->GetString(name_handle);
349 int index = Context::MIN_CONTEXT_SLOTS + var; 346 int index = Context::MIN_CONTEXT_SLOTS + var;
350 VariableMode mode = scope_info_->ContextLocalMode(var); 347 VariableMode mode = scope_info_->ContextLocalMode(var);
351 InitializationFlag init_flag = scope_info_->ContextLocalInitFlag(var); 348 InitializationFlag init_flag = scope_info_->ContextLocalInitFlag(var);
352 MaybeAssignedFlag maybe_assigned_flag = 349 MaybeAssignedFlag maybe_assigned_flag =
353 scope_info_->ContextLocalMaybeAssignedFlag(var); 350 scope_info_->ContextLocalMaybeAssignedFlag(var);
354 VariableLocation location = var < scope_info_->ContextLocalCount() 351 VariableLocation location = VariableLocation::CONTEXT;
355 ? VariableLocation::CONTEXT
356 : VariableLocation::GLOBAL;
357 Variable::Kind kind = Variable::NORMAL; 352 Variable::Kind kind = Variable::NORMAL;
358 if (index == scope_info_->ReceiverContextSlotIndex()) { 353 if (index == scope_info_->ReceiverContextSlotIndex()) {
359 kind = Variable::THIS; 354 kind = Variable::THIS;
360 } 355 }
361 356
362 Variable* result = variables_.Declare(zone(), this, name, mode, kind, 357 Variable* result = variables_.Declare(zone(), this, name, mode, kind,
363 init_flag, maybe_assigned_flag); 358 init_flag, maybe_assigned_flag);
364 result->AllocateTo(location, index); 359 result->AllocateTo(location, index);
365 } 360 }
366 361
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 // There should be no local slot with the given name. 591 // There should be no local slot with the given name.
597 DCHECK_LT(scope_info_->StackSlotIndex(*name_handle), 0); 592 DCHECK_LT(scope_info_->StackSlotIndex(*name_handle), 0);
598 593
599 VariableMode mode; 594 VariableMode mode;
600 InitializationFlag init_flag; 595 InitializationFlag init_flag;
601 MaybeAssignedFlag maybe_assigned_flag; 596 MaybeAssignedFlag maybe_assigned_flag;
602 597
603 VariableLocation location = VariableLocation::CONTEXT; 598 VariableLocation location = VariableLocation::CONTEXT;
604 int index = ScopeInfo::ContextSlotIndex(scope_info_, name_handle, &mode, 599 int index = ScopeInfo::ContextSlotIndex(scope_info_, name_handle, &mode,
605 &init_flag, &maybe_assigned_flag); 600 &init_flag, &maybe_assigned_flag);
606 if (index < 0) {
607 location = VariableLocation::GLOBAL;
608 index = ScopeInfo::ContextGlobalSlotIndex(scope_info_, name_handle, &mode,
609 &init_flag, &maybe_assigned_flag);
610 DCHECK(index < 0 || (is_script_scope() && mode == VAR));
611 }
612 if (index < 0 && scope_type() == MODULE_SCOPE) { 601 if (index < 0 && scope_type() == MODULE_SCOPE) {
613 location = VariableLocation::MODULE; 602 location = VariableLocation::MODULE;
614 index = -1; // TODO(neis): Find module variables in scope info. 603 index = -1; // TODO(neis): Find module variables in scope info.
615 } 604 }
616 if (index < 0) return nullptr; // Nowhere found. 605 if (index < 0) return nullptr; // Nowhere found.
617 606
618 Variable::Kind kind = Variable::NORMAL; 607 Variable::Kind kind = Variable::NORMAL;
619 if (location == VariableLocation::CONTEXT && 608 if (location == VariableLocation::CONTEXT &&
620 index == scope_info_->ReceiverContextSlotIndex()) { 609 index == scope_info_->ReceiverContextSlotIndex()) {
621 kind = Variable::THIS; 610 kind = Variable::THIS;
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 if (decls_[j]->proxy()->raw_name() == name) { 772 if (decls_[j]->proxy()->raw_name() == name) {
784 return decls_[j]; 773 return decls_[j];
785 } 774 }
786 } 775 }
787 DCHECK(false); 776 DCHECK(false);
788 } 777 }
789 } 778 }
790 return nullptr; 779 return nullptr;
791 } 780 }
792 781
793 void Scope::CollectVariables(ZoneList<Variable*>* stack_locals,
794 ZoneList<Variable*>* context_locals,
795 ZoneList<Variable*>* context_globals) {
796 // TODO(verwaest): Just pass out locals_ directly and walk it?
797 DCHECK_NOT_NULL(stack_locals);
798 DCHECK_NOT_NULL(context_locals);
799 DCHECK_NOT_NULL(context_globals);
800
801 for (int i = 0; i < locals_.length(); i++) {
802 Variable* var = locals_[i];
803 if (var->IsStackLocal()) {
804 stack_locals->Add(var, zone());
805 } else if (var->IsContextSlot()) {
806 context_locals->Add(var, zone());
807 } else if (var->IsGlobalSlot()) {
808 context_globals->Add(var, zone());
809 }
810 }
811 }
812
813 void DeclarationScope::AllocateVariables(ParseInfo* info) { 782 void DeclarationScope::AllocateVariables(ParseInfo* info) {
814 // 1) Propagate scope information. 783 // 1) Propagate scope information.
815 PropagateScopeInfo(); 784 PropagateScopeInfo();
816 785
817 // 2) Resolve variables. 786 // 2) Resolve variables.
818 ResolveVariablesRecursively(info); 787 ResolveVariablesRecursively(info);
819 788
820 // 3) Allocate variables. 789 // 3) Allocate variables.
821 AllocateVariablesRecursively(); 790 AllocateVariablesRecursively();
822 } 791 }
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1109 if (is_declaration_scope() && AsDeclarationScope()->uses_super_property()) { 1078 if (is_declaration_scope() && AsDeclarationScope()->uses_super_property()) {
1110 Indent(n1, "// scope uses 'super' property\n"); 1079 Indent(n1, "// scope uses 'super' property\n");
1111 } 1080 }
1112 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); 1081 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n");
1113 if (num_stack_slots_ > 0) { 1082 if (num_stack_slots_ > 0) {
1114 Indent(n1, "// "); 1083 Indent(n1, "// ");
1115 PrintF("%d stack slots\n", num_stack_slots_); 1084 PrintF("%d stack slots\n", num_stack_slots_);
1116 } 1085 }
1117 if (num_heap_slots_ > 0) { 1086 if (num_heap_slots_ > 0) {
1118 Indent(n1, "// "); 1087 Indent(n1, "// ");
1119 PrintF("%d heap slots (including %d global slots)\n", num_heap_slots_, 1088 PrintF("%d heap slots\n", num_heap_slots_);
1120 num_global_slots_);
1121 } 1089 }
1122 1090
1123 // Print locals. 1091 // Print locals.
1124 if (function != nullptr) { 1092 if (function != nullptr) {
1125 Indent(n1, "// function var:\n"); 1093 Indent(n1, "// function var:\n");
1126 PrintVar(n1, function); 1094 PrintVar(n1, function);
1127 } 1095 }
1128 1096
1129 if (variables_.Start() != NULL) { 1097 if (variables_.Start() != NULL) {
1130 Indent(n1, "// local vars:\n"); 1098 Indent(n1, "// local vars:\n");
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 DCHECK(var->IsUnallocated() || var->IsContextSlot()); 1429 DCHECK(var->IsUnallocated() || var->IsContextSlot());
1462 if (var->IsUnallocated()) { 1430 if (var->IsUnallocated()) {
1463 AllocateHeapSlot(var); 1431 AllocateHeapSlot(var);
1464 } 1432 }
1465 } else { 1433 } else {
1466 DCHECK(var->IsUnallocated() || var->IsParameter()); 1434 DCHECK(var->IsUnallocated() || var->IsParameter());
1467 if (var->IsUnallocated()) { 1435 if (var->IsUnallocated()) {
1468 var->AllocateTo(VariableLocation::PARAMETER, index); 1436 var->AllocateTo(VariableLocation::PARAMETER, index);
1469 } 1437 }
1470 } 1438 }
1471 } else {
1472 DCHECK(!var->IsGlobalSlot());
1473 } 1439 }
1474 } 1440 }
1475 1441
1476 void DeclarationScope::AllocateReceiver() { 1442 void DeclarationScope::AllocateReceiver() {
1477 if (!has_this_declaration()) return; 1443 if (!has_this_declaration()) return;
1478 DCHECK_NOT_NULL(receiver()); 1444 DCHECK_NOT_NULL(receiver());
1479 DCHECK_EQ(receiver()->scope(), this); 1445 DCHECK_EQ(receiver()->scope(), this);
1480 AllocateParameter(receiver(), -1); 1446 AllocateParameter(receiver(), -1);
1481 } 1447 }
1482 1448
1483 void Scope::AllocateNonParameterLocal(Variable* var) { 1449 void Scope::AllocateNonParameterLocal(Variable* var) {
1484 DCHECK(var->scope() == this); 1450 DCHECK(var->scope() == this);
1485 if (var->IsUnallocated() && MustAllocate(var)) { 1451 if (var->IsUnallocated() && MustAllocate(var)) {
1486 if (MustAllocateInContext(var)) { 1452 if (MustAllocateInContext(var)) {
1487 AllocateHeapSlot(var); 1453 AllocateHeapSlot(var);
1488 } else { 1454 } else {
1489 AllocateStackSlot(var); 1455 AllocateStackSlot(var);
1490 } 1456 }
1491 } 1457 }
1492 } 1458 }
1493 1459
1494 void Scope::AllocateDeclaredGlobal(Variable* var) {
1495 DCHECK(var->scope() == this);
1496 if (var->IsUnallocated()) {
1497 if (var->IsStaticGlobalObjectProperty()) {
1498 DCHECK_EQ(-1, var->index());
1499 DCHECK(var->name()->IsString());
1500 var->AllocateTo(VariableLocation::GLOBAL, num_heap_slots_++);
1501 num_global_slots_++;
1502 } else {
1503 // There must be only DYNAMIC_GLOBAL in the script scope.
1504 DCHECK(!is_script_scope() || DYNAMIC_GLOBAL == var->mode());
1505 }
1506 }
1507 }
1508
1509 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals() { 1460 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals() {
1510 for (int i = 0; i < locals_.length(); i++) { 1461 for (int i = 0; i < locals_.length(); i++) {
1511 AllocateNonParameterLocal(locals_[i]); 1462 AllocateNonParameterLocal(locals_[i]);
1512 } 1463 }
1513 1464
1514 if (FLAG_global_var_shortcuts) {
1515 for (int i = 0; i < locals_.length(); i++) {
1516 AllocateDeclaredGlobal(locals_[i]);
1517 }
1518 }
1519
1520 if (is_declaration_scope()) { 1465 if (is_declaration_scope()) {
1521 AsDeclarationScope()->AllocateLocals(); 1466 AsDeclarationScope()->AllocateLocals();
1522 } 1467 }
1523 } 1468 }
1524 1469
1525 void DeclarationScope::AllocateLocals() { 1470 void DeclarationScope::AllocateLocals() {
1526 // For now, function_ must be allocated at the very end. If it gets 1471 // For now, function_ must be allocated at the very end. If it gets
1527 // allocated in the context, it must be the last slot in the context, 1472 // allocated in the context, it must be the last slot in the context,
1528 // because of the current ScopeInfo implementation (see 1473 // because of the current ScopeInfo implementation (see
1529 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor). 1474 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor).
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 (function != nullptr && function->IsStackLocal() ? 1 : 0); 1552 (function != nullptr && function->IsStackLocal() ? 1 : 0);
1608 } 1553 }
1609 1554
1610 1555
1611 int Scope::ContextLocalCount() const { 1556 int Scope::ContextLocalCount() const {
1612 if (num_heap_slots() == 0) return 0; 1557 if (num_heap_slots() == 0) return 0;
1613 Variable* function = 1558 Variable* function =
1614 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; 1559 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr;
1615 bool is_function_var_in_context = 1560 bool is_function_var_in_context =
1616 function != nullptr && function->IsContextSlot(); 1561 function != nullptr && function->IsContextSlot();
1617 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - 1562 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS -
1618 (is_function_var_in_context ? 1 : 0); 1563 (is_function_var_in_context ? 1 : 0);
1619 } 1564 }
1620 1565
1621
1622 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1623
1624 } // namespace internal 1566 } // namespace internal
1625 } // namespace v8 1567 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopes.h ('k') | src/ast/variables.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698