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

Unified Diff: runtime/vm/parser.cc

Issue 634603002: Await always waits (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 41104)
+++ runtime/vm/parser.cc (working copy)
@@ -2925,18 +2925,6 @@
}
-// TODO(mlippautz): Once we know where these classes should come from, adjust
-// how we get their definition.
-RawClass* Parser::GetClassForAsync(const String& class_name) {
- const Class& cls = Class::Handle(library_.LookupClass(class_name));
- if (cls.IsNull()) {
- ReportError("async modifier requires dart:async to be imported without "
- "prefix");
- }
- return cls.raw();
-}
-
-
// Parser is at the opening parenthesis of the formal parameter
// declaration of the function or constructor.
// Parse the formal parameters and code.
@@ -3087,9 +3075,7 @@
}
bool saved_await_is_keyword = await_is_keyword_;
- if (func.IsAsyncFunction() || func.is_async_closure()) {
- await_is_keyword_ = true;
- }
+ await_is_keyword_ = func.IsAsyncFunction() || func.is_async_closure();
intptr_t end_token_pos = 0;
if (CurrentToken() == Token::kLBRACE) {
@@ -4068,8 +4054,7 @@
}
Class& cls = Class::Handle(I);
TypeArguments& orig_type_parameters = TypeArguments::Handle(I);
- Object& obj = Object::Handle(I,
- library_.LookupLocalObject(class_name));
+ Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
if (obj.IsNull()) {
if (is_patch) {
ReportError(classname_pos, "missing class '%s' cannot be patched",
@@ -4276,8 +4261,7 @@
if (cls.is_patch()) {
// Apply the changes to the patched class looked up above.
- Object& obj = Object::Handle(I,
- library_.LookupLocalObject(class_name));
+ Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
// The patched class must not be finalized yet.
const Class& orig_class = Class::Cast(obj);
ASSERT(!orig_class.is_finalized());
@@ -4372,8 +4356,7 @@
OS::Print("toplevel parsing mixin application alias class '%s'\n",
class_name.ToCString());
}
- const Object& obj = Object::Handle(I,
- library_.LookupLocalObject(class_name));
+ const Object& obj = Object::Handle(I, library_.LookupLocalObject(class_name));
if (!obj.IsNull()) {
ReportError(classname_pos, "'%s' is already defined",
class_name.ToCString());
@@ -4494,8 +4477,8 @@
// Lookup alias name and report an error if it is already defined in
// the library scope.
- const Object& obj = Object::Handle(I,
- library_.LookupLocalObject(*alias_name));
+ const Object& obj =
+ Object::Handle(I, library_.LookupLocalObject(*alias_name));
if (!obj.IsNull()) {
ReportError(alias_name_pos,
"'%s' is already defined", alias_name->ToCString());
@@ -4560,8 +4543,8 @@
// Lookup the signature class, i.e. the class whose name is the signature.
// We only lookup in the current library, but not in its imports, and only
// create a new canonical signature class if it does not exist yet.
- Class& signature_class = Class::ZoneHandle(I,
- library_.LookupLocalClass(signature));
+ Class& signature_class =
+ Class::ZoneHandle(I, library_.LookupLocalClass(signature));
if (signature_class.IsNull()) {
signature_class = Class::NewSignatureClass(signature,
signature_function,
@@ -4906,11 +4889,12 @@
RawFunction::AsyncModifier Parser::ParseFunctionModifier() {
- if (FLAG_enable_async) {
- if (CurrentLiteral()->raw() == Symbols::Async().raw()) {
- ConsumeToken();
- return RawFunction::kAsync;
+ if (CurrentLiteral()->raw() == Symbols::Async().raw()) {
+ if (!FLAG_enable_async) {
+ ReportError("use flag --enable-async to enable async/await features");
}
+ ConsumeToken();
+ return RawFunction::kAsync;
}
return RawFunction::kNoModifier;
}
@@ -5885,14 +5869,14 @@
// No need to capture parameters or other variables, since they have already
// been captured in the corresponding scope as the body has been parsed within
// a nested block (contained in the async funtion's block).
- const Class& future = Class::ZoneHandle(I,
- GetClassForAsync(Symbols::Future()));
+ const Class& future =
+ Class::ZoneHandle(I, I->object_store()->future_class());
ASSERT(!future.IsNull());
const Function& constructor = Function::ZoneHandle(I,
future.LookupFunction(Symbols::FutureConstructor()));
ASSERT(!constructor.IsNull());
- const Class& completer = Class::ZoneHandle(I,
- GetClassForAsync(Symbols::Completer()));
+ const Class& completer =
+ Class::ZoneHandle(I, I->object_store()->completer_class());
ASSERT(!completer.IsNull());
const Function& completer_constructor = Function::ZoneHandle(I,
completer.LookupFunction(Symbols::CompleterConstructor()));
@@ -6614,7 +6598,7 @@
// Returns true if the current token is kIDENT or a pseudo-keyword.
bool Parser::IsIdentifier() {
- return Token::IsIdentifier(CurrentToken()) && !IsAwaitAsKeyword();
+ return Token::IsIdentifier(CurrentToken()) && !IsAwaitKeyword();
}
@@ -6763,8 +6747,7 @@
(CurrentToken() == Token::kARROW) ||
(is_top_level_ && IsLiteral("native")) ||
is_external ||
- (FLAG_enable_async &&
- CurrentLiteral()->raw() == Symbols::Async().raw())) {
+ (CurrentLiteral()->raw() == Symbols::Async().raw())) {
SetPosition(saved_pos);
return true;
}
@@ -8309,7 +8292,7 @@
}
-bool Parser::IsAwaitAsKeyword() {
+bool Parser::IsAwaitKeyword() {
return await_is_keyword_ &&
(CurrentLiteral()->raw() == Symbols::Await().raw());
}
@@ -8874,7 +8857,6 @@
// are created.
OpenBlock();
AwaitTransformer at(current_block_->statements,
- library_,
parsed_function(),
async_temp_scope_);
AstNode* result = at.Transform(expr);
@@ -8985,7 +8967,7 @@
TRACE_PARSER("ParseUnaryExpr");
AstNode* expr = NULL;
const intptr_t op_pos = TokenPos();
- if (IsAwaitAsKeyword()) {
+ if (IsAwaitKeyword()) {
TRACE_PARSER("ParseAwaitExpr");
ConsumeToken();
parsed_function()->record_await();
« 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