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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/scopes.h" | 7 #include "src/scopes.h" |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 PrintF("global : "); | 294 PrintF("global : "); |
295 top->interface()->Print(); | 295 top->interface()->Print(); |
296 } | 296 } |
297 #endif | 297 #endif |
298 | 298 |
299 info->PrepareForCompilation(scope); | 299 info->PrepareForCompilation(scope); |
300 return true; | 300 return true; |
301 } | 301 } |
302 | 302 |
303 | 303 |
304 void Scope::Initialize() { | 304 void Scope::Initialize(bool uninitialized_this) { |
305 DCHECK(!already_resolved()); | 305 DCHECK(!already_resolved()); |
306 | 306 |
307 // Add this scope as a new inner scope of the outer scope. | 307 // Add this scope as a new inner scope of the outer scope. |
308 if (outer_scope_ != NULL) { | 308 if (outer_scope_ != NULL) { |
309 outer_scope_->inner_scopes_.Add(this, zone()); | 309 outer_scope_->inner_scopes_.Add(this, zone()); |
310 scope_inside_with_ = outer_scope_->scope_inside_with_ || is_with_scope(); | 310 scope_inside_with_ = outer_scope_->scope_inside_with_ || is_with_scope(); |
311 } else { | 311 } else { |
312 scope_inside_with_ = is_with_scope(); | 312 scope_inside_with_ = is_with_scope(); |
313 } | 313 } |
314 | 314 |
315 // Declare convenience variables. | 315 // Declare convenience variables. |
316 // Declare and allocate receiver (even for the script scope, and even | 316 // Declare and allocate receiver (even for the script scope, and even |
317 // if naccesses_ == 0). | 317 // if naccesses_ == 0). |
318 // NOTE: When loading parameters in the script scope, we must take | 318 // NOTE: When loading parameters in the script scope, we must take |
319 // care not to access them as properties of the global object, but | 319 // care not to access them as properties of the global object, but |
320 // instead load them directly from the stack. Currently, the only | 320 // instead load them directly from the stack. Currently, the only |
321 // such parameter is 'this' which is passed on the stack when | 321 // such parameter is 'this' which is passed on the stack when |
322 // invoking scripts | 322 // invoking scripts |
323 if (is_declaration_scope()) { | 323 if (is_declaration_scope()) { |
324 Variable* var = | 324 DCHECK(!uninitialized_this || is_function_scope()); |
325 variables_.Declare(this, | 325 DCHECK(FLAG_experimental_classes || !uninitialized_this); |
326 ast_value_factory_->this_string(), | 326 Variable* var = variables_.Declare( |
327 VAR, | 327 this, ast_value_factory_->this_string(), |
328 false, | 328 uninitialized_this ? CONST : VAR, false, Variable::THIS, |
329 Variable::THIS, | 329 uninitialized_this ? kNeedsInitialization : kCreatedInitialized); |
330 kCreatedInitialized); | |
331 var->AllocateTo(Variable::PARAMETER, -1); | 330 var->AllocateTo(Variable::PARAMETER, -1); |
332 receiver_ = var; | 331 receiver_ = var; |
333 } else { | 332 } else { |
334 DCHECK(outer_scope() != NULL); | 333 DCHECK(outer_scope() != NULL); |
335 receiver_ = outer_scope()->receiver(); | 334 receiver_ = outer_scope()->receiver(); |
336 } | 335 } |
337 | 336 |
338 if (is_function_scope()) { | 337 if (is_function_scope()) { |
339 // Declare 'arguments' variable which exists in all functions. | 338 // Declare 'arguments' variable which exists in all functions. |
340 // Note that it might never be accessed, in which case it won't be | 339 // Note that it might never be accessed, in which case it won't be |
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 } | 1432 } |
1434 | 1433 |
1435 | 1434 |
1436 int Scope::ContextLocalCount() const { | 1435 int Scope::ContextLocalCount() const { |
1437 if (num_heap_slots() == 0) return 0; | 1436 if (num_heap_slots() == 0) return 0; |
1438 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1437 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
1439 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); | 1438 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); |
1440 } | 1439 } |
1441 | 1440 |
1442 } } // namespace v8::internal | 1441 } } // namespace v8::internal |
OLD | NEW |