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

Side by Side Diff: src/parsing/parser-base.h

Issue 1895603002: [esnext] prototype runtime implementation for async functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@AsyncFunction
Patch Set: remove weird arrow-generator thing Created 4 years, 7 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/hashmap.h" 10 #include "src/hashmap.h"
(...skipping 18 matching lines...) Expand all
29 kDisallowLabelledFunctionStatement, 29 kDisallowLabelledFunctionStatement,
30 }; 30 };
31 31
32 enum class ParseFunctionFlags { 32 enum class ParseFunctionFlags {
33 kIsNormal = 0, 33 kIsNormal = 0,
34 kIsGenerator = 1, 34 kIsGenerator = 1,
35 kIsAsync = 2, 35 kIsAsync = 2,
36 kIsDefault = 4 36 kIsDefault = 4
37 }; 37 };
38 38
39 enum class FunctionBody {
40 Normal,
41 ArrowBlock = Normal,
neis 2016/05/11 09:45:16 I find that confusing.
42 ArrowConcise,
43 };
44
45 enum class FunctionParsePhase { Unknown, FormalParameters, FunctionBody };
46
39 static inline ParseFunctionFlags operator|(ParseFunctionFlags lhs, 47 static inline ParseFunctionFlags operator|(ParseFunctionFlags lhs,
40 ParseFunctionFlags rhs) { 48 ParseFunctionFlags rhs) {
41 typedef unsigned char T; 49 typedef unsigned char T;
42 return static_cast<ParseFunctionFlags>(static_cast<T>(lhs) | 50 return static_cast<ParseFunctionFlags>(static_cast<T>(lhs) |
43 static_cast<T>(rhs)); 51 static_cast<T>(rhs));
44 } 52 }
45 53
46 static inline ParseFunctionFlags& operator|=(ParseFunctionFlags& lhs, 54 static inline ParseFunctionFlags& operator|=(ParseFunctionFlags& lhs,
47 const ParseFunctionFlags& rhs) { 55 const ParseFunctionFlags& rhs) {
48 lhs = lhs | rhs; 56 lhs = lhs | rhs;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 void set_return_location(Scanner::Location location) { 306 void set_return_location(Scanner::Location location) {
299 return_location_ = location; 307 return_location_ = location;
300 } 308 }
301 309
302 bool is_generator() const { return IsGeneratorFunction(kind_); } 310 bool is_generator() const { return IsGeneratorFunction(kind_); }
303 bool is_async_function() const { return IsAsyncFunction(kind_); } 311 bool is_async_function() const { return IsAsyncFunction(kind_); }
304 312
305 FunctionKind kind() const { return kind_; } 313 FunctionKind kind() const { return kind_; }
306 FunctionState* outer() const { return outer_function_state_; } 314 FunctionState* outer() const { return outer_function_state_; }
307 315
316 bool is_async_function_body() const {
317 return is_async_function() &&
318 parse_phase() == FunctionParsePhase::FunctionBody;
319 }
320
321 FunctionParsePhase parse_phase() const { return parse_phase_; }
322
323 void set_parse_phase(FunctionParsePhase parse_phase) {
324 parse_phase_ = parse_phase;
325 }
326
308 void set_generator_object_variable( 327 void set_generator_object_variable(
309 typename Traits::Type::GeneratorVariable* variable) { 328 typename Traits::Type::GeneratorVariable* variable) {
310 DCHECK(variable != NULL); 329 DCHECK(variable != NULL);
311 DCHECK(is_generator()); 330 DCHECK(is_generator() || is_async_function());
neis 2016/05/11 09:45:16 Didn't you introduce a function for this?
312 generator_object_variable_ = variable; 331 generator_object_variable_ = variable;
313 } 332 }
314 typename Traits::Type::GeneratorVariable* generator_object_variable() 333 typename Traits::Type::GeneratorVariable* generator_object_variable()
315 const { 334 const {
316 return generator_object_variable_; 335 return generator_object_variable_;
317 } 336 }
318 337
319 typename Traits::Type::Factory* factory() { return factory_; } 338 typename Traits::Type::Factory* factory() { return factory_; }
320 339
321 const List<DestructuringAssignment>& destructuring_assignments_to_rewrite() 340 const List<DestructuringAssignment>& destructuring_assignments_to_rewrite()
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 typename Traits::Type::Factory* factory_; 423 typename Traits::Type::Factory* factory_;
405 424
406 // If true, the next (and immediately following) function literal is 425 // If true, the next (and immediately following) function literal is
407 // preceded by a parenthesis. 426 // preceded by a parenthesis.
408 bool next_function_is_parenthesized_; 427 bool next_function_is_parenthesized_;
409 428
410 // The value of the parents' next_function_is_parenthesized_, as it applies 429 // The value of the parents' next_function_is_parenthesized_, as it applies
411 // to this function. Filled in by constructor. 430 // to this function. Filled in by constructor.
412 bool this_function_is_parenthesized_; 431 bool this_function_is_parenthesized_;
413 432
433 FunctionParsePhase parse_phase_ = FunctionParsePhase::Unknown;
434
414 friend class ParserTraits; 435 friend class ParserTraits;
415 friend class PreParserTraits; 436 friend class PreParserTraits;
416 friend class Checkpoint; 437 friend class Checkpoint;
417 }; 438 };
418 439
419 // This scope sets current ReturnExprContext to given value. 440 // This scope sets current ReturnExprContext to given value.
420 class ReturnExprScope { 441 class ReturnExprScope {
421 public: 442 public:
422 explicit ReturnExprScope(FunctionState* function_state, 443 explicit ReturnExprScope(FunctionState* function_state,
423 ReturnExprContext return_expr_context) 444 ReturnExprContext return_expr_context)
(...skipping 1725 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 parenthesized_formals, is_async, CHECK_OK); 2170 parenthesized_formals, is_async, CHECK_OK);
2150 // This reads strangely, but is correct: it checks whether any 2171 // This reads strangely, but is correct: it checks whether any
2151 // sub-expression of the parameter list failed to be a valid formal 2172 // sub-expression of the parameter list failed to be a valid formal
2152 // parameter initializer. Since YieldExpressions are banned anywhere 2173 // parameter initializer. Since YieldExpressions are banned anywhere
2153 // in an arrow parameter list, this is correct. 2174 // in an arrow parameter list, this is correct.
2154 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to 2175 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to
2155 // "YieldExpression", which is its only use. 2176 // "YieldExpression", which is its only use.
2156 ValidateFormalParameterInitializer(&arrow_formals_classifier, ok); 2177 ValidateFormalParameterInitializer(&arrow_formals_classifier, ok);
2157 2178
2158 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); 2179 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos);
2159 Scope* scope = 2180 Scope* scope = this->NewScope(scope_, FUNCTION_SCOPE,
2160 this->NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction); 2181 is_async ? FunctionKind::kAsyncArrowFunction
2182 : FunctionKind::kArrowFunction);
2161 // Because the arrow's parameters were parsed in the outer scope, any 2183 // Because the arrow's parameters were parsed in the outer scope, any
2162 // usage flags that might have been triggered there need to be copied 2184 // usage flags that might have been triggered there need to be copied
2163 // to the arrow scope. 2185 // to the arrow scope.
2164 scope_->PropagateUsageFlagsToScope(scope); 2186 scope_->PropagateUsageFlagsToScope(scope);
2165 FormalParametersT parameters(scope); 2187 FormalParametersT parameters(scope);
2166 if (!arrow_formals_classifier.is_simple_parameter_list()) { 2188 if (!arrow_formals_classifier.is_simple_parameter_list()) {
2167 scope->SetHasNonSimpleParameters(); 2189 scope->SetHasNonSimpleParameters();
2168 parameters.is_simple = false; 2190 parameters.is_simple = false;
2169 } 2191 }
2170 2192
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
2574 2596
2575 return this->ExpressionFromIdentifier( 2597 return this->ExpressionFromIdentifier(
2576 name, beg_pos, scanner()->location().end_pos, scope_, factory()); 2598 name, beg_pos, scanner()->location().end_pos, scope_, factory());
2577 } 2599 }
2578 default: 2600 default:
2579 break; 2601 break;
2580 } 2602 }
2581 Consume(Token::AWAIT); 2603 Consume(Token::AWAIT);
2582 2604
2583 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK); 2605 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK);
2584 classifier->RecordFormalParameterInitializerError( 2606 if (!function_state_->is_async_function_body()) {
2585 Scanner::Location(beg_pos, scanner()->location().end_pos), 2607 // Not currently parsing function body --- must have occurred within
2586 MessageTemplate::kAwaitExpressionFormalParameter); 2608 // formal parameter parsing.
2587 2609 ReportMessageAt(Scanner::Location(beg_pos, scanner()->location().end_pos),
2610 MessageTemplate::kAwaitExpressionFormalParameter);
2611 *ok = false;
2612 return this->EmptyExpression();
2613 }
2588 return Traits::RewriteAwaitExpression(value, beg_pos); 2614 return Traits::RewriteAwaitExpression(value, beg_pos);
2589 } else { 2615 } else {
2590 return this->ParsePostfixExpression(classifier, ok); 2616 return this->ParsePostfixExpression(classifier, ok);
2591 } 2617 }
2592 } 2618 }
2593 2619
2594 2620
2595 template <class Traits> 2621 template <class Traits>
2596 typename ParserBase<Traits>::ExpressionT 2622 typename ParserBase<Traits>::ExpressionT
2597 ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier, 2623 ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier,
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 *ok = false; 3201 *ok = false;
3176 return this->EmptyExpression(); 3202 return this->EmptyExpression();
3177 } 3203 }
3178 3204
3179 typename Traits::Type::StatementList body; 3205 typename Traits::Type::StatementList body;
3180 int num_parameters = formal_parameters.scope->num_parameters(); 3206 int num_parameters = formal_parameters.scope->num_parameters();
3181 int materialized_literal_count = -1; 3207 int materialized_literal_count = -1;
3182 int expected_property_count = -1; 3208 int expected_property_count = -1;
3183 Scanner::Location super_loc; 3209 Scanner::Location super_loc;
3184 3210
3211 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction;
3185 { 3212 {
3186 typename Traits::Type::Factory function_factory(ast_value_factory()); 3213 typename Traits::Type::Factory function_factory(ast_value_factory());
3187 FunctionState function_state( 3214 FunctionState function_state(&function_state_, &scope_,
3188 &function_state_, &scope_, formal_parameters.scope, 3215 formal_parameters.scope, arrow_kind,
3189 is_async ? kAsyncArrowFunction : kArrowFunction, &function_factory); 3216 &function_factory);
3190 3217
3191 function_state.SkipMaterializedLiterals( 3218 function_state.SkipMaterializedLiterals(
3192 formal_parameters.materialized_literals_count); 3219 formal_parameters.materialized_literals_count);
3193 3220
3194 this->ReindexLiterals(formal_parameters); 3221 this->ReindexLiterals(formal_parameters);
3195 3222
3196 Expect(Token::ARROW, CHECK_OK); 3223 Expect(Token::ARROW, CHECK_OK);
3224 function_state.set_parse_phase(FunctionParsePhase::FunctionBody);
3197 3225
3198 if (peek() == Token::LBRACE) { 3226 if (peek() == Token::LBRACE) {
3199 // Multiple statement body 3227 // Multiple statement body
3200 Consume(Token::LBRACE); 3228 Consume(Token::LBRACE);
3201 bool is_lazily_parsed = 3229 bool is_lazily_parsed =
3202 (mode() == PARSE_LAZILY && scope_->AllowsLazyParsing()); 3230 (mode() == PARSE_LAZILY && scope_->AllowsLazyParsing());
3203 if (is_lazily_parsed) { 3231 if (is_lazily_parsed) {
3204 body = this->NewStatementList(0, zone()); 3232 body = this->NewStatementList(0, zone());
3205 this->SkipLazyFunctionBody(&materialized_literal_count, 3233 this->SkipLazyFunctionBody(&materialized_literal_count,
3206 &expected_property_count, CHECK_OK); 3234 &expected_property_count, CHECK_OK);
3207 if (formal_parameters.materialized_literals_count > 0) { 3235 if (formal_parameters.materialized_literals_count > 0) {
3208 materialized_literal_count += 3236 materialized_literal_count +=
3209 formal_parameters.materialized_literals_count; 3237 formal_parameters.materialized_literals_count;
3210 } 3238 }
3211 } else { 3239 } else {
3212 body = this->ParseEagerFunctionBody( 3240 body = this->ParseEagerFunctionBody(
3213 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters, 3241 this->EmptyIdentifier(), RelocInfo::kNoPosition, formal_parameters,
3214 kArrowFunction, FunctionLiteral::kAnonymousExpression, CHECK_OK); 3242 arrow_kind, FunctionLiteral::kAnonymousExpression, CHECK_OK);
3215 materialized_literal_count = 3243 materialized_literal_count =
3216 function_state.materialized_literal_count(); 3244 function_state.materialized_literal_count();
3217 expected_property_count = function_state.expected_property_count(); 3245 expected_property_count = function_state.expected_property_count();
3218 } 3246 }
3219 } else { 3247 } else {
3220 // Single-expression body 3248 // Single-expression body
3221 int pos = position(); 3249 int pos = position();
3222 ExpressionClassifier classifier(this); 3250 ExpressionClassifier classifier(this);
3223 DCHECK(ReturnExprContext::kInsideValidBlock == 3251 DCHECK(ReturnExprContext::kInsideValidBlock ==
3224 function_state_->return_expr_context()); 3252 function_state_->return_expr_context());
3225 ReturnExprScope allow_tail_calls( 3253 ReturnExprScope allow_tail_calls(
3226 function_state_, ReturnExprContext::kInsideValidReturnStatement); 3254 function_state_, ReturnExprContext::kInsideValidReturnStatement);
3227 ExpressionT expression =
3228 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK);
3229 Traits::RewriteNonPattern(&classifier, CHECK_OK);
3230 body = this->NewStatementList(1, zone()); 3255 body = this->NewStatementList(1, zone());
3231 this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK); 3256 this->AddParameterInitializationBlock(formal_parameters, body, is_async,
3232 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 3257 CHECK_OK);
3258 if (is_async) {
3259 this->ParseAsyncArrowSingleExpressionBody(body, accept_IN, &classifier,
3260 pos, CHECK_OK);
3261 Traits::RewriteNonPattern(&classifier, CHECK_OK);
3262 } else {
3263 ExpressionT expression =
3264 ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK);
3265 Traits::RewriteNonPattern(&classifier, CHECK_OK);
3266 body->Add(factory()->NewReturnStatement(expression, pos), zone());
3267 if (allow_tailcalls() && !is_sloppy(language_mode())) {
3268 // ES6 14.6.1 Static Semantics: IsInTailPosition
3269 this->MarkTailPosition(expression);
3270 }
3271 }
3233 materialized_literal_count = function_state.materialized_literal_count(); 3272 materialized_literal_count = function_state.materialized_literal_count();
3234 expected_property_count = function_state.expected_property_count(); 3273 expected_property_count = function_state.expected_property_count();
3235 if (allow_tailcalls() && !is_sloppy(language_mode())) {
3236 // ES6 14.6.1 Static Semantics: IsInTailPosition
3237 this->MarkTailPosition(expression);
3238 }
3239 this->MarkCollectedTailCallExpressions(); 3274 this->MarkCollectedTailCallExpressions();
3240 } 3275 }
3241 super_loc = function_state.super_location(); 3276 super_loc = function_state.super_location();
3242 3277
3243 formal_parameters.scope->set_end_position(scanner()->location().end_pos); 3278 formal_parameters.scope->set_end_position(scanner()->location().end_pos);
3244 3279
3245 // Arrow function formal parameters are parsed as StrictFormalParameterList, 3280 // Arrow function formal parameters are parsed as StrictFormalParameterList,
3246 // which is not the same as "parameters of a strict function"; it only means 3281 // which is not the same as "parameters of a strict function"; it only means
3247 // that duplicates are not allowed. Of course, the arrow function may 3282 // that duplicates are not allowed. Of course, the arrow function may
3248 // itself be strict as well. 3283 // itself be strict as well.
3249 const bool allow_duplicate_parameters = false; 3284 const bool allow_duplicate_parameters = false;
3250 this->ValidateFormalParameters(&formals_classifier, language_mode(), 3285 this->ValidateFormalParameters(&formals_classifier, language_mode(),
3251 allow_duplicate_parameters, CHECK_OK); 3286 allow_duplicate_parameters, CHECK_OK);
3252 3287
3253 // Validate strict mode. 3288 // Validate strict mode.
3254 if (is_strict(language_mode())) { 3289 if (is_strict(language_mode())) {
3255 CheckStrictOctalLiteral(formal_parameters.scope->start_position(), 3290 CheckStrictOctalLiteral(formal_parameters.scope->start_position(),
3256 scanner()->location().end_pos, CHECK_OK); 3291 scanner()->location().end_pos, CHECK_OK);
3257 } 3292 }
3258 this->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK); 3293 this->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK);
3259 3294
3260 Traits::RewriteDestructuringAssignments(); 3295 Traits::RewriteDestructuringAssignments();
3261 } 3296 }
3262 3297
3263 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3298 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
3264 this->EmptyIdentifierString(), formal_parameters.scope, body, 3299 this->EmptyIdentifierString(), formal_parameters.scope, body,
3265 materialized_literal_count, expected_property_count, num_parameters, 3300 materialized_literal_count, expected_property_count, num_parameters,
3266 FunctionLiteral::kNoDuplicateParameters, 3301 FunctionLiteral::kNoDuplicateParameters,
3267 FunctionLiteral::kAnonymousExpression, 3302 FunctionLiteral::kAnonymousExpression,
3268 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction, 3303 FunctionLiteral::kShouldLazyCompile, arrow_kind,
3269 formal_parameters.scope->start_position()); 3304 formal_parameters.scope->start_position());
3270 3305
3271 function_literal->set_function_token_position( 3306 function_literal->set_function_token_position(
3272 formal_parameters.scope->start_position()); 3307 formal_parameters.scope->start_position());
3273 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); 3308 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
3274 3309
3275 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3310 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
3276 3311
3277 return function_literal; 3312 return function_literal;
3278 } 3313 }
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
3487 has_seen_constructor_ = true; 3522 has_seen_constructor_ = true;
3488 return; 3523 return;
3489 } 3524 }
3490 } 3525 }
3491 3526
3492 3527
3493 } // namespace internal 3528 } // namespace internal
3494 } // namespace v8 3529 } // namespace v8
3495 3530
3496 #endif // V8_PARSING_PARSER_BASE_H 3531 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698