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

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

Issue 936283005: VM: Fix a bug with local variable values when breaking at a variable declaration. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 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
« no previous file with comments | « no previous file | tests/standalone/debugger/local_variables_test.dart » ('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/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/ast_transformer.h" 9 #include "vm/ast_transformer.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 6654 matching lines...) Expand 10 before | Expand all | Expand 10 after
6665 // Returns ast nodes of the variable initialization. 6665 // Returns ast nodes of the variable initialization.
6666 AstNode* Parser::ParseVariableDeclaration(const AbstractType& type, 6666 AstNode* Parser::ParseVariableDeclaration(const AbstractType& type,
6667 bool is_final, 6667 bool is_final,
6668 bool is_const, 6668 bool is_const,
6669 SequenceNode** await_preamble) { 6669 SequenceNode** await_preamble) {
6670 TRACE_PARSER("ParseVariableDeclaration"); 6670 TRACE_PARSER("ParseVariableDeclaration");
6671 ASSERT(IsIdentifier()); 6671 ASSERT(IsIdentifier());
6672 const intptr_t ident_pos = TokenPos(); 6672 const intptr_t ident_pos = TokenPos();
6673 const String& ident = *CurrentLiteral(); 6673 const String& ident = *CurrentLiteral();
6674 ConsumeToken(); // Variable identifier. 6674 ConsumeToken(); // Variable identifier.
6675 const intptr_t assign_pos = TokenPos();
6675 AstNode* initialization = NULL; 6676 AstNode* initialization = NULL;
6676 LocalVariable* variable = NULL; 6677 LocalVariable* variable = NULL;
6677 if (CurrentToken() == Token::kASSIGN) { 6678 if (CurrentToken() == Token::kASSIGN) {
6678 // Variable initialization. 6679 // Variable initialization.
6679 const intptr_t assign_pos = TokenPos();
6680 ConsumeToken(); 6680 ConsumeToken();
6681 AstNode* expr = ParseAwaitableExpr( 6681 AstNode* expr = ParseAwaitableExpr(
6682 is_const, kConsumeCascades, await_preamble); 6682 is_const, kConsumeCascades, await_preamble);
6683 const intptr_t expr_end_pos = TokenPos(); 6683 const intptr_t expr_end_pos = TokenPos();
6684 variable = new(Z) LocalVariable( 6684 variable = new(Z) LocalVariable(
6685 expr_end_pos, ident, type); 6685 expr_end_pos, ident, type);
6686 initialization = new(Z) StoreLocalNode( 6686 initialization = new(Z) StoreLocalNode(
6687 assign_pos, variable, expr); 6687 assign_pos, variable, expr);
6688 if (is_const) { 6688 if (is_const) {
6689 ASSERT(expr->IsLiteralNode()); 6689 ASSERT(expr->IsLiteralNode());
6690 variable->SetConstValue(expr->AsLiteralNode()->literal()); 6690 variable->SetConstValue(expr->AsLiteralNode()->literal());
6691 } 6691 }
6692 } else if (is_final || is_const) { 6692 } else if (is_final || is_const) {
6693 ReportError(ident_pos, 6693 ReportError(ident_pos,
6694 "missing initialization of 'final' or 'const' variable"); 6694 "missing initialization of 'final' or 'const' variable");
6695 } else { 6695 } else {
6696 // Initialize variable with null. 6696 // Initialize variable with null.
6697 variable = new(Z) LocalVariable( 6697 variable = new(Z) LocalVariable(
6698 ident_pos, ident, type); 6698 assign_pos, ident, type);
6699 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Instance::ZoneHandle(Z)); 6699 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Instance::ZoneHandle(Z));
6700 initialization = new(Z) StoreLocalNode( 6700 initialization = new(Z) StoreLocalNode(
6701 ident_pos, variable, null_expr); 6701 ident_pos, variable, null_expr);
6702 } 6702 }
6703 6703
6704 ASSERT(current_block_ != NULL); 6704 ASSERT(current_block_ != NULL);
6705 const intptr_t previous_pos = 6705 const intptr_t previous_pos =
6706 current_block_->scope->PreviousReferencePos(ident); 6706 current_block_->scope->PreviousReferencePos(ident);
6707 if (previous_pos >= 0) { 6707 if (previous_pos >= 0) {
6708 ASSERT(!script_.IsNull()); 6708 ASSERT(!script_.IsNull());
(...skipping 5848 matching lines...) Expand 10 before | Expand all | Expand 10 after
12557 void Parser::SkipQualIdent() { 12557 void Parser::SkipQualIdent() {
12558 ASSERT(IsIdentifier()); 12558 ASSERT(IsIdentifier());
12559 ConsumeToken(); 12559 ConsumeToken();
12560 if (CurrentToken() == Token::kPERIOD) { 12560 if (CurrentToken() == Token::kPERIOD) {
12561 ConsumeToken(); // Consume the kPERIOD token. 12561 ConsumeToken(); // Consume the kPERIOD token.
12562 ExpectIdentifier("identifier expected after '.'"); 12562 ExpectIdentifier("identifier expected after '.'");
12563 } 12563 }
12564 } 12564 }
12565 12565
12566 } // namespace dart 12566 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/debugger/local_variables_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698