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

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

Issue 2085003002: Parse field initializer expressions in the correct scope class (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 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
« no previous file with comments | « no previous file | tests/language/language_dart2js.status » ('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 #include "vm/flags.h" 6 #include "vm/flags.h"
7 7
8 #ifndef DART_PRECOMPILED_RUNTIME 8 #ifndef DART_PRECOMPILED_RUNTIME
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 2630 matching lines...) Expand 10 before | Expand all | Expand 10 after
2641 2641
2642 if (found) continue; 2642 if (found) continue;
2643 2643
2644 field.RecordStore(Object::null_object()); 2644 field.RecordStore(Object::null_object());
2645 } 2645 }
2646 } 2646 }
2647 2647
2648 2648
2649 AstNode* Parser::ParseExternalInitializedField(const Field& field) { 2649 AstNode* Parser::ParseExternalInitializedField(const Field& field) {
2650 // Only use this function if the initialized field originates 2650 // Only use this function if the initialized field originates
2651 // from a different class. We need to save and restore current 2651 // from a different class. We need to save and restore the
2652 // class, library, and token stream (script). 2652 // library and token stream (script).
2653 // The current_class remains unchanged, so that type arguments
2654 // are resolved in the correct scope class.
2653 ASSERT(current_class().raw() != field.Origin()); 2655 ASSERT(current_class().raw() != field.Origin());
2654 const Class& saved_class = Class::Handle(Z, current_class().raw());
2655 const Library& saved_library = Library::Handle(Z, library().raw()); 2656 const Library& saved_library = Library::Handle(Z, library().raw());
2656 const Script& saved_script = Script::Handle(Z, script().raw()); 2657 const Script& saved_script = Script::Handle(Z, script().raw());
2657 const TokenPosition saved_token_pos = TokenPos(); 2658 const TokenPosition saved_token_pos = TokenPos();
2658 2659
2659 set_current_class(Class::Handle(Z, field.Origin())); 2660 const Class& origin_class = Class::Handle(Z, field.Origin());
2660 set_library(Library::Handle(Z, current_class().library())); 2661 set_library(Library::Handle(Z, origin_class.library()));
2661 SetScript(Script::Handle(Z, current_class().script()), field.token_pos()); 2662 SetScript(Script::Handle(Z, origin_class.script()), field.token_pos());
2662 2663
2663 ASSERT(IsIdentifier()); 2664 ASSERT(IsIdentifier());
2664 ConsumeToken(); 2665 ConsumeToken();
2665 ExpectToken(Token::kASSIGN); 2666 ExpectToken(Token::kASSIGN);
2666 AstNode* init_expr = NULL; 2667 AstNode* init_expr = NULL;
2667 TokenPosition expr_pos = TokenPos(); 2668 TokenPosition expr_pos = TokenPos();
2668 if (field.is_const()) { 2669 if (field.is_const()) {
2669 init_expr = ParseConstExpr(); 2670 init_expr = ParseConstExpr();
2670 } else { 2671 } else {
2671 init_expr = ParseExpr(kAllowConst, kConsumeCascades); 2672 init_expr = ParseExpr(kAllowConst, kConsumeCascades);
2672 if (init_expr->EvalConstExpr() != NULL) { 2673 if (init_expr->EvalConstExpr() != NULL) {
2673 Instance& expr_value = Instance::ZoneHandle(Z); 2674 Instance& expr_value = Instance::ZoneHandle(Z);
2674 if (!GetCachedConstant(expr_pos, &expr_value)) { 2675 if (!GetCachedConstant(expr_pos, &expr_value)) {
2675 expr_value = EvaluateConstExpr(expr_pos, init_expr).raw(); 2676 expr_value = EvaluateConstExpr(expr_pos, init_expr).raw();
2676 CacheConstantValue(expr_pos, expr_value); 2677 CacheConstantValue(expr_pos, expr_value);
2677 } 2678 }
2678 init_expr = new(Z) LiteralNode(field.token_pos(), expr_value); 2679 init_expr = new(Z) LiteralNode(field.token_pos(), expr_value);
2679 } 2680 }
2680 } 2681 }
2681 set_current_class(saved_class);
2682 set_library(saved_library); 2682 set_library(saved_library);
2683 SetScript(saved_script, saved_token_pos); 2683 SetScript(saved_script, saved_token_pos);
2684 return init_expr; 2684 return init_expr;
2685 } 2685 }
2686 2686
2687 2687
2688 void Parser::ParseInitializedInstanceFields(const Class& cls, 2688 void Parser::ParseInitializedInstanceFields(const Class& cls,
2689 LocalVariable* receiver, 2689 LocalVariable* receiver,
2690 GrowableArray<Field*>* initialized_fields) { 2690 GrowableArray<Field*>* initialized_fields) {
2691 TRACE_PARSER("ParseInitializedInstanceFields"); 2691 TRACE_PARSER("ParseInitializedInstanceFields");
(...skipping 11924 matching lines...) Expand 10 before | Expand all | Expand 10 after
14616 const ArgumentListNode& function_args, 14616 const ArgumentListNode& function_args,
14617 const LocalVariable* temp_for_last_arg, 14617 const LocalVariable* temp_for_last_arg,
14618 bool is_super_invocation) { 14618 bool is_super_invocation) {
14619 UNREACHABLE(); 14619 UNREACHABLE();
14620 return NULL; 14620 return NULL;
14621 } 14621 }
14622 14622
14623 } // namespace dart 14623 } // namespace dart
14624 14624
14625 #endif // DART_PRECOMPILED_RUNTIME 14625 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « no previous file | tests/language/language_dart2js.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698