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

Unified Diff: src/parser.cc

Issue 1423663006: [es7] Implement async functions parsing Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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 | « src/objects-inl.h ('k') | src/preparser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index f0affc27985c5e8b68f7bfbd3e94755e9cb96426..62a7468ab6f671d45bad5f95c0b7c230611c6330 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -927,6 +927,7 @@ Parser::Parser(ParseInfo* info)
set_allow_strong_mode(FLAG_strong_mode);
set_allow_legacy_const(FLAG_legacy_const);
set_allow_harmony_do_expressions(FLAG_harmony_do_expressions);
+ set_allow_harmony_async_await(FLAG_harmony_async_await);
for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
++feature) {
use_counts_[feature] = 0;
@@ -1408,6 +1409,11 @@ Statement* Parser::ParseStatementListItem(bool* ok) {
}
switch (peek()) {
+ case Token::ASYNC:
+ if (allow_harmony_async_await() && IsNextAsyncFunctionKeyword()) {
+ return ParseFunctionDeclaration(NULL, ok);
+ }
+ break;
case Token::FUNCTION:
return ParseFunctionDeclaration(NULL, ok);
case Token::CLASS:
@@ -2229,12 +2235,16 @@ Statement* Parser::ParseFunctionDeclaration(
ZoneList<const AstRawString*>* names, bool* ok) {
// FunctionDeclaration ::
// 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
+ // AsyncFunctionDeclaration ::
+ // 'async' 'function' Identifier '(' FormalParameterListopt ')'
+ // '{' FunctionBody '}'
// GeneratorDeclaration ::
// 'function' '*' Identifier '(' FormalParameterListopt ')'
// '{' FunctionBody '}'
+ bool is_async = allow_harmony_async_await() ? Check(Token::ASYNC) : false;
Expect(Token::FUNCTION, CHECK_OK);
int pos = position();
- bool is_generator = Check(Token::MUL);
+ bool is_generator = is_async ? false : Check(Token::MUL);
bool is_strict_reserved = false;
const AstRawString* name = ParseIdentifierOrStrictReservedWord(
&is_strict_reserved, CHECK_OK);
@@ -2243,13 +2253,19 @@ Statement* Parser::ParseFunctionDeclaration(
fni_->Enter();
fni_->PushEnclosingName(name);
}
+
+ FunctionKind kind = FunctionKind::kNormalFunction;
+ if (is_generator) {
+ kind = FunctionKind::kGeneratorFunction;
+ } else if (is_async) {
+ kind = FunctionKind::kAsyncFunction;
+ }
+
FunctionLiteral* fun = ParseFunctionLiteral(
name, scanner()->location(),
is_strict_reserved ? kFunctionNameIsStrictReserved
: kFunctionNameValidityUnknown,
- is_generator ? FunctionKind::kGeneratorFunction
- : FunctionKind::kNormalFunction,
- pos, FunctionLiteral::DECLARATION, FunctionLiteral::NORMAL_ARITY,
+ kind, pos, FunctionLiteral::DECLARATION, FunctionLiteral::NORMAL_ARITY,
language_mode(), CHECK_OK);
if (fni_ != NULL) fni_->Leave();
@@ -4818,6 +4834,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
SET_ALLOW(harmony_new_target);
SET_ALLOW(strong_mode);
SET_ALLOW(harmony_do_expressions);
+ SET_ALLOW(harmony_async_await);
#undef SET_ALLOW
}
PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction(
« no previous file with comments | « src/objects-inl.h ('k') | src/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698