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

Unified Diff: runtime/vm/parser.cc

Issue 2416513003: Fix issues with argument evaluation order and noSuchMethod errors. (Closed)
Patch Set: Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | tests/language/deferred_not_loaded_check_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index cb9c620101ec318ff2baffb48bf4f5a698cea49e..9b77ca031a15d44f531e3649116d80324dce049e 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -11278,18 +11278,18 @@ AstNode* Parser::CreateAssignmentNode(AstNode* original,
if (name.IsNull()) {
ReportError(left_pos, "expression is not assignable");
}
- LetNode* let_node = new(Z) LetNode(left_pos);
- let_node->AddInitializer(rhs);
- let_node->AddNode(ThrowNoSuchMethodError(
+ ArgumentListNode* error_arguments =
+ new(Z) ArgumentListNode(rhs->token_pos());
+ error_arguments->Add(rhs);
+ result = ThrowNoSuchMethodError(
original->token_pos(),
*target_cls,
String::Handle(Z, Field::SetterName(name)),
- NULL, // No arguments.
+ error_arguments,
InvocationMirror::kStatic,
original->IsLoadLocalNode() ?
InvocationMirror::kLocalVar : InvocationMirror::kSetter,
- NULL)); // No existing function.
- result = let_node;
+ NULL); // No existing function.
}
// The compound assignment operator a ??= b is different from other
// a op= b assignments. If a is non-null, the assignment to a must be
@@ -13947,6 +13947,15 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
const Error& error = Error::Handle(Z, type.error());
ReportError(error);
}
+ if (arguments->length() > 0) {
+ // Evaluate arguments for side-effects and throw.
+ LetNode* error_result = new(Z) LetNode(type_pos);
+ for (intptr_t i = 0; i < arguments->length(); ++i) {
+ error_result->AddNode(arguments->NodeAt(i));
+ }
+ error_result->AddNode(ThrowTypeError(type_pos, type));
+ return error_result;
+ }
return ThrowTypeError(type_pos, type);
}
@@ -14439,32 +14448,13 @@ AstNode* Parser::ParsePrimary() {
ConsumeToken(); // Prefix name.
primary = new(Z) LiteralNode(qual_ident_pos, prefix);
} else {
- // TODO(hausner): Ideally we should generate the NoSuchMethodError
- // later, when we know more about how the unresolved name is used.
- // For example, we don't know yet whether the unresolved name
- // refers to a getter or a setter. However, it is more awkward
- // to distinuish four NoSuchMethodError cases all over the place
- // in the parser. The four cases are: prefixed vs non-prefixed
- // name, static vs dynamic context in which the unresolved name
- // is used. We cheat a little here by looking at the next token
- // to determine whether we have an unresolved method call or
- // field access.
GrowableHandlePtrArray<const String> pieces(Z, 3);
pieces.Add(String::Handle(Z, prefix.name()));
pieces.Add(Symbols::Dot());
pieces.Add(ident);
const String& qualified_name = String::ZoneHandle(Z,
Symbols::FromConcatAll(T, pieces));
- InvocationMirror::Type call_type =
- CurrentToken() == Token::kLPAREN ?
- InvocationMirror::kMethod : InvocationMirror::kGetter;
- primary = ThrowNoSuchMethodError(qual_ident_pos,
- current_class(),
- qualified_name,
- NULL, // No arguments.
- InvocationMirror::kTopLevel,
- call_type,
- NULL); // No existing function.
+ primary = new(Z) PrimaryNode(qual_ident_pos, qualified_name);
}
} else if (FLAG_load_deferred_eagerly && prefix.is_deferred_load()) {
// primary != NULL.
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | tests/language/deferred_not_loaded_check_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698