Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Side by Side Diff: src/scopes.cc

Issue 24023: Rearrange the code in Scope::ResolveVariable.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 // We are not inside a local 'with' statement. 601 // We are not inside a local 'with' statement.
602 602
603 if (var == NULL) { 603 if (var == NULL) {
604 // We did not find the variable. We have a global variable 604 // We did not find the variable. We have a global variable
605 // if we are in the global scope (we know already that we 605 // if we are in the global scope (we know already that we
606 // are outside a 'with' statement) or if there is no way 606 // are outside a 'with' statement) or if there is no way
607 // that the variable might be introduced dynamically (through 607 // that the variable might be introduced dynamically (through
608 // a local or outer eval() call, or an outer 'with' statement), 608 // a local or outer eval() call, or an outer 'with' statement),
609 // or we don't know about the outer scope (because we are 609 // or we don't know about the outer scope (because we are
610 // in an eval scope). 610 // in an eval scope).
611 if (!is_global_scope() && 611 if (is_global_scope() ||
612 (scope_inside_with_ || outer_scope_is_eval_scope_)) { 612 !(scope_inside_with_ || outer_scope_is_eval_scope_ ||
613 // If we are inside a with statement or the code is executed 613 scope_calls_eval_ || outer_scope_calls_eval_)) {
614 // using eval, we give up and look up the variable at runtime.
615 var = NonLocal(proxy->name(), Variable::DYNAMIC);
616
617 } else if (!is_global_scope() &&
618 (scope_calls_eval_ || outer_scope_calls_eval_)) {
619 // If the code is not executed using eval and there are no
620 // with scopes, either we have a local or a global variable
621 // that might be shadowed by an eval-introduced variable.
622 if (invalidated_local != NULL) {
623 var = NonLocal(proxy->name(), Variable::DYNAMIC_LOCAL);
624 var->set_local_if_not_shadowed(invalidated_local);
625 } else {
626 var = NonLocal(proxy->name(), Variable::DYNAMIC_GLOBAL);
627 }
628
629 } else {
630 // We must have a global variable. 614 // We must have a global variable.
631 ASSERT(global_scope != NULL); 615 ASSERT(global_scope != NULL);
632 var = new Variable(global_scope, proxy->name(), 616 var = new Variable(global_scope, proxy->name(),
633 Variable::DYNAMIC, true, false); 617 Variable::DYNAMIC, true, false);
634 // Ideally we simply rewrite these variables into property 618 // Ideally we simply rewrite these variables into property
635 // accesses. Unfortunately, we cannot do this here at the 619 // accesses. Unfortunately, we cannot do this here at the
636 // moment because then we can't differentiate between 620 // moment because then we can't differentiate between
637 // global variable ('x') and global property ('this.x') access. 621 // global variable ('x') and global property ('this.x') access.
638 // If 'x' doesn't exist, the former leads to an error, while the 622 // If 'x' doesn't exist, the former leads to an error, while the
639 // latter returns undefined. Sigh... 623 // latter returns undefined. Sigh...
640 // var->rewrite_ = new Property(new Literal(env_->global()), 624 // var->rewrite_ = new Property(new Literal(env_->global()),
641 // new Literal(proxy->name())); 625 // new Literal(proxy->name()));
626
627 } else if (scope_inside_with_) {
628 // If we are inside a with statement we give up and look up
629 // the variable at runtime.
630 var = NonLocal(proxy->name(), Variable::DYNAMIC);
631
632 } else if (invalidated_local != NULL) {
633 // No with statements are involved and we found a local
634 // variable that might be shadowed by eval introduced
635 // variables.
636 var = NonLocal(proxy->name(), Variable::DYNAMIC_LOCAL);
637 var->set_local_if_not_shadowed(invalidated_local);
638
639 } else if (outer_scope_is_eval_scope_) {
640 // No with statements and we did not find a local and the code
641 // is executed with a call to eval. We don't know anything
642 // because we do not have information about the scopes
643 // surrounding the eval call.
644 var = NonLocal(proxy->name(), Variable::DYNAMIC);
645
646 } else {
647 // No with statements and we did not find a local and the code
648 // is not executed with a call to eval. We know that this
649 // variable is global unless it is shadowed by eval-introduced
650 // variables.
651 var = NonLocal(proxy->name(), Variable::DYNAMIC_GLOBAL);
642 } 652 }
643 } 653 }
644 } 654 }
645 655
646 proxy->BindTo(var); 656 proxy->BindTo(var);
647 } 657 }
648 658
649 659
650 void Scope::ResolveVariablesRecursively(Scope* global_scope) { 660 void Scope::ResolveVariablesRecursively(Scope* global_scope) {
651 ASSERT(global_scope == NULL || global_scope->is_global_scope()); 661 ASSERT(global_scope == NULL || global_scope->is_global_scope());
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS && 927 if (num_heap_slots_ == Context::MIN_CONTEXT_SLOTS &&
918 !must_have_local_context) { 928 !must_have_local_context) {
919 num_heap_slots_ = 0; 929 num_heap_slots_ = 0;
920 } 930 }
921 931
922 // Allocation done. 932 // Allocation done.
923 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS); 933 ASSERT(num_heap_slots_ == 0 || num_heap_slots_ >= Context::MIN_CONTEXT_SLOTS);
924 } 934 }
925 935
926 } } // namespace v8::internal 936 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/local-load-from-eval.js » ('j') | test/mjsunit/local-load-from-eval.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698