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

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

Issue 2683973002: Handle type literals correctly with deferred loading and await. (Closed)
Patch Set: add comment Created 3 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
« no previous file with comments | « runtime/vm/ast_transformer.cc ('k') | tests/language/deferred_regression_28678_lib.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 #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 11819 matching lines...) Expand 10 before | Expand all | Expand 10 after
11830 if (primary_node->primary().IsFunction()) { 11830 if (primary_node->primary().IsFunction()) {
11831 array = LoadClosure(primary_node); 11831 array = LoadClosure(primary_node);
11832 } else if (primary_node->primary().IsClass()) { 11832 } else if (primary_node->primary().IsClass()) {
11833 const Class& type_class = Class::Cast(primary_node->primary()); 11833 const Class& type_class = Class::Cast(primary_node->primary());
11834 AbstractType& type = Type::ZoneHandle( 11834 AbstractType& type = Type::ZoneHandle(
11835 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos, 11835 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
11836 Heap::kOld)); 11836 Heap::kOld));
11837 type ^= CanonicalizeType(type); 11837 type ^= CanonicalizeType(type);
11838 // Type may be malbounded, but not malformed. 11838 // Type may be malbounded, but not malformed.
11839 ASSERT(!type.IsMalformed()); 11839 ASSERT(!type.IsMalformed());
11840 array = new (Z) TypeNode(primary_pos, type); 11840 array = new (Z) TypeNode(primary_pos, type,
11841 primary_node->is_deferred_reference());
11841 } else if (primary_node->primary().IsTypeParameter()) { 11842 } else if (primary_node->primary().IsTypeParameter()) {
11842 array = LoadTypeParameter(primary_node); 11843 array = LoadTypeParameter(primary_node);
11843 } else { 11844 } else {
11844 UNREACHABLE(); // Internal parser error. 11845 UNREACHABLE(); // Internal parser error.
11845 } 11846 }
11846 } 11847 }
11847 selector = new (Z) 11848 selector = new (Z)
11848 LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z)); 11849 LoadIndexedNode(bracket_pos, array, index, Class::ZoneHandle(Z));
11849 } else if (IsArgumentPart()) { 11850 } else if (IsArgumentPart()) {
11850 if (CurrentToken() == Token::kLT) { 11851 if (CurrentToken() == Token::kLT) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
11924 name.ToCString()); 11925 name.ToCString());
11925 } 11926 }
11926 } else if (primary_node->primary().IsClass()) { 11927 } else if (primary_node->primary().IsClass()) {
11927 const Class& type_class = Class::Cast(primary_node->primary()); 11928 const Class& type_class = Class::Cast(primary_node->primary());
11928 AbstractType& type = Type::ZoneHandle( 11929 AbstractType& type = Type::ZoneHandle(
11929 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos, 11930 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
11930 Heap::kOld)); 11931 Heap::kOld));
11931 type ^= CanonicalizeType(type); 11932 type ^= CanonicalizeType(type);
11932 // Type may be malbounded, but not malformed. 11933 // Type may be malbounded, but not malformed.
11933 ASSERT(!type.IsMalformed()); 11934 ASSERT(!type.IsMalformed());
11934 selector = new (Z) TypeNode(primary_pos, type); 11935 selector = new (Z) TypeNode(primary_pos, type,
11936 primary_node->is_deferred_reference());
11935 } else { 11937 } else {
11936 UNREACHABLE(); // Internal parser error. 11938 UNREACHABLE(); // Internal parser error.
11937 } 11939 }
11938 } else { 11940 } else {
11939 // Left is not a primary node; this must be a closure call. 11941 // Left is not a primary node; this must be a closure call.
11940 AstNode* closure = left; 11942 AstNode* closure = left;
11941 selector = ParseClosureCall(closure); 11943 selector = ParseClosureCall(closure);
11942 } 11944 }
11943 } else { 11945 } else {
11944 // No (more) selectors to parse. 11946 // No (more) selectors to parse.
11945 left = LoadFieldIfUnresolved(left); 11947 left = LoadFieldIfUnresolved(left);
11946 if (left->IsPrimaryNode()) { 11948 if (left->IsPrimaryNode()) {
11947 PrimaryNode* primary_node = left->AsPrimaryNode(); 11949 PrimaryNode* primary_node = left->AsPrimaryNode();
11948 const TokenPosition primary_pos = primary->token_pos(); 11950 const TokenPosition primary_pos = primary->token_pos();
11949 if (primary_node->primary().IsFunction()) { 11951 if (primary_node->primary().IsFunction()) {
11950 // Treat as implicit closure. 11952 // Treat as implicit closure.
11951 left = LoadClosure(primary_node); 11953 left = LoadClosure(primary_node);
11952 } else if (primary_node->primary().IsClass()) { 11954 } else if (primary_node->primary().IsClass()) {
11953 const Class& type_class = Class::Cast(primary_node->primary()); 11955 const Class& type_class = Class::Cast(primary_node->primary());
11954 AbstractType& type = Type::ZoneHandle( 11956 AbstractType& type = Type::ZoneHandle(
11955 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos, 11957 Z, Type::New(type_class, TypeArguments::Handle(Z), primary_pos,
11956 Heap::kOld)); 11958 Heap::kOld));
11957 type = CanonicalizeType(type); 11959 type = CanonicalizeType(type);
11958 // Type may be malbounded, but not malformed. 11960 // Type may be malbounded, but not malformed.
11959 ASSERT(!type.IsMalformed()); 11961 ASSERT(!type.IsMalformed());
11960 left = new (Z) TypeNode(primary_pos, type); 11962 left = new (Z) TypeNode(primary_pos, type,
11963 primary_node->is_deferred_reference());
11961 } else if (primary_node->primary().IsTypeParameter()) { 11964 } else if (primary_node->primary().IsTypeParameter()) {
11962 left = LoadTypeParameter(primary_node); 11965 left = LoadTypeParameter(primary_node);
11963 } else if (primary_node->IsSuper()) { 11966 } else if (primary_node->IsSuper()) {
11964 // Return "super" to handle unary super operator calls, 11967 // Return "super" to handle unary super operator calls,
11965 // or to report illegal use of "super" otherwise. 11968 // or to report illegal use of "super" otherwise.
11966 left = primary_node; 11969 left = primary_node;
11967 } else { 11970 } else {
11968 UNREACHABLE(); // Internal parser error. 11971 UNREACHABLE(); // Internal parser error.
11969 } 11972 }
11970 } 11973 }
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after
12871 ident.ToCString()); 12874 ident.ToCString());
12872 } 12875 }
12873 } else if (primary->primary().IsClass()) { 12876 } else if (primary->primary().IsClass()) {
12874 const Class& type_class = Class::Cast(primary->primary()); 12877 const Class& type_class = Class::Cast(primary->primary());
12875 AbstractType& type = 12878 AbstractType& type =
12876 Type::ZoneHandle(Z, Type::New(type_class, TypeArguments::Handle(Z), 12879 Type::ZoneHandle(Z, Type::New(type_class, TypeArguments::Handle(Z),
12877 primary_pos, Heap::kOld)); 12880 primary_pos, Heap::kOld));
12878 type ^= CanonicalizeType(type); 12881 type ^= CanonicalizeType(type);
12879 // Type may be malbounded, but not malformed. 12882 // Type may be malbounded, but not malformed.
12880 ASSERT(!type.IsMalformed()); 12883 ASSERT(!type.IsMalformed());
12881 resolved = new (Z) TypeNode(primary_pos, type); 12884 resolved =
12885 new (Z) TypeNode(primary_pos, type, primary->is_deferred_reference());
12882 } 12886 }
12883 } 12887 }
12884 return resolved; 12888 return resolved;
12885 } 12889 }
12886 12890
12887 12891
12888 RawAbstractType* Parser::ParseType( 12892 RawAbstractType* Parser::ParseType(
12889 ClassFinalizer::FinalizationKind finalization, 12893 ClassFinalizer::FinalizationKind finalization,
12890 bool allow_deferred_type, 12894 bool allow_deferred_type,
12891 bool consume_unresolved_prefix) { 12895 bool consume_unresolved_prefix) {
(...skipping 2075 matching lines...) Expand 10 before | Expand all | Expand 10 after
14967 const ArgumentListNode& function_args, 14971 const ArgumentListNode& function_args,
14968 const LocalVariable* temp_for_last_arg, 14972 const LocalVariable* temp_for_last_arg,
14969 bool is_super_invocation) { 14973 bool is_super_invocation) {
14970 UNREACHABLE(); 14974 UNREACHABLE();
14971 return NULL; 14975 return NULL;
14972 } 14976 }
14973 14977
14974 } // namespace dart 14978 } // namespace dart
14975 14979
14976 #endif // DART_PRECOMPILED_RUNTIME 14980 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « runtime/vm/ast_transformer.cc ('k') | tests/language/deferred_regression_28678_lib.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698