OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 34 matching lines...) Loading... |
45 // | 45 // |
46 // Note: We are storing the handle locations as key values in the hash map. | 46 // Note: We are storing the handle locations as key values in the hash map. |
47 // When inserting a new variable via Declare(), we rely on the fact that | 47 // When inserting a new variable via Declare(), we rely on the fact that |
48 // the handle location remains alive for the duration of that variable | 48 // the handle location remains alive for the duration of that variable |
49 // use. Because a Variable holding a handle with the same location exists | 49 // use. Because a Variable holding a handle with the same location exists |
50 // this is ensured. | 50 // this is ensured. |
51 | 51 |
52 static bool Match(void* key1, void* key2) { | 52 static bool Match(void* key1, void* key2) { |
53 String* name1 = *reinterpret_cast<String**>(key1); | 53 String* name1 = *reinterpret_cast<String**>(key1); |
54 String* name2 = *reinterpret_cast<String**>(key2); | 54 String* name2 = *reinterpret_cast<String**>(key2); |
55 ASSERT(name1->IsSymbol()); | 55 ASSERT(name1->IsInternalizedString()); |
56 ASSERT(name2->IsSymbol()); | 56 ASSERT(name2->IsInternalizedString()); |
57 return name1 == name2; | 57 return name1 == name2; |
58 } | 58 } |
59 | 59 |
60 | 60 |
61 VariableMap::VariableMap(Zone* zone) | 61 VariableMap::VariableMap(Zone* zone) |
62 : ZoneHashMap(Match, 8, ZoneAllocationPolicy(zone)), | 62 : ZoneHashMap(Match, 8, ZoneAllocationPolicy(zone)), |
63 zone_(zone) {} | 63 zone_(zone) {} |
64 VariableMap::~VariableMap() {} | 64 VariableMap::~VariableMap() {} |
65 | 65 |
66 | 66 |
(...skipping 108 matching lines...) Loading... |
175 kCreatedInitialized); | 175 kCreatedInitialized); |
176 AllocateHeapSlot(variable); | 176 AllocateHeapSlot(variable); |
177 } | 177 } |
178 | 178 |
179 | 179 |
180 void Scope::SetDefaults(ScopeType type, | 180 void Scope::SetDefaults(ScopeType type, |
181 Scope* outer_scope, | 181 Scope* outer_scope, |
182 Handle<ScopeInfo> scope_info) { | 182 Handle<ScopeInfo> scope_info) { |
183 outer_scope_ = outer_scope; | 183 outer_scope_ = outer_scope; |
184 type_ = type; | 184 type_ = type; |
185 scope_name_ = isolate_->factory()->empty_symbol(); | 185 scope_name_ = isolate_->factory()->empty_string(); |
186 dynamics_ = NULL; | 186 dynamics_ = NULL; |
187 receiver_ = NULL; | 187 receiver_ = NULL; |
188 function_ = NULL; | 188 function_ = NULL; |
189 arguments_ = NULL; | 189 arguments_ = NULL; |
190 illegal_redecl_ = NULL; | 190 illegal_redecl_ = NULL; |
191 scope_inside_with_ = false; | 191 scope_inside_with_ = false; |
192 scope_contains_with_ = false; | 192 scope_contains_with_ = false; |
193 scope_calls_eval_ = false; | 193 scope_calls_eval_ = false; |
194 // Inherit the strict mode from the parent scope. | 194 // Inherit the strict mode from the parent scope. |
195 language_mode_ = (outer_scope != NULL) | 195 language_mode_ = (outer_scope != NULL) |
(...skipping 132 matching lines...) Loading... |
328 // Declare and allocate receiver (even for the global scope, and even | 328 // Declare and allocate receiver (even for the global scope, and even |
329 // if naccesses_ == 0). | 329 // if naccesses_ == 0). |
330 // NOTE: When loading parameters in the global scope, we must take | 330 // NOTE: When loading parameters in the global scope, we must take |
331 // care not to access them as properties of the global object, but | 331 // care not to access them as properties of the global object, but |
332 // instead load them directly from the stack. Currently, the only | 332 // instead load them directly from the stack. Currently, the only |
333 // such parameter is 'this' which is passed on the stack when | 333 // such parameter is 'this' which is passed on the stack when |
334 // invoking scripts | 334 // invoking scripts |
335 if (is_declaration_scope()) { | 335 if (is_declaration_scope()) { |
336 Variable* var = | 336 Variable* var = |
337 variables_.Declare(this, | 337 variables_.Declare(this, |
338 isolate_->factory()->this_symbol(), | 338 isolate_->factory()->this_string(), |
339 VAR, | 339 VAR, |
340 false, | 340 false, |
341 Variable::THIS, | 341 Variable::THIS, |
342 kCreatedInitialized); | 342 kCreatedInitialized); |
343 var->AllocateTo(Variable::PARAMETER, -1); | 343 var->AllocateTo(Variable::PARAMETER, -1); |
344 receiver_ = var; | 344 receiver_ = var; |
345 } else { | 345 } else { |
346 ASSERT(outer_scope() != NULL); | 346 ASSERT(outer_scope() != NULL); |
347 receiver_ = outer_scope()->receiver(); | 347 receiver_ = outer_scope()->receiver(); |
348 } | 348 } |
349 | 349 |
350 if (is_function_scope()) { | 350 if (is_function_scope()) { |
351 // Declare 'arguments' variable which exists in all functions. | 351 // Declare 'arguments' variable which exists in all functions. |
352 // Note that it might never be accessed, in which case it won't be | 352 // Note that it might never be accessed, in which case it won't be |
353 // allocated during variable allocation. | 353 // allocated during variable allocation. |
354 variables_.Declare(this, | 354 variables_.Declare(this, |
355 isolate_->factory()->arguments_symbol(), | 355 isolate_->factory()->arguments_string(), |
356 VAR, | 356 VAR, |
357 true, | 357 true, |
358 Variable::ARGUMENTS, | 358 Variable::ARGUMENTS, |
359 kCreatedInitialized); | 359 kCreatedInitialized); |
360 } | 360 } |
361 } | 361 } |
362 | 362 |
363 | 363 |
364 Scope* Scope::FinalizeBlockScope() { | 364 Scope* Scope::FinalizeBlockScope() { |
365 ASSERT(is_block_scope()); | 365 ASSERT(is_block_scope()); |
(...skipping 825 matching lines...) Loading... |
1191 return var->has_forced_context_allocation() || | 1191 return var->has_forced_context_allocation() || |
1192 scope_calls_eval_ || | 1192 scope_calls_eval_ || |
1193 inner_scope_calls_eval_ || | 1193 inner_scope_calls_eval_ || |
1194 scope_contains_with_; | 1194 scope_contains_with_; |
1195 } | 1195 } |
1196 | 1196 |
1197 | 1197 |
1198 bool Scope::HasArgumentsParameter() { | 1198 bool Scope::HasArgumentsParameter() { |
1199 for (int i = 0; i < params_.length(); i++) { | 1199 for (int i = 0; i < params_.length(); i++) { |
1200 if (params_[i]->name().is_identical_to( | 1200 if (params_[i]->name().is_identical_to( |
1201 isolate_->factory()->arguments_symbol())) { | 1201 isolate_->factory()->arguments_string())) { |
1202 return true; | 1202 return true; |
1203 } | 1203 } |
1204 } | 1204 } |
1205 return false; | 1205 return false; |
1206 } | 1206 } |
1207 | 1207 |
1208 | 1208 |
1209 void Scope::AllocateStackSlot(Variable* var) { | 1209 void Scope::AllocateStackSlot(Variable* var) { |
1210 var->AllocateTo(Variable::LOCAL, num_stack_slots_++); | 1210 var->AllocateTo(Variable::LOCAL, num_stack_slots_++); |
1211 } | 1211 } |
1212 | 1212 |
1213 | 1213 |
1214 void Scope::AllocateHeapSlot(Variable* var) { | 1214 void Scope::AllocateHeapSlot(Variable* var) { |
1215 var->AllocateTo(Variable::CONTEXT, num_heap_slots_++); | 1215 var->AllocateTo(Variable::CONTEXT, num_heap_slots_++); |
1216 } | 1216 } |
1217 | 1217 |
1218 | 1218 |
1219 void Scope::AllocateParameterLocals() { | 1219 void Scope::AllocateParameterLocals() { |
1220 ASSERT(is_function_scope()); | 1220 ASSERT(is_function_scope()); |
1221 Variable* arguments = LocalLookup(isolate_->factory()->arguments_symbol()); | 1221 Variable* arguments = LocalLookup(isolate_->factory()->arguments_string()); |
1222 ASSERT(arguments != NULL); // functions have 'arguments' declared implicitly | 1222 ASSERT(arguments != NULL); // functions have 'arguments' declared implicitly |
1223 | 1223 |
1224 bool uses_nonstrict_arguments = false; | 1224 bool uses_nonstrict_arguments = false; |
1225 | 1225 |
1226 if (MustAllocate(arguments) && !HasArgumentsParameter()) { | 1226 if (MustAllocate(arguments) && !HasArgumentsParameter()) { |
1227 // 'arguments' is used. Unless there is also a parameter called | 1227 // 'arguments' is used. Unless there is also a parameter called |
1228 // 'arguments', we must be conservative and allocate all parameters to | 1228 // 'arguments', we must be conservative and allocate all parameters to |
1229 // the context assuming they will be captured by the arguments object. | 1229 // the context assuming they will be captured by the arguments object. |
1230 // If we have a parameter named 'arguments', a (new) value is always | 1230 // If we have a parameter named 'arguments', a (new) value is always |
1231 // assigned to it via the function invocation. Then 'arguments' denotes | 1231 // assigned to it via the function invocation. Then 'arguments' denotes |
(...skipping 35 matching lines...) Loading... |
1267 var->AllocateTo(Variable::PARAMETER, i); | 1267 var->AllocateTo(Variable::PARAMETER, i); |
1268 } | 1268 } |
1269 } | 1269 } |
1270 } | 1270 } |
1271 } | 1271 } |
1272 } | 1272 } |
1273 | 1273 |
1274 | 1274 |
1275 void Scope::AllocateNonParameterLocal(Variable* var) { | 1275 void Scope::AllocateNonParameterLocal(Variable* var) { |
1276 ASSERT(var->scope() == this); | 1276 ASSERT(var->scope() == this); |
1277 ASSERT(!var->IsVariable(isolate_->factory()->result_symbol()) || | 1277 ASSERT(!var->IsVariable(isolate_->factory()->result_string()) || |
1278 !var->IsStackLocal()); | 1278 !var->IsStackLocal()); |
1279 if (var->IsUnallocated() && MustAllocate(var)) { | 1279 if (var->IsUnallocated() && MustAllocate(var)) { |
1280 if (MustAllocateInContext(var)) { | 1280 if (MustAllocateInContext(var)) { |
1281 AllocateHeapSlot(var); | 1281 AllocateHeapSlot(var); |
1282 } else { | 1282 } else { |
1283 AllocateStackSlot(var); | 1283 AllocateStackSlot(var); |
1284 } | 1284 } |
1285 } | 1285 } |
1286 } | 1286 } |
1287 | 1287 |
(...skipping 64 matching lines...) Loading... |
1352 | 1352 |
1353 // Allocation done. | 1353 // Allocation done. |
1354 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); | 1354 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); |
1355 } | 1355 } |
1356 | 1356 |
1357 | 1357 |
1358 void Scope::AllocateModulesRecursively(Scope* host_scope) { | 1358 void Scope::AllocateModulesRecursively(Scope* host_scope) { |
1359 if (already_resolved()) return; | 1359 if (already_resolved()) return; |
1360 if (is_module_scope()) { | 1360 if (is_module_scope()) { |
1361 ASSERT(interface_->IsFrozen()); | 1361 ASSERT(interface_->IsFrozen()); |
1362 Handle<String> name = isolate_->factory()->LookupOneByteSymbol( | 1362 Handle<String> name = isolate_->factory()->InternalizeOneByteString( |
1363 STATIC_ASCII_VECTOR(".module")); | 1363 STATIC_ASCII_VECTOR(".module")); |
1364 ASSERT(module_var_ == NULL); | 1364 ASSERT(module_var_ == NULL); |
1365 module_var_ = host_scope->NewInternal(name); | 1365 module_var_ = host_scope->NewInternal(name); |
1366 ++host_scope->num_modules_; | 1366 ++host_scope->num_modules_; |
1367 } | 1367 } |
1368 | 1368 |
1369 for (int i = 0; i < inner_scopes_.length(); i++) { | 1369 for (int i = 0; i < inner_scopes_.length(); i++) { |
1370 Scope* inner_scope = inner_scopes_.at(i); | 1370 Scope* inner_scope = inner_scopes_.at(i); |
1371 inner_scope->AllocateModulesRecursively(host_scope); | 1371 inner_scope->AllocateModulesRecursively(host_scope); |
1372 } | 1372 } |
1373 } | 1373 } |
1374 | 1374 |
1375 | 1375 |
1376 int Scope::StackLocalCount() const { | 1376 int Scope::StackLocalCount() const { |
1377 return num_stack_slots() - | 1377 return num_stack_slots() - |
1378 (function_ != NULL && function_->proxy()->var()->IsStackLocal() ? 1 : 0); | 1378 (function_ != NULL && function_->proxy()->var()->IsStackLocal() ? 1 : 0); |
1379 } | 1379 } |
1380 | 1380 |
1381 | 1381 |
1382 int Scope::ContextLocalCount() const { | 1382 int Scope::ContextLocalCount() const { |
1383 if (num_heap_slots() == 0) return 0; | 1383 if (num_heap_slots() == 0) return 0; |
1384 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1384 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
1385 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); | 1385 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); |
1386 } | 1386 } |
1387 | 1387 |
1388 } } // namespace v8::internal | 1388 } } // namespace v8::internal |
OLD | NEW |