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

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

Issue 2419013004: Add local variable declaration token position to service protocol (Closed)
Patch Set: ... Created 4 years, 2 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/scopes.h ('k') | runtime/vm/scopes_test.cc » ('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/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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 if (!IsFilteredIdentifier(name)) { 281 if (!IsFilteredIdentifier(name)) {
282 kind = RawLocalVarDescriptors::kContextVar; 282 kind = RawLocalVarDescriptors::kContextVar;
283 } else { 283 } else {
284 continue; 284 continue;
285 } 285 }
286 286
287 VarDesc desc; 287 VarDesc desc;
288 desc.name = &name; 288 desc.name = &name;
289 desc.info.set_kind(kind); 289 desc.info.set_kind(kind);
290 desc.info.scope_id = context_scope.ContextLevelAt(i); 290 desc.info.scope_id = context_scope.ContextLevelAt(i);
291 desc.info.declaration_pos = context_scope.DeclarationTokenIndexAt(i);
291 desc.info.begin_pos = begin_token_pos(); 292 desc.info.begin_pos = begin_token_pos();
292 desc.info.end_pos = end_token_pos(); 293 desc.info.end_pos = end_token_pos();
293 ASSERT(desc.info.begin_pos <= desc.info.end_pos); 294 ASSERT(desc.info.begin_pos <= desc.info.end_pos);
294 desc.info.set_index(context_scope.ContextIndexAt(i)); 295 desc.info.set_index(context_scope.ContextIndexAt(i));
295 vars.Add(desc); 296 vars.Add(desc);
296 } 297 }
297 } 298 }
298 // Now collect all variables from local scopes. 299 // Now collect all variables from local scopes.
299 int16_t scope_id = 0; 300 int16_t scope_id = 0;
300 CollectLocalVariables(&vars, &scope_id); 301 CollectLocalVariables(&vars, &scope_id);
(...skipping 28 matching lines...) Expand all
329 for (int i = 0; i < this->variables_.length(); i++) { 330 for (int i = 0; i < this->variables_.length(); i++) {
330 LocalVariable* var = variables_[i]; 331 LocalVariable* var = variables_[i];
331 if ((var->owner() == this) && !var->is_invisible()) { 332 if ((var->owner() == this) && !var->is_invisible()) {
332 if (var->name().raw() == Symbols::CurrentContextVar().raw()) { 333 if (var->name().raw() == Symbols::CurrentContextVar().raw()) {
333 // This is the local variable in which the function saves its 334 // This is the local variable in which the function saves its
334 // own context before calling a closure function. 335 // own context before calling a closure function.
335 VarDesc desc; 336 VarDesc desc;
336 desc.name = &var->name(); 337 desc.name = &var->name();
337 desc.info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext); 338 desc.info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext);
338 desc.info.scope_id = 0; 339 desc.info.scope_id = 0;
340 desc.info.declaration_pos = TokenPosition::kMinSource;
339 desc.info.begin_pos = TokenPosition::kMinSource; 341 desc.info.begin_pos = TokenPosition::kMinSource;
340 desc.info.end_pos = TokenPosition::kMinSource; 342 desc.info.end_pos = TokenPosition::kMinSource;
341 desc.info.set_index(var->index()); 343 desc.info.set_index(var->index());
342 vars->Add(desc); 344 vars->Add(desc);
343 } else if (!IsFilteredIdentifier(var->name())) { 345 } else if (!IsFilteredIdentifier(var->name())) {
344 // This is a regular Dart variable, either stack-based or captured. 346 // This is a regular Dart variable, either stack-based or captured.
345 VarDesc desc; 347 VarDesc desc;
346 desc.name = &var->name(); 348 desc.name = &var->name();
347 if (var->is_captured()) { 349 if (var->is_captured()) {
348 desc.info.set_kind(RawLocalVarDescriptors::kContextVar); 350 desc.info.set_kind(RawLocalVarDescriptors::kContextVar);
349 ASSERT(var->owner() != NULL); 351 ASSERT(var->owner() != NULL);
350 ASSERT(var->owner()->context_level() >= 0); 352 ASSERT(var->owner()->context_level() >= 0);
351 desc.info.scope_id = var->owner()->context_level(); 353 desc.info.scope_id = var->owner()->context_level();
352 } else { 354 } else {
353 desc.info.set_kind(RawLocalVarDescriptors::kStackVar); 355 desc.info.set_kind(RawLocalVarDescriptors::kStackVar);
354 desc.info.scope_id = *scope_id; 356 desc.info.scope_id = *scope_id;
355 } 357 }
358 desc.info.declaration_pos = var->declaration_token_pos();
356 desc.info.begin_pos = var->token_pos(); 359 desc.info.begin_pos = var->token_pos();
357 desc.info.end_pos = var->owner()->end_token_pos(); 360 desc.info.end_pos = var->owner()->end_token_pos();
358 desc.info.set_index(var->index()); 361 desc.info.set_index(var->index());
359 vars->Add(desc); 362 vars->Add(desc);
360 } 363 }
361 } 364 }
362 } 365 }
363 LocalScope* child = this->child(); 366 LocalScope* child = this->child();
364 while (child != NULL) { 367 while (child != NULL) {
365 child->CollectLocalVariables(vars, scope_id); 368 child->CollectLocalVariables(vars, scope_id);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 ContextScope::Handle(ContextScope::New(num_captured_vars, false)); 547 ContextScope::Handle(ContextScope::New(num_captured_vars, false));
545 548
546 // Create a descriptor for each referenced captured variable of enclosing 549 // Create a descriptor for each referenced captured variable of enclosing
547 // functions to preserve its name and its context allocation information. 550 // functions to preserve its name and its context allocation information.
548 int captured_idx = 0; 551 int captured_idx = 0;
549 for (int i = 0; i < num_variables(); i++) { 552 for (int i = 0; i < num_variables(); i++) {
550 LocalVariable* variable = VariableAt(i); 553 LocalVariable* variable = VariableAt(i);
551 // Preserve the aliases of captured variables belonging to outer scopes. 554 // Preserve the aliases of captured variables belonging to outer scopes.
552 if (variable->owner()->function_level() != 1) { 555 if (variable->owner()->function_level() != 1) {
553 context_scope.SetTokenIndexAt(captured_idx, variable->token_pos()); 556 context_scope.SetTokenIndexAt(captured_idx, variable->token_pos());
557 context_scope.SetDeclarationTokenIndexAt(
558 captured_idx, variable->declaration_token_pos());
554 context_scope.SetNameAt(captured_idx, variable->name()); 559 context_scope.SetNameAt(captured_idx, variable->name());
555 context_scope.SetIsFinalAt(captured_idx, variable->is_final()); 560 context_scope.SetIsFinalAt(captured_idx, variable->is_final());
556 context_scope.SetIsConstAt(captured_idx, variable->IsConst()); 561 context_scope.SetIsConstAt(captured_idx, variable->IsConst());
557 if (variable->IsConst()) { 562 if (variable->IsConst()) {
558 context_scope.SetConstValueAt(captured_idx, *variable->ConstValue()); 563 context_scope.SetConstValueAt(captured_idx, *variable->ConstValue());
559 } else { 564 } else {
560 context_scope.SetTypeAt(captured_idx, variable->type()); 565 context_scope.SetTypeAt(captured_idx, variable->type());
561 } 566 }
562 context_scope.SetContextIndexAt(captured_idx, variable->index()); 567 context_scope.SetContextIndexAt(captured_idx, variable->index());
563 // Adjust the context level relative to the current context level, 568 // Adjust the context level relative to the current context level,
(...skipping 11 matching lines...) Expand all
575 580
576 581
577 LocalScope* LocalScope::RestoreOuterScope(const ContextScope& context_scope) { 582 LocalScope* LocalScope::RestoreOuterScope(const ContextScope& context_scope) {
578 // The function level of the outer scope is one less than the function level 583 // The function level of the outer scope is one less than the function level
579 // of the current function, which is 0. 584 // of the current function, which is 0.
580 LocalScope* outer_scope = new LocalScope(NULL, -1, 0); 585 LocalScope* outer_scope = new LocalScope(NULL, -1, 0);
581 // Add all variables as aliases to the outer scope. 586 // Add all variables as aliases to the outer scope.
582 for (int i = 0; i < context_scope.num_variables(); i++) { 587 for (int i = 0; i < context_scope.num_variables(); i++) {
583 LocalVariable* variable; 588 LocalVariable* variable;
584 if (context_scope.IsConstAt(i)) { 589 if (context_scope.IsConstAt(i)) {
585 variable = new LocalVariable(context_scope.TokenIndexAt(i), 590 variable = new LocalVariable(
591 context_scope.DeclarationTokenIndexAt(i),
592 context_scope.TokenIndexAt(i),
586 String::ZoneHandle(context_scope.NameAt(i)), 593 String::ZoneHandle(context_scope.NameAt(i)),
587 Object::dynamic_type()); 594 Object::dynamic_type());
588 variable->SetConstValue( 595 variable->SetConstValue(
589 Instance::ZoneHandle(context_scope.ConstValueAt(i))); 596 Instance::ZoneHandle(context_scope.ConstValueAt(i)));
590 } else { 597 } else {
591 variable = new LocalVariable(context_scope.TokenIndexAt(i), 598 variable = new LocalVariable(
599 context_scope.DeclarationTokenIndexAt(i),
600 context_scope.TokenIndexAt(i),
592 String::ZoneHandle(context_scope.NameAt(i)), 601 String::ZoneHandle(context_scope.NameAt(i)),
593 AbstractType::ZoneHandle(context_scope.TypeAt(i))); 602 AbstractType::ZoneHandle(context_scope.TypeAt(i)));
594 } 603 }
595 variable->set_is_captured(); 604 variable->set_is_captured();
596 variable->set_index(context_scope.ContextIndexAt(i)); 605 variable->set_index(context_scope.ContextIndexAt(i));
597 if (context_scope.IsFinalAt(i)) { 606 if (context_scope.IsFinalAt(i)) {
598 variable->set_is_final(); 607 variable->set_is_final();
599 } 608 }
600 // Create a fake owner scope describing the index and context level of the 609 // Create a fake owner scope describing the index and context level of the
601 // variable. Function level and loop level are unused (set to 0), since 610 // variable. Function level and loop level are unused (set to 0), since
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 642
634 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) { 643 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) {
635 static const intptr_t kNumCapturedVars = 1; 644 static const intptr_t kNumCapturedVars = 1;
636 645
637 // Create a ContextScope with space for kNumCapturedVars descriptors. 646 // Create a ContextScope with space for kNumCapturedVars descriptors.
638 const ContextScope& context_scope = 647 const ContextScope& context_scope =
639 ContextScope::Handle(ContextScope::New(kNumCapturedVars, true)); 648 ContextScope::Handle(ContextScope::New(kNumCapturedVars, true));
640 649
641 // Create a descriptor for 'this' variable. 650 // Create a descriptor for 'this' variable.
642 context_scope.SetTokenIndexAt(0, func.token_pos()); 651 context_scope.SetTokenIndexAt(0, func.token_pos());
652 context_scope.SetDeclarationTokenIndexAt(0, func.token_pos());
643 context_scope.SetNameAt(0, Symbols::This()); 653 context_scope.SetNameAt(0, Symbols::This());
644 context_scope.SetIsFinalAt(0, true); 654 context_scope.SetIsFinalAt(0, true);
645 context_scope.SetIsConstAt(0, false); 655 context_scope.SetIsConstAt(0, false);
646 const AbstractType& type = AbstractType::Handle(func.ParameterTypeAt(0)); 656 const AbstractType& type = AbstractType::Handle(func.ParameterTypeAt(0));
647 context_scope.SetTypeAt(0, type); 657 context_scope.SetTypeAt(0, type);
648 context_scope.SetContextIndexAt(0, 0); 658 context_scope.SetContextIndexAt(0, 0);
649 context_scope.SetContextLevelAt(0, 0); 659 context_scope.SetContextLevelAt(0, 0);
650 ASSERT(context_scope.num_variables() == kNumCapturedVars); // Verify count. 660 ASSERT(context_scope.num_variables() == kNumCapturedVars); // Verify count.
651 return context_scope.raw(); 661 return context_scope.raw();
652 } 662 }
(...skipping 24 matching lines...) Expand all
677 return fixed_parameter_count - (index() - kParamEndSlotFromFp); 687 return fixed_parameter_count - (index() - kParamEndSlotFromFp);
678 } else { 688 } else {
679 // Shift negative indexes so that the lowest one is 0 (they are still 689 // Shift negative indexes so that the lowest one is 0 (they are still
680 // non-positive). 690 // non-positive).
681 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp); 691 return fixed_parameter_count - (index() - kFirstLocalSlotFromFp);
682 } 692 }
683 } 693 }
684 694
685 695
686 } // namespace dart 696 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/scopes.h ('k') | runtime/vm/scopes_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698