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

Side by Side Diff: runtime/vm/scopes.cc

Issue 1284103008: Clean up code capturing variables explicitly. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: use correct scope Created 5 years, 4 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
« no previous file with comments | « runtime/vm/parser.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/scopes.h" 5 #include "vm/scopes.h"
6 6
7 #include "vm/object.h" 7 #include "vm/object.h"
8 #include "vm/stack_frame.h" 8 #include "vm/stack_frame.h"
9 #include "vm/symbols.h" 9 #include "vm/symbols.h"
10 10
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 return NULL; 424 return NULL;
425 } 425 }
426 426
427 427
428 bool LocalScope::CaptureVariable(const String& name) { 428 bool LocalScope::CaptureVariable(const String& name) {
429 ASSERT(name.IsSymbol()); 429 ASSERT(name.IsSymbol());
430 LocalScope* current_scope = this; 430 LocalScope* current_scope = this;
431 while (current_scope != NULL) { 431 while (current_scope != NULL) {
432 LocalVariable* var = current_scope->LocalLookupVariable(name); 432 LocalVariable* var = current_scope->LocalLookupVariable(name);
433 if (var != NULL) { 433 if (var != NULL) {
434 if (var->owner()->function_level() != function_level()) { 434 var->set_is_captured();
435 var->set_is_captured();
436 }
437 // Insert aliases of the variable in intermediate scopes. 435 // Insert aliases of the variable in intermediate scopes.
438 LocalScope* intermediate_scope = this; 436 LocalScope* intermediate_scope = this;
439 while (intermediate_scope != current_scope) { 437 while (intermediate_scope != current_scope) {
440 intermediate_scope->variables_.Add(var); 438 intermediate_scope->variables_.Add(var);
441 ASSERT(var->owner() != intermediate_scope); // Item is an alias. 439 ASSERT(var->owner() != intermediate_scope); // Item is an alias.
442 intermediate_scope = intermediate_scope->parent(); 440 intermediate_scope = intermediate_scope->parent();
443 } 441 }
444 return true; 442 return true;
445 } 443 }
446 current_scope = current_scope->parent(); 444 current_scope = current_scope->parent();
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 bool found = false; 624 bool found = false;
627 for (intptr_t i = 0; i < num_variables(); i++) { 625 for (intptr_t i = 0; i < num_variables(); i++) {
628 if ((VariableAt(i)->name().raw() == Symbols::StackTraceVar().raw()) || 626 if ((VariableAt(i)->name().raw() == Symbols::StackTraceVar().raw()) ||
629 (VariableAt(i)->name().raw() == Symbols::ExceptionVar().raw()) || 627 (VariableAt(i)->name().raw() == Symbols::ExceptionVar().raw()) ||
630 (VariableAt(i)->name().raw() == Symbols::SavedTryContextVar().raw())) { 628 (VariableAt(i)->name().raw() == Symbols::SavedTryContextVar().raw())) {
631 // Don't capture those variables because the VM expects them to be on the 629 // Don't capture those variables because the VM expects them to be on the
632 // stack. 630 // stack.
633 continue; 631 continue;
634 } 632 }
635 found = CaptureVariable(VariableAt(i)->name()); 633 found = CaptureVariable(VariableAt(i)->name());
636 // Also manually set the variable as captured as CaptureVariable() does not
637 // handle capturing variables on the same scope level.
638 VariableAt(i)->set_is_captured();
639 ASSERT(found); 634 ASSERT(found);
640 } 635 }
641 if (sibling() != NULL) { sibling()->RecursivelyCaptureAllVariables(); } 636 if (sibling() != NULL) { sibling()->RecursivelyCaptureAllVariables(); }
642 if (child() != NULL) { child()->RecursivelyCaptureAllVariables(); } 637 if (child() != NULL) { child()->RecursivelyCaptureAllVariables(); }
643 } 638 }
644 639
645 640
646 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) { 641 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) {
647 static const intptr_t kNumCapturedVars = 1; 642 static const intptr_t kNumCapturedVars = 1;
648 643
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 return fixed_parameter_count - (index() - kParamEndSlotFromFp); 684 return fixed_parameter_count - (index() - kParamEndSlotFromFp);
690 } else { 685 } else {
691 // Shift negative indexes so that the lowest one is 0 (they are still 686 // Shift negative indexes so that the lowest one is 0 (they are still
692 // non-positive). 687 // non-positive).
693 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp); 688 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp);
694 } 689 }
695 } 690 }
696 691
697 692
698 } // namespace dart 693 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698