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

Side by Side Diff: vm/scopes.cc

Issue 10632009: Make the parser agnostic to the TokenStream implementation. This is the first step towards compacti… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 6 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
« no previous file with comments | « vm/scopes.h ('k') | vm/snapshot.h » ('j') | 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/ast.h" 7 #include "vm/ast.h"
8 #include "vm/bit_vector.h" 8 #include "vm/bit_vector.h"
9 #include "vm/object.h" 9 #include "vm/object.h"
10 #include "vm/parser.h" 10 #include "vm/parser.h"
(...skipping 12 matching lines...) Expand all
23 23
24 24
25 LocalScope::LocalScope(LocalScope* parent, int function_level, int loop_level) 25 LocalScope::LocalScope(LocalScope* parent, int function_level, int loop_level)
26 : parent_(parent), 26 : parent_(parent),
27 child_(NULL), 27 child_(NULL),
28 sibling_(NULL), 28 sibling_(NULL),
29 function_level_(function_level), 29 function_level_(function_level),
30 loop_level_(loop_level), 30 loop_level_(loop_level),
31 context_level_(LocalScope::kUnitializedContextLevel), 31 context_level_(LocalScope::kUnitializedContextLevel),
32 num_context_variables_(0), 32 num_context_variables_(0),
33 begin_token_index_(0), 33 begin_token_pos_(0),
34 end_token_index_(0), 34 end_token_pos_(0),
35 variables_(), 35 variables_(),
36 labels_() { 36 labels_() {
37 // Hook this node into the children of the parent, unless the parent has a 37 // Hook this node into the children of the parent, unless the parent has a
38 // different function_level, since the local scope of a nested function can 38 // different function_level, since the local scope of a nested function can
39 // be discarded after it has been parsed. 39 // be discarded after it has been parsed.
40 if ((parent != NULL) && (parent->function_level() == function_level)) { 40 if ((parent != NULL) && (parent->function_level() == function_level)) {
41 sibling_ = parent->child_; 41 sibling_ = parent->child_;
42 parent->child_ = this; 42 parent->child_ = this;
43 } 43 }
44 } 44 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 // First enter all variables from scopes of outer functions. 188 // First enter all variables from scopes of outer functions.
189 const ContextScope& context_scope = 189 const ContextScope& context_scope =
190 ContextScope::Handle(func.context_scope()); 190 ContextScope::Handle(func.context_scope());
191 if (!context_scope.IsNull()) { 191 if (!context_scope.IsNull()) {
192 ASSERT(func.IsLocalFunction()); 192 ASSERT(func.IsLocalFunction());
193 for (int i = 0; i < context_scope.num_variables(); i++) { 193 for (int i = 0; i < context_scope.num_variables(); i++) {
194 VarDesc desc; 194 VarDesc desc;
195 desc.name = &String::Handle(context_scope.NameAt(i)); 195 desc.name = &String::Handle(context_scope.NameAt(i));
196 desc.info.kind = RawLocalVarDescriptors::kContextVar; 196 desc.info.kind = RawLocalVarDescriptors::kContextVar;
197 desc.info.scope_id = context_scope.ContextLevelAt(i); 197 desc.info.scope_id = context_scope.ContextLevelAt(i);
198 desc.info.begin_pos = begin_token_index(); 198 desc.info.begin_pos = begin_token_pos();
199 desc.info.end_pos = end_token_index(); 199 desc.info.end_pos = end_token_pos();
200 desc.info.index = context_scope.ContextIndexAt(i); 200 desc.info.index = context_scope.ContextIndexAt(i);
201 vars.Add(desc); 201 vars.Add(desc);
202 } 202 }
203 } 203 }
204 // Now collect all variables from local scopes. 204 // Now collect all variables from local scopes.
205 int16_t scope_id = 0; 205 int16_t scope_id = 0;
206 CollectLocalVariables(&vars, &scope_id); 206 CollectLocalVariables(&vars, &scope_id);
207 207
208 const LocalVarDescriptors& var_desc = 208 const LocalVarDescriptors& var_desc =
209 LocalVarDescriptors::Handle(LocalVarDescriptors::New(vars.length())); 209 LocalVarDescriptors::Handle(LocalVarDescriptors::New(vars.length()));
(...skipping 12 matching lines...) Expand all
222 if (HasContextLevel() && 222 if (HasContextLevel() &&
223 ((parent() == NULL) || 223 ((parent() == NULL) ||
224 (!parent()->HasContextLevel()) || 224 (!parent()->HasContextLevel()) ||
225 (parent()->context_level() != context_level()))) { 225 (parent()->context_level() != context_level()))) {
226 // This is the outermost scope with a context level or this scope's 226 // This is the outermost scope with a context level or this scope's
227 // context level differes from its parent's level. 227 // context level differes from its parent's level.
228 VarDesc desc; 228 VarDesc desc;
229 desc.name = &String::Handle(); // No name. 229 desc.name = &String::Handle(); // No name.
230 desc.info.kind = RawLocalVarDescriptors::kContextLevel; 230 desc.info.kind = RawLocalVarDescriptors::kContextLevel;
231 desc.info.scope_id = *scope_id; 231 desc.info.scope_id = *scope_id;
232 desc.info.begin_pos = begin_token_index(); 232 desc.info.begin_pos = begin_token_pos();
233 desc.info.end_pos = end_token_index(); 233 desc.info.end_pos = end_token_pos();
234 desc.info.index = context_level(); 234 desc.info.index = context_level();
235 vars->Add(desc); 235 vars->Add(desc);
236 } 236 }
237 for (int i = 0; i < this->variables_.length(); i++) { 237 for (int i = 0; i < this->variables_.length(); i++) {
238 LocalVariable* var = variables_[i]; 238 LocalVariable* var = variables_[i];
239 if (var->owner() == this) { 239 if (var->owner() == this) {
240 if (Scanner::IsIdent(var->name())) { 240 if (Scanner::IsIdent(var->name())) {
241 // This is a regular Dart variable, either stack-based or captured. 241 // This is a regular Dart variable, either stack-based or captured.
242 VarDesc desc; 242 VarDesc desc;
243 desc.name = &var->name(); 243 desc.name = &var->name();
244 if (var->is_captured()) { 244 if (var->is_captured()) {
245 desc.info.kind = RawLocalVarDescriptors::kContextVar; 245 desc.info.kind = RawLocalVarDescriptors::kContextVar;
246 ASSERT(var->owner() != NULL); 246 ASSERT(var->owner() != NULL);
247 ASSERT(var->owner()->context_level() >= 0); 247 ASSERT(var->owner()->context_level() >= 0);
248 desc.info.scope_id = var->owner()->context_level(); 248 desc.info.scope_id = var->owner()->context_level();
249 } else { 249 } else {
250 desc.info.kind = RawLocalVarDescriptors::kStackVar; 250 desc.info.kind = RawLocalVarDescriptors::kStackVar;
251 desc.info.scope_id = *scope_id; 251 desc.info.scope_id = *scope_id;
252 } 252 }
253 desc.info.begin_pos = var->token_index(); 253 desc.info.begin_pos = var->token_pos();
254 desc.info.end_pos = var->owner()->end_token_index(); 254 desc.info.end_pos = var->owner()->end_token_pos();
255 desc.info.index = var->index(); 255 desc.info.index = var->index();
256 vars->Add(desc); 256 vars->Add(desc);
257 } else if (var->name().Equals(LocalVariable::kSavedContextVarName)) { 257 } else if (var->name().Equals(LocalVariable::kSavedContextVarName)) {
258 // This is the local variable in which the function saves the 258 // This is the local variable in which the function saves the
259 // caller's chain of closure contexts (caller's CTX register). 259 // caller's chain of closure contexts (caller's CTX register).
260 VarDesc desc; 260 VarDesc desc;
261 desc.name = &var->name(); 261 desc.name = &var->name();
262 desc.info.kind = RawLocalVarDescriptors::kContextChain; 262 desc.info.kind = RawLocalVarDescriptors::kContextChain;
263 desc.info.scope_id = 0; 263 desc.info.scope_id = 0;
264 desc.info.begin_pos = 0; 264 desc.info.begin_pos = 0;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 const ContextScope& context_scope = 444 const ContextScope& context_scope =
445 ContextScope::Handle(ContextScope::New(num_captured_vars)); 445 ContextScope::Handle(ContextScope::New(num_captured_vars));
446 446
447 // Create a descriptor for each referenced captured variable of enclosing 447 // Create a descriptor for each referenced captured variable of enclosing
448 // functions to preserve its name and its context allocation information. 448 // functions to preserve its name and its context allocation information.
449 int captured_idx = 0; 449 int captured_idx = 0;
450 for (int i = 0; i < num_variables(); i++) { 450 for (int i = 0; i < num_variables(); i++) {
451 LocalVariable* variable = VariableAt(i); 451 LocalVariable* variable = VariableAt(i);
452 // Preserve the aliases of captured variables belonging to outer scopes. 452 // Preserve the aliases of captured variables belonging to outer scopes.
453 if (variable->owner()->function_level() != 1) { 453 if (variable->owner()->function_level() != 1) {
454 context_scope.SetTokenIndexAt(captured_idx, variable->token_index()); 454 context_scope.SetTokenIndexAt(captured_idx, variable->token_pos());
455 context_scope.SetNameAt(captured_idx, variable->name()); 455 context_scope.SetNameAt(captured_idx, variable->name());
456 context_scope.SetIsFinalAt(captured_idx, variable->is_final()); 456 context_scope.SetIsFinalAt(captured_idx, variable->is_final());
457 context_scope.SetTypeAt(captured_idx, variable->type()); 457 context_scope.SetTypeAt(captured_idx, variable->type());
458 context_scope.SetContextIndexAt(captured_idx, variable->index()); 458 context_scope.SetContextIndexAt(captured_idx, variable->index());
459 // Adjust the context level relative to the current context level, 459 // Adjust the context level relative to the current context level,
460 // since the context of the current scope will be at level 0 when 460 // since the context of the current scope will be at level 0 when
461 // compiling the nested function. 461 // compiling the nested function.
462 int adjusted_context_level = 462 int adjusted_context_level =
463 variable->owner()->context_level() - current_context_level; 463 variable->owner()->context_level() - current_context_level;
464 context_scope.SetContextLevelAt(captured_idx, adjusted_context_level); 464 context_scope.SetContextLevelAt(captured_idx, adjusted_context_level);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 498
499 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) { 499 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) {
500 static const intptr_t kNumCapturedVars = 1; 500 static const intptr_t kNumCapturedVars = 1;
501 501
502 // Create a ContextScope with space for kNumCapturedVars descriptors. 502 // Create a ContextScope with space for kNumCapturedVars descriptors.
503 const ContextScope& context_scope = 503 const ContextScope& context_scope =
504 ContextScope::Handle(ContextScope::New(kNumCapturedVars)); 504 ContextScope::Handle(ContextScope::New(kNumCapturedVars));
505 505
506 // Create a descriptor for 'this' variable. 506 // Create a descriptor for 'this' variable.
507 const String& name = String::Handle(String::NewSymbol("this")); 507 const String& name = String::Handle(String::NewSymbol("this"));
508 context_scope.SetTokenIndexAt(0, func.token_index()); 508 context_scope.SetTokenIndexAt(0, func.token_pos());
509 context_scope.SetNameAt(0, name); 509 context_scope.SetNameAt(0, name);
510 context_scope.SetIsFinalAt(0, true); 510 context_scope.SetIsFinalAt(0, true);
511 const AbstractType& type = AbstractType::Handle(func.ParameterTypeAt(0)); 511 const AbstractType& type = AbstractType::Handle(func.ParameterTypeAt(0));
512 context_scope.SetTypeAt(0, type); 512 context_scope.SetTypeAt(0, type);
513 context_scope.SetContextIndexAt(0, 0); 513 context_scope.SetContextIndexAt(0, 0);
514 context_scope.SetContextLevelAt(0, 0); 514 context_scope.SetContextLevelAt(0, 0);
515 ASSERT(context_scope.num_variables() == kNumCapturedVars); // Verify count. 515 ASSERT(context_scope.num_variables() == kNumCapturedVars); // Verify count.
516 return context_scope.raw(); 516 return context_scope.raw();
517 } 517 }
518 518
(...skipping 25 matching lines...) Expand all
544 } else { 544 } else {
545 // Shift negative indexes so that the lowest one is 0 (they are still 545 // Shift negative indexes so that the lowest one is 0 (they are still
546 // non-positive) and index them backward from the end of the vector. 546 // non-positive) and index them backward from the end of the vector.
547 return (var_count - 1) + 547 return (var_count - 1) +
548 (index() - ParsedFunction::kFirstLocalSlotIndex); 548 (index() - ParsedFunction::kFirstLocalSlotIndex);
549 } 549 }
550 } 550 }
551 551
552 552
553 } // namespace dart 553 } // namespace dart
OLDNEW
« no previous file with comments | « vm/scopes.h ('k') | vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698