OLD | NEW |
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/ast/ast.h" | 10 #include "src/ast/ast.h" |
(...skipping 1324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1335 arguments_ = nullptr; | 1335 arguments_ = nullptr; |
1336 } | 1336 } |
1337 } | 1337 } |
1338 | 1338 |
1339 ResetAfterPreparsing(ast_node_factory->ast_value_factory(), false); | 1339 ResetAfterPreparsing(ast_node_factory->ast_value_factory(), false); |
1340 | 1340 |
1341 unresolved_ = unresolved; | 1341 unresolved_ = unresolved; |
1342 } | 1342 } |
1343 | 1343 |
1344 #ifdef DEBUG | 1344 #ifdef DEBUG |
1345 static const char* Header(ScopeType scope_type, FunctionKind function_kind, | 1345 namespace { |
1346 bool is_declaration_scope) { | 1346 |
| 1347 const char* Header(ScopeType scope_type, FunctionKind function_kind, |
| 1348 bool is_declaration_scope) { |
1347 switch (scope_type) { | 1349 switch (scope_type) { |
1348 case EVAL_SCOPE: return "eval"; | 1350 case EVAL_SCOPE: return "eval"; |
1349 // TODO(adamk): Should we print concise method scopes specially? | 1351 // TODO(adamk): Should we print concise method scopes specially? |
1350 case FUNCTION_SCOPE: | 1352 case FUNCTION_SCOPE: |
1351 if (IsGeneratorFunction(function_kind)) return "function*"; | 1353 if (IsGeneratorFunction(function_kind)) return "function*"; |
1352 if (IsAsyncFunction(function_kind)) return "async function"; | 1354 if (IsAsyncFunction(function_kind)) return "async function"; |
1353 if (IsArrowFunction(function_kind)) return "arrow"; | 1355 if (IsArrowFunction(function_kind)) return "arrow"; |
1354 return "function"; | 1356 return "function"; |
1355 case MODULE_SCOPE: return "module"; | 1357 case MODULE_SCOPE: return "module"; |
1356 case SCRIPT_SCOPE: return "global"; | 1358 case SCRIPT_SCOPE: return "global"; |
1357 case CATCH_SCOPE: return "catch"; | 1359 case CATCH_SCOPE: return "catch"; |
1358 case BLOCK_SCOPE: return is_declaration_scope ? "varblock" : "block"; | 1360 case BLOCK_SCOPE: return is_declaration_scope ? "varblock" : "block"; |
1359 case WITH_SCOPE: return "with"; | 1361 case WITH_SCOPE: return "with"; |
1360 } | 1362 } |
1361 UNREACHABLE(); | 1363 UNREACHABLE(); |
1362 return NULL; | 1364 return NULL; |
1363 } | 1365 } |
1364 | 1366 |
| 1367 void Indent(int n, const char* str) { PrintF("%*s%s", n, "", str); } |
1365 | 1368 |
1366 static void Indent(int n, const char* str) { | 1369 void PrintName(const AstRawString* name) { |
1367 PrintF("%*s%s", n, "", str); | |
1368 } | |
1369 | |
1370 | |
1371 static void PrintName(const AstRawString* name) { | |
1372 PrintF("%.*s", name->length(), name->raw_data()); | 1370 PrintF("%.*s", name->length(), name->raw_data()); |
1373 } | 1371 } |
1374 | 1372 |
1375 | 1373 void PrintLocation(Variable* var) { |
1376 static void PrintLocation(Variable* var) { | |
1377 switch (var->location()) { | 1374 switch (var->location()) { |
1378 case VariableLocation::UNALLOCATED: | 1375 case VariableLocation::UNALLOCATED: |
1379 break; | 1376 break; |
1380 case VariableLocation::PARAMETER: | 1377 case VariableLocation::PARAMETER: |
1381 PrintF("parameter[%d]", var->index()); | 1378 PrintF("parameter[%d]", var->index()); |
1382 break; | 1379 break; |
1383 case VariableLocation::LOCAL: | 1380 case VariableLocation::LOCAL: |
1384 PrintF("local[%d]", var->index()); | 1381 PrintF("local[%d]", var->index()); |
1385 break; | 1382 break; |
1386 case VariableLocation::CONTEXT: | 1383 case VariableLocation::CONTEXT: |
1387 PrintF("context[%d]", var->index()); | 1384 PrintF("context[%d]", var->index()); |
1388 break; | 1385 break; |
1389 case VariableLocation::LOOKUP: | 1386 case VariableLocation::LOOKUP: |
1390 PrintF("lookup"); | 1387 PrintF("lookup"); |
1391 break; | 1388 break; |
1392 case VariableLocation::MODULE: | 1389 case VariableLocation::MODULE: |
1393 PrintF("module"); | 1390 PrintF("module"); |
1394 break; | 1391 break; |
1395 } | 1392 } |
1396 } | 1393 } |
1397 | 1394 |
1398 | 1395 void PrintVar(int indent, Variable* var) { |
1399 static void PrintVar(int indent, Variable* var) { | 1396 Indent(indent, VariableMode2String(var->mode())); |
1400 if (var->is_used() || !var->IsUnallocated()) { | 1397 PrintF(" "); |
1401 Indent(indent, VariableMode2String(var->mode())); | 1398 if (var->raw_name()->IsEmpty()) |
1402 PrintF(" "); | 1399 PrintF(".%p", reinterpret_cast<void*>(var)); |
1403 if (var->raw_name()->IsEmpty()) | 1400 else |
1404 PrintF(".%p", reinterpret_cast<void*>(var)); | 1401 PrintName(var->raw_name()); |
1405 else | 1402 PrintF("; // "); |
1406 PrintName(var->raw_name()); | 1403 PrintLocation(var); |
1407 PrintF("; // "); | 1404 bool comma = !var->IsUnallocated(); |
1408 PrintLocation(var); | 1405 if (var->has_forced_context_allocation()) { |
1409 bool comma = !var->IsUnallocated(); | 1406 if (comma) PrintF(", "); |
1410 if (var->has_forced_context_allocation()) { | 1407 PrintF("forced context allocation"); |
1411 if (comma) PrintF(", "); | 1408 comma = true; |
1412 PrintF("forced context allocation"); | |
1413 comma = true; | |
1414 } | |
1415 if (var->maybe_assigned() == kNotAssigned) { | |
1416 if (comma) PrintF(", "); | |
1417 PrintF("never assigned"); | |
1418 } | |
1419 PrintF("\n"); | |
1420 } | 1409 } |
| 1410 if (var->maybe_assigned() == kNotAssigned) { |
| 1411 if (comma) PrintF(", "); |
| 1412 PrintF("never assigned"); |
| 1413 } |
| 1414 PrintF("\n"); |
1421 } | 1415 } |
1422 | 1416 |
1423 static void PrintMap(int indent, VariableMap* map, bool locals) { | 1417 void PrintMap(int indent, const char* label, VariableMap* map, bool locals, |
| 1418 Variable* function_var) { |
| 1419 bool printed_label = false; |
1424 for (VariableMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) { | 1420 for (VariableMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) { |
1425 Variable* var = reinterpret_cast<Variable*>(p->value); | 1421 Variable* var = reinterpret_cast<Variable*>(p->value); |
| 1422 if (var == function_var) continue; |
1426 bool local = !IsDynamicVariableMode(var->mode()); | 1423 bool local = !IsDynamicVariableMode(var->mode()); |
1427 if (locals ? local : !local) { | 1424 if ((locals ? local : !local) && |
1428 if (var == nullptr) { | 1425 (var->is_used() || !var->IsUnallocated())) { |
1429 Indent(indent, "<?>\n"); | 1426 if (!printed_label) { |
1430 } else { | 1427 Indent(indent, label); |
1431 PrintVar(indent, var); | 1428 printed_label = true; |
1432 } | 1429 } |
| 1430 PrintVar(indent, var); |
1433 } | 1431 } |
1434 } | 1432 } |
1435 } | 1433 } |
1436 | 1434 |
| 1435 } // anonymous namespace |
| 1436 |
1437 void DeclarationScope::PrintParameters() { | 1437 void DeclarationScope::PrintParameters() { |
1438 PrintF(" ("); | 1438 PrintF(" ("); |
1439 for (int i = 0; i < params_.length(); i++) { | 1439 for (int i = 0; i < params_.length(); i++) { |
1440 if (i > 0) PrintF(", "); | 1440 if (i > 0) PrintF(", "); |
1441 const AstRawString* name = params_[i]->raw_name(); | 1441 const AstRawString* name = params_[i]->raw_name(); |
1442 if (name->IsEmpty()) | 1442 if (name->IsEmpty()) |
1443 PrintF(".%p", reinterpret_cast<void*>(params_[i])); | 1443 PrintF(".%p", reinterpret_cast<void*>(params_[i])); |
1444 else | 1444 else |
1445 PrintName(name); | 1445 PrintName(name); |
1446 } | 1446 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1501 Indent(n1, "// "); | 1501 Indent(n1, "// "); |
1502 PrintF("%d heap slots\n", num_heap_slots_); | 1502 PrintF("%d heap slots\n", num_heap_slots_); |
1503 } | 1503 } |
1504 | 1504 |
1505 // Print locals. | 1505 // Print locals. |
1506 if (function != nullptr) { | 1506 if (function != nullptr) { |
1507 Indent(n1, "// function var:\n"); | 1507 Indent(n1, "// function var:\n"); |
1508 PrintVar(n1, function); | 1508 PrintVar(n1, function); |
1509 } | 1509 } |
1510 | 1510 |
1511 if (variables_.occupancy() != 0) { | 1511 PrintMap(n1, "// local vars:\n", &variables_, true, function); |
1512 Indent(n1, "// local vars:\n"); | 1512 PrintMap(n1, "// dynamic vars:\n", &variables_, false, function); |
1513 PrintMap(n1, &variables_, true); | |
1514 | |
1515 Indent(n1, "// dynamic vars:\n"); | |
1516 PrintMap(n1, &variables_, false); | |
1517 } | |
1518 | 1513 |
1519 // Print inner scopes (disable by providing negative n). | 1514 // Print inner scopes (disable by providing negative n). |
1520 if (n >= 0) { | 1515 if (n >= 0) { |
1521 for (Scope* scope = inner_scope_; scope != nullptr; | 1516 for (Scope* scope = inner_scope_; scope != nullptr; |
1522 scope = scope->sibling_) { | 1517 scope = scope->sibling_) { |
1523 PrintF("\n"); | 1518 PrintF("\n"); |
1524 scope->Print(n1); | 1519 scope->Print(n1); |
1525 } | 1520 } |
1526 } | 1521 } |
1527 | 1522 |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2069 Variable* function = | 2064 Variable* function = |
2070 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; | 2065 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; |
2071 bool is_function_var_in_context = | 2066 bool is_function_var_in_context = |
2072 function != nullptr && function->IsContextSlot(); | 2067 function != nullptr && function->IsContextSlot(); |
2073 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 2068 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
2074 (is_function_var_in_context ? 1 : 0); | 2069 (is_function_var_in_context ? 1 : 0); |
2075 } | 2070 } |
2076 | 2071 |
2077 } // namespace internal | 2072 } // namespace internal |
2078 } // namespace v8 | 2073 } // namespace v8 |
OLD | NEW |