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

Unified 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: More tests. Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 7829fd6649a6beabf94128613d149f589b16b56b..778a338d6c6714bc5b28ccd343b358d368ac2a85 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -71,6 +71,7 @@ DEFINE_FLAG(bool,
assert_initializer,
false,
"Allow asserts in initializer lists.");
+DEFINE_FLAG(bool, assert_message, false, "Allow message in assert statements");
DECLARE_FLAG(bool, profile_vm);
DECLARE_FLAG(bool, trace_service);
@@ -9189,6 +9190,24 @@ AstNode* Parser::MakeStaticCall(const String& cls_name,
}
+AstNode* Parser::MakeAssertCall(TokenPosition begin,
+ TokenPosition end,
+ AstNode* message) {
+ ArgumentListNode* arguments = new (Z) ArgumentListNode(begin);
+ arguments->Add(new (Z) LiteralNode(
+ begin, Integer::ZoneHandle(Z, Integer::New(begin.Pos()))));
+ arguments->Add(new (Z) LiteralNode(
+ end, Integer::ZoneHandle(Z, Integer::New(end.Pos()))));
+ if (message == NULL) {
+ message = new (Z) LiteralNode(end, Instance::ZoneHandle(Z));
+ }
+ arguments->Add(message);
+ return MakeStaticCall(Symbols::AssertionError(),
+ Library::PrivateCoreLibName(Symbols::ThrowNew()),
+ arguments);
+}
+
+
AstNode* Parser::ParseAssertStatement(bool is_const) {
TRACE_PARSER("ParseAssertStatement");
ConsumeToken(); // Consume assert keyword.
@@ -9196,6 +9215,10 @@ AstNode* Parser::ParseAssertStatement(bool is_const) {
const TokenPosition condition_pos = TokenPos();
if (!I->asserts()) {
SkipExpr();
+ if (FLAG_assert_message && CurrentToken() == Token::kCOMMA) {
+ ConsumeToken();
+ SkipExpr();
+ }
ExpectToken(Token::kRPAREN);
return NULL;
}
@@ -9205,23 +9228,36 @@ AstNode* Parser::ParseAssertStatement(bool is_const) {
"initializer assert expression must be compile time constant.");
}
const TokenPosition condition_end = TokenPos();
+ AstNode* message = NULL;
+ TokenPosition message_pos = TokenPosition::kNoSource;
+ if (FLAG_assert_message && CurrentToken() == Token::kCOMMA) {
+ ConsumeToken();
+ message_pos = TokenPos();
+ message = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
+ if (is_const && !message->IsPotentiallyConst()) {
+ ReportError(
+ message_pos,
+ "initializer assert expression must be compile time constant.");
+ }
+ }
ExpectToken(Token::kRPAREN);
- ArgumentListNode* arguments = new (Z) ArgumentListNode(condition_pos);
- arguments->Add(condition);
- arguments->Add(new (Z) LiteralNode(
- condition_pos,
- Integer::ZoneHandle(Z, Integer::New(condition_pos.value(), Heap::kOld))));
- arguments->Add(new (Z) LiteralNode(
- condition_end,
- Integer::ZoneHandle(Z, Integer::New(condition_end.value(), Heap::kOld))));
- AstNode* assert_throw = MakeStaticCall(
- Symbols::AssertionError(),
- Library::PrivateCoreLibName(is_const ? Symbols::CheckConstAssertion()
- : Symbols::CheckAssertion()),
- arguments);
-
- return assert_throw;
+ if (!is_const) {
+ // Check for being a function if not const.
+ ArgumentListNode* arguments = new (Z) ArgumentListNode(condition_pos);
+ arguments->Add(condition);
+ condition = MakeStaticCall(
+ Symbols::AssertionError(),
+ Library::PrivateCoreLibName(Symbols::CheckAssertion()), arguments);
+ }
+ AstNode* not_condition =
+ new (Z) UnaryOpNode(condition_pos, Token::kNOT, condition);
+ AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end, message);
+ return new (Z)
+ IfNode(condition_pos, not_condition,
+ NodeAsSequenceNode((message == NULL) ? condition_pos : message_pos,
+ assert_throw, NULL),
+ NULL);
}
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | sdk/lib/core/errors.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698