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

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

Issue 2002923002: Implement assert in initializer list in VM. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Addressed comments. PTAL Created 4 years, 4 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/parser.h ('k') | runtime/vm/symbols.h » ('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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 // committed to the current version. 48 // committed to the current version.
49 DEFINE_FLAG(bool, conditional_directives, true, 49 DEFINE_FLAG(bool, conditional_directives, true,
50 "Enable conditional directives"); 50 "Enable conditional directives");
51 DEFINE_FLAG(bool, initializing_formal_access, false, 51 DEFINE_FLAG(bool, initializing_formal_access, false,
52 "Make initializing formal parameters visible in initializer list."); 52 "Make initializing formal parameters visible in initializer list.");
53 DEFINE_FLAG(bool, warn_super, false, 53 DEFINE_FLAG(bool, warn_super, false,
54 "Warning if super initializer not last in initializer list."); 54 "Warning if super initializer not last in initializer list.");
55 DEFINE_FLAG(bool, warn_patch, false, "Warn on old-style patch syntax."); 55 DEFINE_FLAG(bool, warn_patch, false, "Warn on old-style patch syntax.");
56 DEFINE_FLAG(bool, await_is_keyword, false, 56 DEFINE_FLAG(bool, await_is_keyword, false,
57 "await and yield are treated as proper keywords in synchronous code."); 57 "await and yield are treated as proper keywords in synchronous code.");
58 DEFINE_FLAG(bool, assert_initializer, false,
59 "Allow asserts in initializer lists.");
58 60
59 DECLARE_FLAG(bool, profile_vm); 61 DECLARE_FLAG(bool, profile_vm);
60 DECLARE_FLAG(bool, trace_service); 62 DECLARE_FLAG(bool, trace_service);
61 63
62 // Quick access to the current thread, isolate and zone. 64 // Quick access to the current thread, isolate and zone.
63 #define T (thread()) 65 #define T (thread())
64 #define I (isolate()) 66 #define I (isolate())
65 #define Z (zone()) 67 #define Z (zone())
66 68
67 // Quick synthetic token position. 69 // Quick synthetic token position.
(...skipping 2593 matching lines...) Expand 10 before | Expand all | Expand 10 after
2661 } 2663 }
2662 return new StaticCallNode(supercall_pos, super_ctor, arguments); 2664 return new StaticCallNode(supercall_pos, super_ctor, arguments);
2663 } 2665 }
2664 2666
2665 2667
2666 AstNode* Parser::ParseInitializer(const Class& cls, 2668 AstNode* Parser::ParseInitializer(const Class& cls,
2667 LocalVariable* receiver, 2669 LocalVariable* receiver,
2668 GrowableArray<Field*>* initialized_fields) { 2670 GrowableArray<Field*>* initialized_fields) {
2669 TRACE_PARSER("ParseInitializer"); 2671 TRACE_PARSER("ParseInitializer");
2670 const TokenPosition field_pos = TokenPos(); 2672 const TokenPosition field_pos = TokenPos();
2673 if (FLAG_assert_initializer && CurrentToken() == Token::kASSERT) {
2674 return ParseAssertStatement(current_function().is_const());
2675 }
2671 if (CurrentToken() == Token::kTHIS) { 2676 if (CurrentToken() == Token::kTHIS) {
2672 ConsumeToken(); 2677 ConsumeToken();
2673 ExpectToken(Token::kPERIOD); 2678 ExpectToken(Token::kPERIOD);
2674 } 2679 }
2675 const String& field_name = *ExpectIdentifier("field name expected"); 2680 const String& field_name = *ExpectIdentifier("field name expected");
2676 ExpectToken(Token::kASSIGN); 2681 ExpectToken(Token::kASSIGN);
2677 2682
2678 const bool saved_mode = SetAllowFunctionLiterals(false); 2683 const bool saved_mode = SetAllowFunctionLiterals(false);
2679 // "this" must not be accessible in initializer expressions. 2684 // "this" must not be accessible in initializer expressions.
2680 receiver->set_invisible(true); 2685 receiver->set_invisible(true);
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
2950 ReportError("duplicate call to super constructor"); 2955 ReportError("duplicate call to super constructor");
2951 } 2956 }
2952 super_init_call = ParseSuperInitializer(cls, receiver); 2957 super_init_call = ParseSuperInitializer(cls, receiver);
2953 super_init_index = current_block_->statements->length(); 2958 super_init_index = current_block_->statements->length();
2954 current_block_->statements->Add(super_init_call); 2959 current_block_->statements->Add(super_init_call);
2955 super_init_is_last = true; 2960 super_init_is_last = true;
2956 } else { 2961 } else {
2957 AstNode* init_statement = 2962 AstNode* init_statement =
2958 ParseInitializer(cls, receiver, initialized_fields); 2963 ParseInitializer(cls, receiver, initialized_fields);
2959 super_init_is_last = false; 2964 super_init_is_last = false;
2960 current_block_->statements->Add(init_statement); 2965 if (init_statement != NULL) {
2966 current_block_->statements->Add(init_statement);
2967 }
2961 } 2968 }
2962 } while (CurrentToken() == Token::kCOMMA); 2969 } while (CurrentToken() == Token::kCOMMA);
2963 } 2970 }
2964 if (super_init_call == NULL) { 2971 if (super_init_call == NULL) {
2965 // Generate implicit super() if we haven't seen an explicit super call 2972 // Generate implicit super() if we haven't seen an explicit super call
2966 // or constructor redirection. 2973 // or constructor redirection.
2967 super_init_call = 2974 super_init_call =
2968 GenerateSuperConstructorCall(cls, TokenPos(), receiver, NULL); 2975 GenerateSuperConstructorCall(cls, TokenPos(), receiver, NULL);
2969 if (super_init_call != NULL) { 2976 if (super_init_call != NULL) {
2970 super_init_index = current_block_->statements->length(); 2977 super_init_index = current_block_->statements->length();
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
3652 do { 3659 do {
3653 ConsumeToken(); // Colon or comma. 3660 ConsumeToken(); // Colon or comma.
3654 if (CurrentToken() == Token::kSUPER) { 3661 if (CurrentToken() == Token::kSUPER) {
3655 ConsumeToken(); 3662 ConsumeToken();
3656 if (CurrentToken() == Token::kPERIOD) { 3663 if (CurrentToken() == Token::kPERIOD) {
3657 ConsumeToken(); 3664 ConsumeToken();
3658 ExpectIdentifier("identifier expected"); 3665 ExpectIdentifier("identifier expected");
3659 } 3666 }
3660 CheckToken(Token::kLPAREN); 3667 CheckToken(Token::kLPAREN);
3661 SkipToMatchingParenthesis(); 3668 SkipToMatchingParenthesis();
3669 } else if (FLAG_assert_initializer && (CurrentToken() == Token::kASSERT)) {
3670 ConsumeToken();
3671 CheckToken(Token::kLPAREN);
3672 SkipToMatchingParenthesis();
3662 } else { 3673 } else {
3663 SkipIf(Token::kTHIS); 3674 SkipIf(Token::kTHIS);
3664 SkipIf(Token::kPERIOD); 3675 SkipIf(Token::kPERIOD);
3665 ExpectIdentifier("identifier expected"); 3676 ExpectIdentifier("identifier expected");
3666 ExpectToken(Token::kASSIGN); 3677 ExpectToken(Token::kASSIGN);
3667 SetAllowFunctionLiterals(false); 3678 SetAllowFunctionLiterals(false);
3668 SkipExpr(); 3679 SkipExpr();
3669 SetAllowFunctionLiterals(true); 3680 SetAllowFunctionLiterals(true);
3670 } 3681 }
3671 } while (CurrentToken() == Token::kCOMMA); 3682 } while (CurrentToken() == Token::kCOMMA);
(...skipping 5609 matching lines...) Expand 10 before | Expand all | Expand 10 after
9281 const Function& func = Function::ZoneHandle(Z, 9292 const Function& func = Function::ZoneHandle(Z,
9282 Resolver::ResolveStatic(cls, 9293 Resolver::ResolveStatic(cls,
9283 func_name, 9294 func_name,
9284 arguments->length(), 9295 arguments->length(),
9285 arguments->names())); 9296 arguments->names()));
9286 ASSERT(!func.IsNull()); 9297 ASSERT(!func.IsNull());
9287 return new(Z) StaticCallNode(arguments->token_pos(), func, arguments); 9298 return new(Z) StaticCallNode(arguments->token_pos(), func, arguments);
9288 } 9299 }
9289 9300
9290 9301
9291 AstNode* Parser::ParseAssertStatement() { 9302 AstNode* Parser::ParseAssertStatement(bool is_const) {
9292 TRACE_PARSER("ParseAssertStatement"); 9303 TRACE_PARSER("ParseAssertStatement");
9293 ConsumeToken(); // Consume assert keyword. 9304 ConsumeToken(); // Consume assert keyword.
9294 ExpectToken(Token::kLPAREN); 9305 ExpectToken(Token::kLPAREN);
9295 const TokenPosition condition_pos = TokenPos(); 9306 const TokenPosition condition_pos = TokenPos();
9296 if (!I->asserts()) { 9307 if (!I->asserts()) {
9297 SkipExpr(); 9308 SkipExpr();
9298 ExpectToken(Token::kRPAREN); 9309 ExpectToken(Token::kRPAREN);
9299 return NULL; 9310 return NULL;
9300 } 9311 }
9301 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); 9312 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
9313 if (is_const && !condition->IsPotentiallyConst()) {
9314 ReportError(condition_pos,
9315 "initializer assert expression must be compile time constant.");
9316 }
9302 const TokenPosition condition_end = TokenPos(); 9317 const TokenPosition condition_end = TokenPos();
9303 ExpectToken(Token::kRPAREN); 9318 ExpectToken(Token::kRPAREN);
9304 9319
9305 ArgumentListNode* arguments = new(Z) ArgumentListNode(condition_pos); 9320 ArgumentListNode* arguments = new(Z) ArgumentListNode(condition_pos);
9306 arguments->Add(condition); 9321 arguments->Add(condition);
9307 arguments->Add(new(Z) LiteralNode(condition_pos, 9322 arguments->Add(new(Z) LiteralNode(condition_pos,
9308 Integer::ZoneHandle(Z, Integer::New(condition_pos.value(), Heap::kOld)))); 9323 Integer::ZoneHandle(Z, Integer::New(condition_pos.value(), Heap::kOld))));
9309 arguments->Add(new(Z) LiteralNode(condition_end, 9324 arguments->Add(new(Z) LiteralNode(condition_end,
9310 Integer::ZoneHandle(Z, Integer::New(condition_end.value(), Heap::kOld)))); 9325 Integer::ZoneHandle(Z, Integer::New(condition_end.value(), Heap::kOld))));
9311 return MakeStaticCall(Symbols::AssertionError(), 9326 AstNode* assert_throw = MakeStaticCall(Symbols::AssertionError(),
9312 Library::PrivateCoreLibName(Symbols::CheckAssertion()), 9327 Library::PrivateCoreLibName(is_const ? Symbols::CheckConstAssertion()
9313 arguments); 9328 : Symbols::CheckAssertion()),
9329 arguments);
9330
9331 return assert_throw;
9314 } 9332 }
9315 9333
9316 9334
9317 // Populate local scope of the catch block with the catch parameters. 9335 // Populate local scope of the catch block with the catch parameters.
9318 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, 9336 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param,
9319 CatchParamDesc* stack_trace_param, 9337 CatchParamDesc* stack_trace_param,
9320 LocalScope* scope) { 9338 LocalScope* scope) {
9321 if (exception_param->name != NULL) { 9339 if (exception_param->name != NULL) {
9322 LocalVariable* var = new(Z) LocalVariable( 9340 LocalVariable* var = new(Z) LocalVariable(
9323 exception_param->token_pos, 9341 exception_param->token_pos,
(...skipping 5417 matching lines...) Expand 10 before | Expand all | Expand 10 after
14741 const ArgumentListNode& function_args, 14759 const ArgumentListNode& function_args,
14742 const LocalVariable* temp_for_last_arg, 14760 const LocalVariable* temp_for_last_arg,
14743 bool is_super_invocation) { 14761 bool is_super_invocation) {
14744 UNREACHABLE(); 14762 UNREACHABLE();
14745 return NULL; 14763 return NULL;
14746 } 14764 }
14747 14765
14748 } // namespace dart 14766 } // namespace dart
14749 14767
14750 #endif // DART_PRECOMPILED_RUNTIME 14768 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698