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

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

Issue 1307363005: Add optional message argument to assert statements in the VM. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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
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 29 matching lines...) Expand all
40 40
41 DEFINE_FLAG(bool, enable_debug_break, false, "Allow use of break \"message\"."); 41 DEFINE_FLAG(bool, enable_debug_break, false, "Allow use of break \"message\".");
42 DEFINE_FLAG(bool, enable_mirrors, true, 42 DEFINE_FLAG(bool, enable_mirrors, true,
43 "Disable to make importing dart:mirrors an error."); 43 "Disable to make importing dart:mirrors an error.");
44 DEFINE_FLAG(bool, load_deferred_eagerly, false, 44 DEFINE_FLAG(bool, load_deferred_eagerly, false,
45 "Load deferred libraries eagerly."); 45 "Load deferred libraries eagerly.");
46 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); 46 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
47 DEFINE_FLAG(bool, supermixin, false, "Allow super calls in mixins."); 47 DEFINE_FLAG(bool, supermixin, false, "Allow super calls in mixins.");
48 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef."); 48 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
49 DEFINE_FLAG(bool, link_natives_lazily, false, "Link native calls lazily"); 49 DEFINE_FLAG(bool, link_natives_lazily, false, "Link native calls lazily");
50 DEFINE_FLAG(bool, assert_message, false, "Allow message in assert statements");
Lasse Reichstein Nielsen 2015/08/28 18:51:59 Should it be "enable_assert_message" instead?
Ivan Posva 2015/09/04 06:39:31 Please coordinate across the implementations. Sinc
50 51
51 DECLARE_FLAG(bool, lazy_dispatchers); 52 DECLARE_FLAG(bool, lazy_dispatchers);
52 DECLARE_FLAG(bool, load_deferred_eagerly); 53 DECLARE_FLAG(bool, load_deferred_eagerly);
53 DECLARE_FLAG(bool, profile_vm); 54 DECLARE_FLAG(bool, profile_vm);
54 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); 55 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
55 DECLARE_FLAG(bool, warn_on_javascript_compatibility); 56 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
56 57
57 // Quick access to the current thread, isolate and zone. 58 // Quick access to the current thread, isolate and zone.
58 #define T (thread()) 59 #define T (thread())
59 #define I (isolate()) 60 #define I (isolate())
(...skipping 9048 matching lines...) Expand 10 before | Expand all | Expand 10 after
9108 const Function& func = Function::ZoneHandle(Z, 9109 const Function& func = Function::ZoneHandle(Z,
9109 Resolver::ResolveStatic(cls, 9110 Resolver::ResolveStatic(cls,
9110 func_name, 9111 func_name,
9111 arguments->length(), 9112 arguments->length(),
9112 arguments->names())); 9113 arguments->names()));
9113 ASSERT(!func.IsNull()); 9114 ASSERT(!func.IsNull());
9114 return new(Z) StaticCallNode(arguments->token_pos(), func, arguments); 9115 return new(Z) StaticCallNode(arguments->token_pos(), func, arguments);
9115 } 9116 }
9116 9117
9117 9118
9118 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) { 9119 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end,
9120 AstNode* message) {
9119 ArgumentListNode* arguments = new(Z) ArgumentListNode(begin); 9121 ArgumentListNode* arguments = new(Z) ArgumentListNode(begin);
9120 arguments->Add(new(Z) LiteralNode(begin, 9122 arguments->Add(new(Z) LiteralNode(begin,
9121 Integer::ZoneHandle(Z, Integer::New(begin)))); 9123 Integer::ZoneHandle(Z, Integer::New(begin))));
9122 arguments->Add(new(Z) LiteralNode(end, 9124 arguments->Add(new(Z) LiteralNode(end,
9123 Integer::ZoneHandle(Z, Integer::New(end)))); 9125 Integer::ZoneHandle(Z, Integer::New(end))));
9126 if (message == NULL) {
9127 message = new(Z) LiteralNode(end, Instance::ZoneHandle(Z));
9128 }
9129 arguments->Add(message);
9124 return MakeStaticCall(Symbols::AssertionError(), 9130 return MakeStaticCall(Symbols::AssertionError(),
9125 Library::PrivateCoreLibName(Symbols::ThrowNew()), 9131 Library::PrivateCoreLibName(Symbols::ThrowNew()),
9126 arguments); 9132 arguments);
9127 } 9133 }
9128 9134
9129 9135
9130 AstNode* Parser::InsertClosureCallNodes(AstNode* condition) { 9136 AstNode* Parser::InsertClosureCallNodes(AstNode* condition) {
9131 if (condition->IsClosureNode() || 9137 if (condition->IsClosureNode() ||
9132 (condition->IsStoreLocalNode() && 9138 (condition->IsStoreLocalNode() &&
9133 condition->AsStoreLocalNode()->value()->IsClosureNode())) { 9139 condition->AsStoreLocalNode()->value()->IsClosureNode())) {
9134 // Function literal in assert implies a call. 9140 // Function literal in assert implies a call.
9135 const intptr_t pos = condition->token_pos(); 9141 const intptr_t pos = condition->token_pos();
9136 condition = BuildClosureCall(pos, 9142 condition = BuildClosureCall(pos,
9137 condition, 9143 condition,
9138 new(Z) ArgumentListNode(pos)); 9144 new(Z) ArgumentListNode(pos));
9139 } else if (condition->IsConditionalExprNode()) { 9145 } else if (condition->IsConditionalExprNode()) {
9140 ConditionalExprNode* cond_expr = condition->AsConditionalExprNode(); 9146 ConditionalExprNode* cond_expr = condition->AsConditionalExprNode();
9141 cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr())); 9147 cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr()));
9142 cond_expr->set_false_expr(InsertClosureCallNodes(cond_expr->false_expr())); 9148 cond_expr->set_false_expr(InsertClosureCallNodes(cond_expr->false_expr()));
9143 } 9149 }
9144 return condition; 9150 return condition;
9145 } 9151 }
9146 9152
9147 9153
9148 AstNode* Parser::ParseAssertStatement() { 9154 AstNode* Parser::ParseAssertStatement() {
9149 TRACE_PARSER("ParseAssertStatement"); 9155 TRACE_PARSER("ParseAssertStatement");
9150 ConsumeToken(); // Consume assert keyword. 9156 ConsumeToken(); // Consume assert keyword.
9151 ExpectToken(Token::kLPAREN); 9157 ExpectToken(Token::kLPAREN);
9152 const intptr_t condition_pos = TokenPos(); 9158 const intptr_t condition_pos = TokenPos();
9153 if (!I->flags().asserts() && !I->flags().type_checks()) { 9159 if (!I->flags().asserts() && !I->flags().type_checks()) {
Ivan Posva 2015/09/04 06:39:31 This line here testing the flag configuration is w
9154 SkipExpr(); 9160 SkipExpr();
9161 if (FLAG_assert_message && CurrentToken() == Token::kCOMMA) {
9162 ConsumeToken();
9163 SkipExpr();
9164 }
9155 ExpectToken(Token::kRPAREN); 9165 ExpectToken(Token::kRPAREN);
9156 return NULL; 9166 return NULL;
9157 } 9167 }
9158 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); 9168 AstNode* condition = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
9169 AstNode* message = NULL;
9159 const intptr_t condition_end = TokenPos(); 9170 const intptr_t condition_end = TokenPos();
9171 if (FLAG_assert_message && CurrentToken() == Token::kCOMMA) {
9172 ConsumeToken();
9173 message = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
9174 }
9160 ExpectToken(Token::kRPAREN); 9175 ExpectToken(Token::kRPAREN);
9161 condition = InsertClosureCallNodes(condition); 9176 condition = InsertClosureCallNodes(condition);
9162 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition); 9177 condition = new(Z) UnaryOpNode(condition_pos, Token::kNOT, condition);
9163 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end); 9178 AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end, message);
9164 return new(Z) IfNode( 9179 return new(Z) IfNode(
9165 condition_pos, 9180 condition_pos,
9166 condition, 9181 condition,
9167 NodeAsSequenceNode(condition_pos, assert_throw, NULL), 9182 NodeAsSequenceNode(condition_pos, assert_throw, NULL),
9168 NULL); 9183 NULL);
9169 } 9184 }
9170 9185
9171 9186
9172 // Populate local scope of the catch block with the catch parameters. 9187 // Populate local scope of the catch block with the catch parameters.
9173 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, 9188 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param,
(...skipping 5115 matching lines...) Expand 10 before | Expand all | Expand 10 after
14289 void Parser::SkipQualIdent() { 14304 void Parser::SkipQualIdent() {
14290 ASSERT(IsIdentifier()); 14305 ASSERT(IsIdentifier());
14291 ConsumeToken(); 14306 ConsumeToken();
14292 if (CurrentToken() == Token::kPERIOD) { 14307 if (CurrentToken() == Token::kPERIOD) {
14293 ConsumeToken(); // Consume the kPERIOD token. 14308 ConsumeToken(); // Consume the kPERIOD token.
14294 ExpectIdentifier("identifier expected after '.'"); 14309 ExpectIdentifier("identifier expected after '.'");
14295 } 14310 }
14296 } 14311 }
14297 14312
14298 } // namespace dart 14313 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698