Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 3003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3014 // have an initializer expression inlined in the class declaration. | 3014 // have an initializer expression inlined in the class declaration. |
| 3015 // The remaining fields are those initialized by the constructor's | 3015 // The remaining fields are those initialized by the constructor's |
| 3016 // initializing formals and initializer list | 3016 // initializing formals and initializer list |
| 3017 int initializer_idx = 0; | 3017 int initializer_idx = 0; |
| 3018 while (initializer_idx < initialized_fields->length()) { | 3018 while (initializer_idx < initialized_fields->length()) { |
| 3019 Field* initialized_field = (*initialized_fields)[initializer_idx]; | 3019 Field* initialized_field = (*initialized_fields)[initializer_idx]; |
| 3020 initializer_idx++; | 3020 initializer_idx++; |
| 3021 if (initialized_field == NULL) { | 3021 if (initialized_field == NULL) { |
| 3022 break; | 3022 break; |
| 3023 } | 3023 } |
| 3024 | |
| 3025 const String& initialized_name = | |
| 3026 String::ZoneHandle(initialized_field->name()); | |
| 3027 const String& field_name = String::ZoneHandle(field->name()); | |
|
siva
2017/06/13 22:20:08
Why do these have to be zone handles and not just
| |
| 3028 if (initialized_name.Equals(field_name) && field->IsFinalAndInitialized()) { | |
| 3029 ReportError(init_pos, "'%s' is initialized already, and final.", | |
|
zra
2017/06/13 20:19:41
How about "final field '%s' is already initialized
bkonyi
2017/06/13 22:16:47
Done.
| |
| 3030 field_name.ToCString()); | |
| 3031 } | |
| 3032 | |
| 3024 if (initialized_field->raw() == field->raw()) { | 3033 if (initialized_field->raw() == field->raw()) { |
| 3025 // This final field has been initialized by an inlined | 3034 // This final field has been initialized by an inlined |
| 3026 // initializer expression. This is a runtime error. | 3035 // initializer expression. This is a runtime error. |
| 3027 // Throw a NoSuchMethodError for the missing setter. | 3036 // Throw a NoSuchMethodError for the missing setter. |
| 3028 ASSERT(field->is_final()); | 3037 ASSERT(field->is_final()); |
| 3029 | 3038 |
| 3030 // Build a call to NoSuchMethodError::_throwNew( | 3039 // Build a call to NoSuchMethodError::_throwNew( |
| 3031 // Object receiver, | 3040 // Object receiver, |
| 3032 // String memberName, | 3041 // String memberName, |
| 3033 // int invocation_type, | 3042 // int invocation_type, |
| (...skipping 1454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4488 MemberDesc* existing_member = &members->members()[i]; | 4497 MemberDesc* existing_member = &members->members()[i]; |
| 4489 if (name.Equals(*existing_member->DictName())) { | 4498 if (name.Equals(*existing_member->DictName())) { |
| 4490 ReportError( | 4499 ReportError( |
| 4491 member->name_pos, "%s '%s' conflicts with previously declared %s", | 4500 member->name_pos, "%s '%s' conflicts with previously declared %s", |
| 4492 member->ToCString(), name.ToCString(), existing_member->ToCString()); | 4501 member->ToCString(), name.ToCString(), existing_member->ToCString()); |
| 4493 } | 4502 } |
| 4494 } | 4503 } |
| 4495 } | 4504 } |
| 4496 | 4505 |
| 4497 | 4506 |
| 4507 void Parser::CheckMemberAlreadyInitializedConflicts(ClassDesc* members, | |
| 4508 MemberDesc* member) { | |
| 4509 if (!member->IsConstructor()) { | |
| 4510 return; | |
| 4511 } | |
| 4512 ParamList* params = &member->params; | |
| 4513 if (!params->has_field_initializer) { | |
| 4514 return; | |
| 4515 } | |
| 4516 const ZoneGrowableArray<ParamDesc>& parameters = *params->parameters; | |
| 4517 for (int p = 0; p < parameters.length(); p++) { | |
|
zra
2017/06/13 20:19:41
intptr_t p
bkonyi
2017/06/13 22:16:47
Done.
| |
| 4518 const ParamDesc& current_param = parameters[p]; | |
| 4519 if (!current_param.is_field_initializer) { | |
| 4520 continue; | |
| 4521 } | |
| 4522 const String& name = *current_param.name; | |
| 4523 for (int i = 0; i < members->members().length(); i++) { | |
|
zra
2017/06/13 20:19:42
intptr_t i
bkonyi
2017/06/13 22:16:47
Done.
| |
| 4524 MemberDesc* existing_member = &members->members()[i]; | |
| 4525 if (existing_member->has_final && | |
| 4526 name.Equals(*existing_member->DictName()) && | |
| 4527 existing_member->field_ != NULL && | |
|
zra
2017/06/13 20:19:42
parens around != clause
bkonyi
2017/06/13 22:16:47
Done.
| |
| 4528 existing_member->field_->IsFinalAndInitialized()) { | |
| 4529 ReportError(current_param.name_pos, | |
| 4530 "'%s' is initialized already, and final.", | |
|
zra
2017/06/13 20:19:41
"final field %s is already initialized"
bkonyi
2017/06/13 22:16:47
Done.
| |
| 4531 existing_member->DictName()->ToCString()); | |
| 4532 } | |
| 4533 } | |
| 4534 } | |
| 4535 } | |
| 4536 | |
| 4537 | |
| 4498 void Parser::ParseClassMemberDefinition(ClassDesc* members, | 4538 void Parser::ParseClassMemberDefinition(ClassDesc* members, |
| 4499 TokenPosition metadata_pos) { | 4539 TokenPosition metadata_pos) { |
| 4500 TRACE_PARSER("ParseClassMemberDefinition"); | 4540 TRACE_PARSER("ParseClassMemberDefinition"); |
| 4501 MemberDesc member; | 4541 MemberDesc member; |
| 4502 current_member_ = &member; | 4542 current_member_ = &member; |
| 4503 member.metadata_pos = metadata_pos; | 4543 member.metadata_pos = metadata_pos; |
| 4504 member.decl_begin_pos = TokenPos(); | 4544 member.decl_begin_pos = TokenPos(); |
| 4505 if ((CurrentToken() == Token::kEXTERNAL) && | 4545 if ((CurrentToken() == Token::kEXTERNAL) && |
| 4506 (LookaheadToken(1) != Token::kLPAREN)) { | 4546 (LookaheadToken(1) != Token::kLPAREN)) { |
| 4507 ConsumeToken(); | 4547 ConsumeToken(); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4700 AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw()); | 4740 AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw()); |
| 4701 ResolveType(&type); | 4741 ResolveType(&type); |
| 4702 member.type = &type; | 4742 member.type = &type; |
| 4703 } | 4743 } |
| 4704 ParseFieldDefinition(members, &member); | 4744 ParseFieldDefinition(members, &member); |
| 4705 } else { | 4745 } else { |
| 4706 UnexpectedToken(); | 4746 UnexpectedToken(); |
| 4707 } | 4747 } |
| 4708 current_member_ = NULL; | 4748 current_member_ = NULL; |
| 4709 CheckMemberNameConflict(members, &member); | 4749 CheckMemberNameConflict(members, &member); |
| 4750 CheckMemberAlreadyInitializedConflicts(members, &member); | |
| 4710 members->AddMember(member); | 4751 members->AddMember(member); |
| 4711 } | 4752 } |
| 4712 | 4753 |
| 4713 | 4754 |
| 4714 void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes, | 4755 void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes, |
| 4715 const Object& tl_owner, | 4756 const Object& tl_owner, |
| 4716 TokenPosition metadata_pos) { | 4757 TokenPosition metadata_pos) { |
| 4717 TRACE_PARSER("ParseEnumDeclaration"); | 4758 TRACE_PARSER("ParseEnumDeclaration"); |
| 4718 const TokenPosition declaration_pos = | 4759 const TokenPosition declaration_pos = |
| 4719 (metadata_pos.IsReal()) ? metadata_pos : TokenPos(); | 4760 (metadata_pos.IsReal()) ? metadata_pos : TokenPos(); |
| (...skipping 10594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15314 TokenPosition* start, | 15355 TokenPosition* start, |
| 15315 TokenPosition* end) { | 15356 TokenPosition* end) { |
| 15316 UNREACHABLE(); | 15357 UNREACHABLE(); |
| 15317 return false; | 15358 return false; |
| 15318 } | 15359 } |
| 15319 | 15360 |
| 15320 | 15361 |
| 15321 } // namespace dart | 15362 } // namespace dart |
| 15322 | 15363 |
| 15323 #endif // DART_PRECOMPILED_RUNTIME | 15364 #endif // DART_PRECOMPILED_RUNTIME |
| OLD | NEW |