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/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 } | 210 } |
211 | 211 |
212 void Scope::SetDefaults() { | 212 void Scope::SetDefaults() { |
213 #ifdef DEBUG | 213 #ifdef DEBUG |
214 scope_name_ = nullptr; | 214 scope_name_ = nullptr; |
215 already_resolved_ = false; | 215 already_resolved_ = false; |
216 #endif | 216 #endif |
217 inner_scope_ = nullptr; | 217 inner_scope_ = nullptr; |
218 sibling_ = nullptr; | 218 sibling_ = nullptr; |
219 unresolved_ = nullptr; | 219 unresolved_ = nullptr; |
220 dynamics_ = nullptr; | |
221 | 220 |
222 start_position_ = kNoSourcePosition; | 221 start_position_ = kNoSourcePosition; |
223 end_position_ = kNoSourcePosition; | 222 end_position_ = kNoSourcePosition; |
224 | 223 |
225 num_stack_slots_ = 0; | 224 num_stack_slots_ = 0; |
226 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; | 225 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; |
227 num_global_slots_ = 0; | 226 num_global_slots_ = 0; |
228 | 227 |
229 set_language_mode(SLOPPY); | 228 set_language_mode(SLOPPY); |
230 | 229 |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 comma = true; | 1069 comma = true; |
1071 } | 1070 } |
1072 if (var->maybe_assigned() == kMaybeAssigned) { | 1071 if (var->maybe_assigned() == kMaybeAssigned) { |
1073 if (comma) PrintF(", "); | 1072 if (comma) PrintF(", "); |
1074 PrintF("maybe assigned"); | 1073 PrintF("maybe assigned"); |
1075 } | 1074 } |
1076 PrintF("\n"); | 1075 PrintF("\n"); |
1077 } | 1076 } |
1078 } | 1077 } |
1079 | 1078 |
1080 | 1079 static void PrintMap(int indent, VariableMap* map, bool locals) { |
1081 static void PrintMap(int indent, VariableMap* map) { | 1080 for (VariableMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) { |
1082 for (VariableMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) { | |
1083 Variable* var = reinterpret_cast<Variable*>(p->value); | 1081 Variable* var = reinterpret_cast<Variable*>(p->value); |
1084 if (var == NULL) { | 1082 bool local = !IsDynamicVariableMode(var->mode()); |
1085 Indent(indent, "<?>\n"); | 1083 if (locals ? local : !local) { |
1086 } else { | 1084 if (var == nullptr) { |
1087 PrintVar(indent, var); | 1085 Indent(indent, "<?>\n"); |
| 1086 } else { |
| 1087 PrintVar(indent, var); |
| 1088 } |
1088 } | 1089 } |
1089 } | 1090 } |
1090 } | 1091 } |
1091 | 1092 |
1092 void DeclarationScope::PrintParameters() { | 1093 void DeclarationScope::PrintParameters() { |
1093 PrintF(" ("); | 1094 PrintF(" ("); |
1094 for (int i = 0; i < params_.length(); i++) { | 1095 for (int i = 0; i < params_.length(); i++) { |
1095 if (i > 0) PrintF(", "); | 1096 if (i > 0) PrintF(", "); |
1096 const AstRawString* name = params_[i]->raw_name(); | 1097 const AstRawString* name = params_[i]->raw_name(); |
1097 if (name->IsEmpty()) | 1098 if (name->IsEmpty()) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 if (!printed_header) { | 1167 if (!printed_header) { |
1167 printed_header = true; | 1168 printed_header = true; |
1168 Indent(n1, "// temporary vars:\n"); | 1169 Indent(n1, "// temporary vars:\n"); |
1169 } | 1170 } |
1170 PrintVar(n1, (*temps)[i]); | 1171 PrintVar(n1, (*temps)[i]); |
1171 } | 1172 } |
1172 } | 1173 } |
1173 | 1174 |
1174 if (variables_.Start() != NULL) { | 1175 if (variables_.Start() != NULL) { |
1175 Indent(n1, "// local vars:\n"); | 1176 Indent(n1, "// local vars:\n"); |
1176 PrintMap(n1, &variables_); | 1177 PrintMap(n1, &variables_, true); |
1177 } | |
1178 | 1178 |
1179 if (dynamics_ != NULL) { | |
1180 Indent(n1, "// dynamic vars:\n"); | 1179 Indent(n1, "// dynamic vars:\n"); |
1181 PrintMap(n1, dynamics_->GetMap(DYNAMIC)); | 1180 PrintMap(n1, &variables_, false); |
1182 PrintMap(n1, dynamics_->GetMap(DYNAMIC_LOCAL)); | |
1183 PrintMap(n1, dynamics_->GetMap(DYNAMIC_GLOBAL)); | |
1184 } | 1181 } |
1185 | 1182 |
1186 // Print inner scopes (disable by providing negative n). | 1183 // Print inner scopes (disable by providing negative n). |
1187 if (n >= 0) { | 1184 if (n >= 0) { |
1188 for (Scope* scope = inner_scope_; scope != nullptr; | 1185 for (Scope* scope = inner_scope_; scope != nullptr; |
1189 scope = scope->sibling_) { | 1186 scope = scope->sibling_) { |
1190 PrintF("\n"); | 1187 PrintF("\n"); |
1191 scope->Print(n1); | 1188 scope->Print(n1); |
1192 } | 1189 } |
1193 } | 1190 } |
(...skipping 14 matching lines...) Expand all Loading... |
1208 } | 1205 } |
1209 | 1206 |
1210 void Scope::CheckZones() { | 1207 void Scope::CheckZones() { |
1211 for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { | 1208 for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { |
1212 CHECK_EQ(scope->zone(), zone()); | 1209 CHECK_EQ(scope->zone(), zone()); |
1213 } | 1210 } |
1214 } | 1211 } |
1215 #endif // DEBUG | 1212 #endif // DEBUG |
1216 | 1213 |
1217 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) { | 1214 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) { |
1218 if (dynamics_ == NULL) dynamics_ = new (zone()) DynamicScopePart(zone()); | 1215 // Declare a new non-local. |
1219 VariableMap* map = dynamics_->GetMap(mode); | 1216 DCHECK(IsDynamicVariableMode(mode)); |
1220 Variable* var = map->Lookup(name); | 1217 Variable* var = variables_.Declare(zone(), NULL, name, mode, Variable::NORMAL, |
1221 if (var == NULL) { | 1218 kCreatedInitialized); |
1222 // Declare a new non-local. | 1219 // Allocate it by giving it a dynamic lookup. |
1223 DCHECK(!IsLexicalVariableMode(mode)); | 1220 var->AllocateTo(VariableLocation::LOOKUP, -1); |
1224 var = map->Declare(zone(), NULL, name, mode, Variable::NORMAL, | |
1225 kCreatedInitialized); | |
1226 // Allocate it by giving it a dynamic lookup. | |
1227 var->AllocateTo(VariableLocation::LOOKUP, -1); | |
1228 } | |
1229 return var; | 1221 return var; |
1230 } | 1222 } |
1231 | 1223 |
1232 Variable* Scope::LookupRecursive(VariableProxy* proxy, bool declare_free, | 1224 Variable* Scope::LookupRecursive(VariableProxy* proxy, bool declare_free, |
1233 Scope* outer_scope_end) { | 1225 Scope* outer_scope_end) { |
1234 DCHECK_NE(outer_scope_end, this); | 1226 DCHECK_NE(outer_scope_end, this); |
1235 // Short-cut: whenever we find a debug-evaluate scope, just look everything up | 1227 // Short-cut: whenever we find a debug-evaluate scope, just look everything up |
1236 // dynamically. Debug-evaluate doesn't properly create scope info for the | 1228 // dynamically. Debug-evaluate doesn't properly create scope info for the |
1237 // lookups it does. It may not have a valid 'this' declaration, and anything | 1229 // lookups it does. It may not have a valid 'this' declaration, and anything |
1238 // accessed through debug-evaluate might invalidly resolve to stack-allocated | 1230 // accessed through debug-evaluate might invalidly resolve to stack-allocated |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 function != nullptr && function->IsContextSlot(); | 1673 function != nullptr && function->IsContextSlot(); |
1682 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1674 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
1683 (is_function_var_in_context ? 1 : 0); | 1675 (is_function_var_in_context ? 1 : 0); |
1684 } | 1676 } |
1685 | 1677 |
1686 | 1678 |
1687 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1679 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
1688 | 1680 |
1689 } // namespace internal | 1681 } // namespace internal |
1690 } // namespace v8 | 1682 } // namespace v8 |
OLD | NEW |