| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 // Declare a new non-local. | 533 // Declare a new non-local. |
| 534 var = map->Declare(NULL, name, mode, true, Variable::NORMAL); | 534 var = map->Declare(NULL, name, mode, true, Variable::NORMAL); |
| 535 // Allocate it by giving it a dynamic lookup. | 535 // Allocate it by giving it a dynamic lookup. |
| 536 var->rewrite_ = new Slot(var, Slot::LOOKUP, -1); | 536 var->rewrite_ = new Slot(var, Slot::LOOKUP, -1); |
| 537 } | 537 } |
| 538 return var; | 538 return var; |
| 539 } | 539 } |
| 540 | 540 |
| 541 | 541 |
| 542 // Lookup a variable starting with this scope. The result is either | 542 // Lookup a variable starting with this scope. The result is either |
| 543 // the statically resolved (local!) variable belonging to an outer scope, | 543 // the statically resolved variable belonging to an outer scope, or |
| 544 // or NULL. It may be NULL because a) we couldn't find a variable, or b) | 544 // NULL. It may be NULL because a) we couldn't find a variable, or b) |
| 545 // because the variable is just a guess (and may be shadowed by another | 545 // because the variable is just a guess (and may be shadowed by |
| 546 // variable that is introduced dynamically via an 'eval' call or a 'with' | 546 // another variable that is introduced dynamically via an 'eval' call |
| 547 // statement). | 547 // or a 'with' statement). |
| 548 Variable* Scope::LookupRecursive(Handle<String> name, | 548 Variable* Scope::LookupRecursive(Handle<String> name, |
| 549 bool inner_lookup, | 549 bool inner_lookup, |
| 550 Variable** invalidated_local) { | 550 Variable** invalidated_local) { |
| 551 // If we find a variable, but the current scope calls 'eval', the found | 551 // If we find a variable, but the current scope calls 'eval', the found |
| 552 // variable may not be the correct one (the 'eval' may introduce a | 552 // variable may not be the correct one (the 'eval' may introduce a |
| 553 // property with the same name). In that case, remember that the variable | 553 // property with the same name). In that case, remember that the variable |
| 554 // found is just a guess. | 554 // found is just a guess. |
| 555 bool guess = scope_calls_eval_; | 555 bool guess = scope_calls_eval_; |
| 556 | 556 |
| 557 // Try to find the variable in this scope. | 557 // Try to find the variable in this scope. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 if (var == NULL) | 591 if (var == NULL) |
| 592 return NULL; | 592 return NULL; |
| 593 } | 593 } |
| 594 | 594 |
| 595 ASSERT(var != NULL); | 595 ASSERT(var != NULL); |
| 596 | 596 |
| 597 // If this is a lookup from an inner scope, mark the variable. | 597 // If this is a lookup from an inner scope, mark the variable. |
| 598 if (inner_lookup) | 598 if (inner_lookup) |
| 599 var->is_accessed_from_inner_scope_ = true; | 599 var->is_accessed_from_inner_scope_ = true; |
| 600 | 600 |
| 601 // If the variable we have found is just a guess, invalidate the result. | 601 // If the variable we have found is just a guess, invalidate the |
| 602 // result. If the found variable is local, record that fact so we |
| 603 // can generate fast code to get it if it is not shadowed by eval. |
| 602 if (guess) { | 604 if (guess) { |
| 603 *invalidated_local = var; | 605 if (!var->is_global()) *invalidated_local = var; |
| 604 var = NULL; | 606 var = NULL; |
| 605 } | 607 } |
| 606 | 608 |
| 607 return var; | 609 return var; |
| 608 } | 610 } |
| 609 | 611 |
| 610 | 612 |
| 611 void Scope::ResolveVariable(Scope* global_scope, | 613 void Scope::ResolveVariable(Scope* global_scope, |
| 612 Handle<Context> context, | 614 Handle<Context> context, |
| 613 VariableProxy* proxy) { | 615 VariableProxy* proxy) { |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && | 955 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && |
| 954 !must_have_local_context) { | 956 !must_have_local_context) { |
| 955 num_heap_slots_ = 0; | 957 num_heap_slots_ = 0; |
| 956 } | 958 } |
| 957 | 959 |
| 958 // Allocation done. | 960 // Allocation done. |
| 959 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); | 961 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); |
| 960 } | 962 } |
| 961 | 963 |
| 962 } } // namespace v8::internal | 964 } } // namespace v8::internal |
| OLD | NEW |