| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 | 78 |
| 79 // Dummy constructor | 79 // Dummy constructor |
| 80 VariableMap::VariableMap(bool gotta_love_static_overloading) : HashMap() {} | 80 VariableMap::VariableMap(bool gotta_love_static_overloading) : HashMap() {} |
| 81 | 81 |
| 82 VariableMap::VariableMap() : HashMap(Match, &LocalsMapAllocator, 8) {} | 82 VariableMap::VariableMap() : HashMap(Match, &LocalsMapAllocator, 8) {} |
| 83 VariableMap::~VariableMap() {} | 83 VariableMap::~VariableMap() {} |
| 84 | 84 |
| 85 | 85 |
| 86 Variable* VariableMap::Declare(Scope* scope, | 86 Variable* VariableMap::Declare(Scope* scope, |
| 87 Handle<String> name, | 87 Handle<String> name, |
| 88 Variable::Mode mode, | 88 VariableMode mode, |
| 89 bool is_valid_lhs, | 89 bool is_valid_lhs, |
| 90 Variable::Kind kind) { | 90 Variable::Kind kind) { |
| 91 HashMap::Entry* p = HashMap::Lookup(name.location(), name->Hash(), true); | 91 HashMap::Entry* p = HashMap::Lookup(name.location(), name->Hash(), true); |
| 92 if (p->value == NULL) { | 92 if (p->value == NULL) { |
| 93 // The variable has not been declared yet -> insert it. | 93 // The variable has not been declared yet -> insert it. |
| 94 ASSERT(p->key == name.location()); | 94 ASSERT(p->key == name.location()); |
| 95 p->value = new Variable(scope, name, mode, is_valid_lhs, kind); | 95 p->value = new Variable(scope, name, mode, is_valid_lhs, kind); |
| 96 } | 96 } |
| 97 return reinterpret_cast<Variable*>(p->value); | 97 return reinterpret_cast<Variable*>(p->value); |
| 98 } | 98 } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 temps_(0), | 172 temps_(0), |
| 173 params_(0), | 173 params_(0), |
| 174 unresolved_(0), | 174 unresolved_(0), |
| 175 decls_(0), | 175 decls_(0), |
| 176 already_resolved_(true) { | 176 already_resolved_(true) { |
| 177 SetDefaults(CATCH_SCOPE, NULL, Handle<SerializedScopeInfo>::null()); | 177 SetDefaults(CATCH_SCOPE, NULL, Handle<SerializedScopeInfo>::null()); |
| 178 AddInnerScope(inner_scope); | 178 AddInnerScope(inner_scope); |
| 179 ++num_var_or_const_; | 179 ++num_var_or_const_; |
| 180 Variable* variable = variables_.Declare(this, | 180 Variable* variable = variables_.Declare(this, |
| 181 catch_variable_name, | 181 catch_variable_name, |
| 182 Variable::VAR, | 182 VAR, |
| 183 true, // Valid left-hand side. | 183 true, // Valid left-hand side. |
| 184 Variable::NORMAL); | 184 Variable::NORMAL); |
| 185 AllocateHeapSlot(variable); | 185 AllocateHeapSlot(variable); |
| 186 } | 186 } |
| 187 | 187 |
| 188 | 188 |
| 189 void Scope::SetDefaults(Type type, | 189 void Scope::SetDefaults(Type type, |
| 190 Scope* outer_scope, | 190 Scope* outer_scope, |
| 191 Handle<SerializedScopeInfo> scope_info) { | 191 Handle<SerializedScopeInfo> scope_info) { |
| 192 outer_scope_ = outer_scope; | 192 outer_scope_ = outer_scope; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 if (is_catch_scope() || is_block_scope()) { | 303 if (is_catch_scope() || is_block_scope()) { |
| 304 ASSERT(outer_scope() != NULL); | 304 ASSERT(outer_scope() != NULL); |
| 305 receiver_ = outer_scope()->receiver(); | 305 receiver_ = outer_scope()->receiver(); |
| 306 } else { | 306 } else { |
| 307 ASSERT(is_function_scope() || | 307 ASSERT(is_function_scope() || |
| 308 is_global_scope() || | 308 is_global_scope() || |
| 309 is_eval_scope()); | 309 is_eval_scope()); |
| 310 Variable* var = | 310 Variable* var = |
| 311 variables_.Declare(this, | 311 variables_.Declare(this, |
| 312 isolate_->factory()->this_symbol(), | 312 isolate_->factory()->this_symbol(), |
| 313 Variable::VAR, | 313 VAR, |
| 314 false, | 314 false, |
| 315 Variable::THIS); | 315 Variable::THIS); |
| 316 var->AllocateTo(Variable::PARAMETER, -1); | 316 var->AllocateTo(Variable::PARAMETER, -1); |
| 317 receiver_ = var; | 317 receiver_ = var; |
| 318 } | 318 } |
| 319 | 319 |
| 320 if (is_function_scope()) { | 320 if (is_function_scope()) { |
| 321 // Declare 'arguments' variable which exists in all functions. | 321 // Declare 'arguments' variable which exists in all functions. |
| 322 // Note that it might never be accessed, in which case it won't be | 322 // Note that it might never be accessed, in which case it won't be |
| 323 // allocated during variable allocation. | 323 // allocated during variable allocation. |
| 324 variables_.Declare(this, | 324 variables_.Declare(this, |
| 325 isolate_->factory()->arguments_symbol(), | 325 isolate_->factory()->arguments_symbol(), |
| 326 Variable::VAR, | 326 VAR, |
| 327 true, | 327 true, |
| 328 Variable::ARGUMENTS); | 328 Variable::ARGUMENTS); |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 | 331 |
| 332 | 332 |
| 333 Scope* Scope::FinalizeBlockScope() { | 333 Scope* Scope::FinalizeBlockScope() { |
| 334 ASSERT(is_block_scope()); | 334 ASSERT(is_block_scope()); |
| 335 ASSERT(temps_.is_empty()); | 335 ASSERT(temps_.is_empty()); |
| 336 ASSERT(params_.is_empty()); | 336 ASSERT(params_.is_empty()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 366 } | 366 } |
| 367 // If we have a serialized scope info, we might find the variable there. | 367 // If we have a serialized scope info, we might find the variable there. |
| 368 // | 368 // |
| 369 // We should never lookup 'arguments' in this scope as it is implicitly | 369 // We should never lookup 'arguments' in this scope as it is implicitly |
| 370 // present in every scope. | 370 // present in every scope. |
| 371 ASSERT(*name != *isolate_->factory()->arguments_symbol()); | 371 ASSERT(*name != *isolate_->factory()->arguments_symbol()); |
| 372 // There should be no local slot with the given name. | 372 // There should be no local slot with the given name. |
| 373 ASSERT(scope_info_->StackSlotIndex(*name) < 0); | 373 ASSERT(scope_info_->StackSlotIndex(*name) < 0); |
| 374 | 374 |
| 375 // Check context slot lookup. | 375 // Check context slot lookup. |
| 376 Variable::Mode mode; | 376 VariableMode mode; |
| 377 int index = scope_info_->ContextSlotIndex(*name, &mode); | 377 int index = scope_info_->ContextSlotIndex(*name, &mode); |
| 378 if (index < 0) { | 378 if (index < 0) { |
| 379 // Check parameters. | 379 // Check parameters. |
| 380 mode = Variable::VAR; | 380 mode = VAR; |
| 381 index = scope_info_->ParameterIndex(*name); | 381 index = scope_info_->ParameterIndex(*name); |
| 382 if (index < 0) { | 382 if (index < 0) { |
| 383 // Check the function name. | 383 // Check the function name. |
| 384 index = scope_info_->FunctionContextSlotIndex(*name); | 384 index = scope_info_->FunctionContextSlotIndex(*name); |
| 385 if (index < 0) return NULL; | 385 if (index < 0) return NULL; |
| 386 } | 386 } |
| 387 } | 387 } |
| 388 | 388 |
| 389 Variable* var = | 389 Variable* var = |
| 390 variables_.Declare(this, name, mode, true, Variable::NORMAL); | 390 variables_.Declare(this, name, mode, true, Variable::NORMAL); |
| 391 var->AllocateTo(Variable::CONTEXT, index); | 391 var->AllocateTo(Variable::CONTEXT, index); |
| 392 return var; | 392 return var; |
| 393 } | 393 } |
| 394 | 394 |
| 395 | 395 |
| 396 Variable* Scope::Lookup(Handle<String> name) { | 396 Variable* Scope::Lookup(Handle<String> name) { |
| 397 for (Scope* scope = this; | 397 for (Scope* scope = this; |
| 398 scope != NULL; | 398 scope != NULL; |
| 399 scope = scope->outer_scope()) { | 399 scope = scope->outer_scope()) { |
| 400 Variable* var = scope->LocalLookup(name); | 400 Variable* var = scope->LocalLookup(name); |
| 401 if (var != NULL) return var; | 401 if (var != NULL) return var; |
| 402 } | 402 } |
| 403 return NULL; | 403 return NULL; |
| 404 } | 404 } |
| 405 | 405 |
| 406 | 406 |
| 407 Variable* Scope::DeclareFunctionVar(Handle<String> name) { | 407 Variable* Scope::DeclareFunctionVar(Handle<String> name) { |
| 408 ASSERT(is_function_scope() && function_ == NULL); | 408 ASSERT(is_function_scope() && function_ == NULL); |
| 409 Variable* function_var = | 409 Variable* function_var = |
| 410 new Variable(this, name, Variable::CONST, true, Variable::NORMAL); | 410 new Variable(this, name, CONST, true, Variable::NORMAL); |
| 411 function_ = new(isolate_->zone()) VariableProxy(isolate_, function_var); | 411 function_ = new(isolate_->zone()) VariableProxy(isolate_, function_var); |
| 412 return function_var; | 412 return function_var; |
| 413 } | 413 } |
| 414 | 414 |
| 415 | 415 |
| 416 void Scope::DeclareParameter(Handle<String> name, Variable::Mode mode) { | 416 void Scope::DeclareParameter(Handle<String> name, VariableMode mode) { |
| 417 ASSERT(!already_resolved()); | 417 ASSERT(!already_resolved()); |
| 418 ASSERT(is_function_scope()); | 418 ASSERT(is_function_scope()); |
| 419 Variable* var = | 419 Variable* var = |
| 420 variables_.Declare(this, name, mode, true, Variable::NORMAL); | 420 variables_.Declare(this, name, mode, true, Variable::NORMAL); |
| 421 params_.Add(var); | 421 params_.Add(var); |
| 422 } | 422 } |
| 423 | 423 |
| 424 | 424 |
| 425 Variable* Scope::DeclareLocal(Handle<String> name, Variable::Mode mode) { | 425 Variable* Scope::DeclareLocal(Handle<String> name, VariableMode mode) { |
| 426 ASSERT(!already_resolved()); | 426 ASSERT(!already_resolved()); |
| 427 // This function handles VAR and CONST modes. DYNAMIC variables are | 427 // This function handles VAR and CONST modes. DYNAMIC variables are |
| 428 // introduces during variable allocation, INTERNAL variables are allocated | 428 // introduces during variable allocation, INTERNAL variables are allocated |
| 429 // explicitly, and TEMPORARY variables are allocated via NewTemporary(). | 429 // explicitly, and TEMPORARY variables are allocated via NewTemporary(). |
| 430 ASSERT(mode == Variable::VAR || | 430 ASSERT(mode == VAR || mode == CONST || mode == LET); |
| 431 mode == Variable::CONST || | |
| 432 mode == Variable::LET); | |
| 433 ++num_var_or_const_; | 431 ++num_var_or_const_; |
| 434 return variables_.Declare(this, name, mode, true, Variable::NORMAL); | 432 return variables_.Declare(this, name, mode, true, Variable::NORMAL); |
| 435 } | 433 } |
| 436 | 434 |
| 437 | 435 |
| 438 Variable* Scope::DeclareGlobal(Handle<String> name) { | 436 Variable* Scope::DeclareGlobal(Handle<String> name) { |
| 439 ASSERT(is_global_scope()); | 437 ASSERT(is_global_scope()); |
| 440 return variables_.Declare(this, name, Variable::DYNAMIC_GLOBAL, | 438 return variables_.Declare(this, name, DYNAMIC_GLOBAL, |
| 441 true, | 439 true, |
| 442 Variable::NORMAL); | 440 Variable::NORMAL); |
| 443 } | 441 } |
| 444 | 442 |
| 445 | 443 |
| 446 VariableProxy* Scope::NewUnresolved(Handle<String> name, | 444 VariableProxy* Scope::NewUnresolved(Handle<String> name, |
| 447 bool inside_with, | 445 bool inside_with, |
| 448 int position) { | 446 int position) { |
| 449 // Note that we must not share the unresolved variables with | 447 // Note that we must not share the unresolved variables with |
| 450 // the same name because they may be removed selectively via | 448 // the same name because they may be removed selectively via |
| (...skipping 15 matching lines...) Expand all Loading... |
| 466 return; | 464 return; |
| 467 } | 465 } |
| 468 } | 466 } |
| 469 } | 467 } |
| 470 | 468 |
| 471 | 469 |
| 472 Variable* Scope::NewTemporary(Handle<String> name) { | 470 Variable* Scope::NewTemporary(Handle<String> name) { |
| 473 ASSERT(!already_resolved()); | 471 ASSERT(!already_resolved()); |
| 474 Variable* var = new Variable(this, | 472 Variable* var = new Variable(this, |
| 475 name, | 473 name, |
| 476 Variable::TEMPORARY, | 474 TEMPORARY, |
| 477 true, | 475 true, |
| 478 Variable::NORMAL); | 476 Variable::NORMAL); |
| 479 temps_.Add(var); | 477 temps_.Add(var); |
| 480 return var; | 478 return var; |
| 481 } | 479 } |
| 482 | 480 |
| 483 | 481 |
| 484 void Scope::AddDeclaration(Declaration* declaration) { | 482 void Scope::AddDeclaration(Declaration* declaration) { |
| 485 decls_.Add(declaration); | 483 decls_.Add(declaration); |
| 486 } | 484 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 498 void Scope::VisitIllegalRedeclaration(AstVisitor* visitor) { | 496 void Scope::VisitIllegalRedeclaration(AstVisitor* visitor) { |
| 499 ASSERT(HasIllegalRedeclaration()); | 497 ASSERT(HasIllegalRedeclaration()); |
| 500 illegal_redecl_->Accept(visitor); | 498 illegal_redecl_->Accept(visitor); |
| 501 } | 499 } |
| 502 | 500 |
| 503 | 501 |
| 504 Declaration* Scope::CheckConflictingVarDeclarations() { | 502 Declaration* Scope::CheckConflictingVarDeclarations() { |
| 505 int length = decls_.length(); | 503 int length = decls_.length(); |
| 506 for (int i = 0; i < length; i++) { | 504 for (int i = 0; i < length; i++) { |
| 507 Declaration* decl = decls_[i]; | 505 Declaration* decl = decls_[i]; |
| 508 if (decl->mode() != Variable::VAR) continue; | 506 if (decl->mode() != VAR) continue; |
| 509 Handle<String> name = decl->proxy()->name(); | 507 Handle<String> name = decl->proxy()->name(); |
| 510 bool cond = true; | 508 bool cond = true; |
| 511 for (Scope* scope = decl->scope(); cond ; scope = scope->outer_scope_) { | 509 for (Scope* scope = decl->scope(); cond ; scope = scope->outer_scope_) { |
| 512 // There is a conflict if there exists a non-VAR binding. | 510 // There is a conflict if there exists a non-VAR binding. |
| 513 Variable* other_var = scope->variables_.Lookup(name); | 511 Variable* other_var = scope->variables_.Lookup(name); |
| 514 if (other_var != NULL && other_var->mode() != Variable::VAR) { | 512 if (other_var != NULL && other_var->mode() != VAR) { |
| 515 return decl; | 513 return decl; |
| 516 } | 514 } |
| 517 | 515 |
| 518 // Include declaration scope in the iteration but stop after. | 516 // Include declaration scope in the iteration but stop after. |
| 519 if (!scope->is_block_scope() && !scope->is_catch_scope()) cond = false; | 517 if (!scope->is_block_scope() && !scope->is_catch_scope()) cond = false; |
| 520 } | 518 } |
| 521 } | 519 } |
| 522 return NULL; | 520 return NULL; |
| 523 } | 521 } |
| 524 | 522 |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 Indent(n1, "// temporary vars\n"); | 770 Indent(n1, "// temporary vars\n"); |
| 773 for (int i = 0; i < temps_.length(); i++) { | 771 for (int i = 0; i < temps_.length(); i++) { |
| 774 PrintVar(n1, temps_[i]); | 772 PrintVar(n1, temps_[i]); |
| 775 } | 773 } |
| 776 | 774 |
| 777 Indent(n1, "// local vars\n"); | 775 Indent(n1, "// local vars\n"); |
| 778 PrintMap(n1, &variables_); | 776 PrintMap(n1, &variables_); |
| 779 | 777 |
| 780 Indent(n1, "// dynamic vars\n"); | 778 Indent(n1, "// dynamic vars\n"); |
| 781 if (dynamics_ != NULL) { | 779 if (dynamics_ != NULL) { |
| 782 PrintMap(n1, dynamics_->GetMap(Variable::DYNAMIC)); | 780 PrintMap(n1, dynamics_->GetMap(DYNAMIC)); |
| 783 PrintMap(n1, dynamics_->GetMap(Variable::DYNAMIC_LOCAL)); | 781 PrintMap(n1, dynamics_->GetMap(DYNAMIC_LOCAL)); |
| 784 PrintMap(n1, dynamics_->GetMap(Variable::DYNAMIC_GLOBAL)); | 782 PrintMap(n1, dynamics_->GetMap(DYNAMIC_GLOBAL)); |
| 785 } | 783 } |
| 786 | 784 |
| 787 // Print inner scopes (disable by providing negative n). | 785 // Print inner scopes (disable by providing negative n). |
| 788 if (n >= 0) { | 786 if (n >= 0) { |
| 789 for (int i = 0; i < inner_scopes_.length(); i++) { | 787 for (int i = 0; i < inner_scopes_.length(); i++) { |
| 790 PrintF("\n"); | 788 PrintF("\n"); |
| 791 inner_scopes_[i]->Print(n1); | 789 inner_scopes_[i]->Print(n1); |
| 792 } | 790 } |
| 793 } | 791 } |
| 794 | 792 |
| 795 Indent(n0, "}\n"); | 793 Indent(n0, "}\n"); |
| 796 } | 794 } |
| 797 #endif // DEBUG | 795 #endif // DEBUG |
| 798 | 796 |
| 799 | 797 |
| 800 Variable* Scope::NonLocal(Handle<String> name, Variable::Mode mode) { | 798 Variable* Scope::NonLocal(Handle<String> name, VariableMode mode) { |
| 801 if (dynamics_ == NULL) dynamics_ = new DynamicScopePart(); | 799 if (dynamics_ == NULL) dynamics_ = new DynamicScopePart(); |
| 802 VariableMap* map = dynamics_->GetMap(mode); | 800 VariableMap* map = dynamics_->GetMap(mode); |
| 803 Variable* var = map->Lookup(name); | 801 Variable* var = map->Lookup(name); |
| 804 if (var == NULL) { | 802 if (var == NULL) { |
| 805 // Declare a new non-local. | 803 // Declare a new non-local. |
| 806 var = map->Declare(NULL, name, mode, true, Variable::NORMAL); | 804 var = map->Declare(NULL, name, mode, true, Variable::NORMAL); |
| 807 // Allocate it by giving it a dynamic lookup. | 805 // Allocate it by giving it a dynamic lookup. |
| 808 var->AllocateTo(Variable::LOOKUP, -1); | 806 var->AllocateTo(Variable::LOOKUP, -1); |
| 809 } | 807 } |
| 810 return var; | 808 return var; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 Variable* invalidated_local = NULL; | 894 Variable* invalidated_local = NULL; |
| 897 Variable* var = LookupRecursive(proxy->name(), false, &invalidated_local); | 895 Variable* var = LookupRecursive(proxy->name(), false, &invalidated_local); |
| 898 | 896 |
| 899 if (proxy->inside_with()) { | 897 if (proxy->inside_with()) { |
| 900 // If we are inside a local 'with' statement, all bets are off | 898 // If we are inside a local 'with' statement, all bets are off |
| 901 // and we cannot resolve the proxy to a local variable even if | 899 // and we cannot resolve the proxy to a local variable even if |
| 902 // we found an outer matching variable. | 900 // we found an outer matching variable. |
| 903 // Note that we must do a lookup anyway, because if we find one, | 901 // Note that we must do a lookup anyway, because if we find one, |
| 904 // we must mark that variable as potentially accessed from this | 902 // we must mark that variable as potentially accessed from this |
| 905 // inner scope (the property may not be in the 'with' object). | 903 // inner scope (the property may not be in the 'with' object). |
| 906 var = NonLocal(proxy->name(), Variable::DYNAMIC); | 904 var = NonLocal(proxy->name(), DYNAMIC); |
| 907 | 905 |
| 908 } else { | 906 } else { |
| 909 // We are not inside a local 'with' statement. | 907 // We are not inside a local 'with' statement. |
| 910 | 908 |
| 911 if (var == NULL) { | 909 if (var == NULL) { |
| 912 // We did not find the variable. We have a global variable | 910 // We did not find the variable. We have a global variable |
| 913 // if we are in the global scope (we know already that we | 911 // if we are in the global scope (we know already that we |
| 914 // are outside a 'with' statement) or if there is no way | 912 // are outside a 'with' statement) or if there is no way |
| 915 // that the variable might be introduced dynamically (through | 913 // that the variable might be introduced dynamically (through |
| 916 // a local or outer eval() call, or an outer 'with' statement), | 914 // a local or outer eval() call, or an outer 'with' statement), |
| 917 // or we don't know about the outer scope (because we are | 915 // or we don't know about the outer scope (because we are |
| 918 // in an eval scope). | 916 // in an eval scope). |
| 919 if (is_global_scope() || | 917 if (is_global_scope() || |
| 920 !(scope_inside_with_ || outer_scope_is_eval_scope_ || | 918 !(scope_inside_with_ || outer_scope_is_eval_scope_ || |
| 921 scope_calls_eval_ || outer_scope_calls_eval_)) { | 919 scope_calls_eval_ || outer_scope_calls_eval_)) { |
| 922 // We must have a global variable. | 920 // We must have a global variable. |
| 923 ASSERT(global_scope != NULL); | 921 ASSERT(global_scope != NULL); |
| 924 var = global_scope->DeclareGlobal(proxy->name()); | 922 var = global_scope->DeclareGlobal(proxy->name()); |
| 925 | 923 |
| 926 } else if (scope_inside_with_) { | 924 } else if (scope_inside_with_) { |
| 927 // If we are inside a with statement we give up and look up | 925 // If we are inside a with statement we give up and look up |
| 928 // the variable at runtime. | 926 // the variable at runtime. |
| 929 var = NonLocal(proxy->name(), Variable::DYNAMIC); | 927 var = NonLocal(proxy->name(), DYNAMIC); |
| 930 | 928 |
| 931 } else if (invalidated_local != NULL) { | 929 } else if (invalidated_local != NULL) { |
| 932 // No with statements are involved and we found a local | 930 // No with statements are involved and we found a local |
| 933 // variable that might be shadowed by eval introduced | 931 // variable that might be shadowed by eval introduced |
| 934 // variables. | 932 // variables. |
| 935 var = NonLocal(proxy->name(), Variable::DYNAMIC_LOCAL); | 933 var = NonLocal(proxy->name(), DYNAMIC_LOCAL); |
| 936 var->set_local_if_not_shadowed(invalidated_local); | 934 var->set_local_if_not_shadowed(invalidated_local); |
| 937 | 935 |
| 938 } else if (outer_scope_is_eval_scope_) { | 936 } else if (outer_scope_is_eval_scope_) { |
| 939 // No with statements and we did not find a local and the code | 937 // No with statements and we did not find a local and the code |
| 940 // is executed with a call to eval. The context contains | 938 // is executed with a call to eval. The context contains |
| 941 // scope information that we can use to determine if the | 939 // scope information that we can use to determine if the |
| 942 // variable is global if it is not shadowed by eval-introduced | 940 // variable is global if it is not shadowed by eval-introduced |
| 943 // variables. | 941 // variables. |
| 944 if (context->GlobalIfNotShadowedByEval(proxy->name())) { | 942 if (context->GlobalIfNotShadowedByEval(proxy->name())) { |
| 945 var = NonLocal(proxy->name(), Variable::DYNAMIC_GLOBAL); | 943 var = NonLocal(proxy->name(), DYNAMIC_GLOBAL); |
| 946 | 944 |
| 947 } else { | 945 } else { |
| 948 var = NonLocal(proxy->name(), Variable::DYNAMIC); | 946 var = NonLocal(proxy->name(), DYNAMIC); |
| 949 } | 947 } |
| 950 | 948 |
| 951 } else { | 949 } else { |
| 952 // No with statements and we did not find a local and the code | 950 // No with statements and we did not find a local and the code |
| 953 // is not executed with a call to eval. We know that this | 951 // is not executed with a call to eval. We know that this |
| 954 // variable is global unless it is shadowed by eval-introduced | 952 // variable is global unless it is shadowed by eval-introduced |
| 955 // variables. | 953 // variables. |
| 956 var = NonLocal(proxy->name(), Variable::DYNAMIC_GLOBAL); | 954 var = NonLocal(proxy->name(), DYNAMIC_GLOBAL); |
| 957 } | 955 } |
| 958 } | 956 } |
| 959 } | 957 } |
| 960 | 958 |
| 961 proxy->BindTo(var); | 959 proxy->BindTo(var); |
| 962 } | 960 } |
| 963 | 961 |
| 964 | 962 |
| 965 void Scope::ResolveVariablesRecursively(Scope* global_scope, | 963 void Scope::ResolveVariablesRecursively(Scope* global_scope, |
| 966 Handle<Context> context) { | 964 Handle<Context> context) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 | 1031 |
| 1034 | 1032 |
| 1035 bool Scope::MustAllocateInContext(Variable* var) { | 1033 bool Scope::MustAllocateInContext(Variable* var) { |
| 1036 // If var is accessed from an inner scope, or if there is a possibility | 1034 // If var is accessed from an inner scope, or if there is a possibility |
| 1037 // that it might be accessed from the current or an inner scope (through | 1035 // that it might be accessed from the current or an inner scope (through |
| 1038 // an eval() call or a runtime with lookup), it must be allocated in the | 1036 // an eval() call or a runtime with lookup), it must be allocated in the |
| 1039 // context. | 1037 // context. |
| 1040 // | 1038 // |
| 1041 // Exceptions: temporary variables are never allocated in a context; | 1039 // Exceptions: temporary variables are never allocated in a context; |
| 1042 // catch-bound variables are always allocated in a context. | 1040 // catch-bound variables are always allocated in a context. |
| 1043 if (var->mode() == Variable::TEMPORARY) return false; | 1041 if (var->mode() == TEMPORARY) return false; |
| 1044 if (is_catch_scope() || is_block_scope()) return true; | 1042 if (is_catch_scope() || is_block_scope()) return true; |
| 1045 return var->is_accessed_from_inner_scope() || | 1043 return var->is_accessed_from_inner_scope() || |
| 1046 scope_calls_eval_ || | 1044 scope_calls_eval_ || |
| 1047 inner_scope_calls_eval_ || | 1045 inner_scope_calls_eval_ || |
| 1048 scope_contains_with_ || | 1046 scope_contains_with_ || |
| 1049 var->is_global(); | 1047 var->is_global(); |
| 1050 } | 1048 } |
| 1051 | 1049 |
| 1052 | 1050 |
| 1053 bool Scope::HasArgumentsParameter() { | 1051 bool Scope::HasArgumentsParameter() { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1199 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && | 1197 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && |
| 1200 !must_have_local_context) { | 1198 !must_have_local_context) { |
| 1201 num_heap_slots_ = 0; | 1199 num_heap_slots_ = 0; |
| 1202 } | 1200 } |
| 1203 | 1201 |
| 1204 // Allocation done. | 1202 // Allocation done. |
| 1205 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); | 1203 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); |
| 1206 } | 1204 } |
| 1207 | 1205 |
| 1208 } } // namespace v8::internal | 1206 } } // namespace v8::internal |
| OLD | NEW |