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

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

Issue 2301923002: ParserBase: Simplify FuncNameInferrer handling. (Closed)
Patch Set: code review (nikolaos@) Created 4 years, 3 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
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/base/hashmap.h" 10 #include "src/base/hashmap.h"
(...skipping 1936 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 token = peek(); 1947 token = peek();
1948 pos = peek_position(); 1948 pos = peek_position();
1949 } 1949 }
1950 1950
1951 if (allow_harmony_async_await() && !*is_generator && token == Token::ASYNC && 1951 if (allow_harmony_async_await() && !*is_generator && token == Token::ASYNC &&
1952 !scanner()->HasAnyLineTerminatorAfterNext()) { 1952 !scanner()->HasAnyLineTerminatorAfterNext()) {
1953 Consume(Token::ASYNC); 1953 Consume(Token::ASYNC);
1954 token = peek(); 1954 token = peek();
1955 if (SetPropertyKindFromToken(token, kind)) { 1955 if (SetPropertyKindFromToken(token, kind)) {
1956 *name = impl()->GetSymbol(); // TODO(bakkot) specialize on 'async' 1956 *name = impl()->GetSymbol(); // TODO(bakkot) specialize on 'async'
1957 if (fni_ != nullptr) { 1957 impl()->PushLiteralName(*name);
1958 impl()->PushLiteralName(fni_, *name);
1959 }
1960 return factory()->NewStringLiteral(*name, pos); 1958 return factory()->NewStringLiteral(*name, pos);
1961 } 1959 }
1962 *kind = PropertyKind::kMethodProperty; 1960 *kind = PropertyKind::kMethodProperty;
1963 *is_async = true; 1961 *is_async = true;
1964 pos = peek_position(); 1962 pos = peek_position();
1965 } 1963 }
1966 1964
1967 if (token == Token::IDENTIFIER && !*is_generator && !*is_async) { 1965 if (token == Token::IDENTIFIER && !*is_generator && !*is_async) {
1968 // This is checking for 'get' and 'set' in particular. Any other identifier 1966 // This is checking for 'get' and 'set' in particular. Any other identifier
1969 // must be the property name, and so SetPropertyKindFromToken will return 1967 // must be the property name, and so SetPropertyKindFromToken will return
1970 // true (unless there's a syntax error). 1968 // true (unless there's a syntax error).
1971 Consume(Token::IDENTIFIER); 1969 Consume(Token::IDENTIFIER);
1972 token = peek(); 1970 token = peek();
1973 if (SetPropertyKindFromToken(token, kind)) { 1971 if (SetPropertyKindFromToken(token, kind)) {
1974 *name = impl()->GetSymbol(); 1972 *name = impl()->GetSymbol();
1975 if (fni_ != nullptr) { 1973 impl()->PushLiteralName(*name);
1976 impl()->PushLiteralName(fni_, *name);
1977 }
1978 return factory()->NewStringLiteral(*name, pos); 1974 return factory()->NewStringLiteral(*name, pos);
1979 } 1975 }
1980 scanner()->IsGetOrSet(is_get, is_set); 1976 scanner()->IsGetOrSet(is_get, is_set);
1981 if (!*is_get && !*is_set) { // TODO(bakkot) have IsGetOrSet return a bool 1977 if (!*is_get && !*is_set) { // TODO(bakkot) have IsGetOrSet return a bool
1982 Token::Value next = Next(); 1978 Token::Value next = Next();
1983 ReportUnexpectedToken(next); 1979 ReportUnexpectedToken(next);
1984 *ok = false; 1980 *ok = false;
1985 return impl()->EmptyExpression(); 1981 return impl()->EmptyExpression();
1986 } 1982 }
1987 *kind = PropertyKind::kAccessorProperty; 1983 *kind = PropertyKind::kAccessorProperty;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2041 *ok = false; 2037 *ok = false;
2042 return impl()->EmptyExpression(); 2038 return impl()->EmptyExpression();
2043 } 2039 }
2044 } 2040 }
2045 DCHECK(*kind != PropertyKind::kNotSet); 2041 DCHECK(*kind != PropertyKind::kNotSet);
2046 2042
2047 if (*is_computed_name) { 2043 if (*is_computed_name) {
2048 return expression; 2044 return expression;
2049 } 2045 }
2050 2046
2051 if (fni_ != nullptr) { 2047 impl()->PushLiteralName(*name);
2052 impl()->PushLiteralName(fni_, *name);
2053 }
2054 2048
2055 uint32_t index; 2049 uint32_t index;
2056 return impl()->IsArrayIndex(*name, &index) 2050 return impl()->IsArrayIndex(*name, &index)
2057 ? factory()->NewNumberLiteral(index, pos) 2051 ? factory()->NewNumberLiteral(index, pos)
2058 : factory()->NewStringLiteral(*name, pos); 2052 : factory()->NewStringLiteral(*name, pos);
2059 } 2053 }
2060 2054
2061 template <typename Impl> 2055 template <typename Impl>
2062 typename ParserBase<Impl>::ObjectLiteralPropertyT 2056 typename ParserBase<Impl>::ObjectLiteralPropertyT
2063 ParserBase<Impl>::ParsePropertyDefinition(ObjectLiteralCheckerBase* checker, 2057 ParserBase<Impl>::ParsePropertyDefinition(ObjectLiteralCheckerBase* checker,
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
3037 case Token::PERIOD: { 3031 case Token::PERIOD: {
3038 CheckNoTailCallExpressions(CHECK_OK); 3032 CheckNoTailCallExpressions(CHECK_OK);
3039 impl()->RewriteNonPattern(CHECK_OK); 3033 impl()->RewriteNonPattern(CHECK_OK);
3040 BindingPatternUnexpectedToken(); 3034 BindingPatternUnexpectedToken();
3041 ArrowFormalParametersUnexpectedToken(); 3035 ArrowFormalParametersUnexpectedToken();
3042 Consume(Token::PERIOD); 3036 Consume(Token::PERIOD);
3043 int pos = position(); 3037 int pos = position();
3044 IdentifierT name = ParseIdentifierName(CHECK_OK); 3038 IdentifierT name = ParseIdentifierName(CHECK_OK);
3045 result = factory()->NewProperty( 3039 result = factory()->NewProperty(
3046 result, factory()->NewStringLiteral(name, pos), pos); 3040 result, factory()->NewStringLiteral(name, pos), pos);
3047 if (fni_ != NULL) impl()->PushLiteralName(fni_, name); 3041 impl()->PushLiteralName(name);
3048 break; 3042 break;
3049 } 3043 }
3050 3044
3051 case Token::TEMPLATE_SPAN: 3045 case Token::TEMPLATE_SPAN:
3052 case Token::TEMPLATE_TAIL: { 3046 case Token::TEMPLATE_TAIL: {
3053 CheckNoTailCallExpressions(CHECK_OK); 3047 CheckNoTailCallExpressions(CHECK_OK);
3054 impl()->RewriteNonPattern(CHECK_OK); 3048 impl()->RewriteNonPattern(CHECK_OK);
3055 BindingPatternUnexpectedToken(); 3049 BindingPatternUnexpectedToken();
3056 ArrowFormalParametersUnexpectedToken(); 3050 ArrowFormalParametersUnexpectedToken();
3057 result = ParseTemplateLiteral(result, position(), CHECK_OK); 3051 result = ParseTemplateLiteral(result, position(), CHECK_OK);
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3263 *is_async = false; 3257 *is_async = false;
3264 impl()->RewriteNonPattern(CHECK_OK); 3258 impl()->RewriteNonPattern(CHECK_OK);
3265 BindingPatternUnexpectedToken(); 3259 BindingPatternUnexpectedToken();
3266 ArrowFormalParametersUnexpectedToken(); 3260 ArrowFormalParametersUnexpectedToken();
3267 3261
3268 Consume(Token::LBRACK); 3262 Consume(Token::LBRACK);
3269 int pos = position(); 3263 int pos = position();
3270 ExpressionT index = ParseExpressionCoverGrammar(true, CHECK_OK); 3264 ExpressionT index = ParseExpressionCoverGrammar(true, CHECK_OK);
3271 impl()->RewriteNonPattern(CHECK_OK); 3265 impl()->RewriteNonPattern(CHECK_OK);
3272 expression = factory()->NewProperty(expression, index, pos); 3266 expression = factory()->NewProperty(expression, index, pos);
3273 if (fni_ != NULL) { 3267 impl()->PushPropertyName(index);
3274 impl()->PushPropertyName(fni_, index);
3275 }
3276 Expect(Token::RBRACK, CHECK_OK); 3268 Expect(Token::RBRACK, CHECK_OK);
3277 break; 3269 break;
3278 } 3270 }
3279 case Token::PERIOD: { 3271 case Token::PERIOD: {
3280 *is_async = false; 3272 *is_async = false;
3281 impl()->RewriteNonPattern(CHECK_OK); 3273 impl()->RewriteNonPattern(CHECK_OK);
3282 BindingPatternUnexpectedToken(); 3274 BindingPatternUnexpectedToken();
3283 ArrowFormalParametersUnexpectedToken(); 3275 ArrowFormalParametersUnexpectedToken();
3284 3276
3285 Consume(Token::PERIOD); 3277 Consume(Token::PERIOD);
3286 int pos = position(); 3278 int pos = position();
3287 IdentifierT name = ParseIdentifierName(CHECK_OK); 3279 IdentifierT name = ParseIdentifierName(CHECK_OK);
3288 expression = factory()->NewProperty( 3280 expression = factory()->NewProperty(
3289 expression, factory()->NewStringLiteral(name, pos), pos); 3281 expression, factory()->NewStringLiteral(name, pos), pos);
3290 if (fni_ != NULL) { 3282 impl()->PushLiteralName(name);
3291 impl()->PushLiteralName(fni_, name);
3292 }
3293 break; 3283 break;
3294 } 3284 }
3295 case Token::TEMPLATE_SPAN: 3285 case Token::TEMPLATE_SPAN:
3296 case Token::TEMPLATE_TAIL: { 3286 case Token::TEMPLATE_TAIL: {
3297 *is_async = false; 3287 *is_async = false;
3298 impl()->RewriteNonPattern(CHECK_OK); 3288 impl()->RewriteNonPattern(CHECK_OK);
3299 BindingPatternUnexpectedToken(); 3289 BindingPatternUnexpectedToken();
3300 ArrowFormalParametersUnexpectedToken(); 3290 ArrowFormalParametersUnexpectedToken();
3301 int pos; 3291 int pos;
3302 if (scanner()->current_token() == Token::IDENTIFIER) { 3292 if (scanner()->current_token() == Token::IDENTIFIER) {
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
3475 3465
3476 ValidateBindingPattern(CHECK_OK_CUSTOM(NullBlock)); 3466 ValidateBindingPattern(CHECK_OK_CUSTOM(NullBlock));
3477 if (IsLexicalVariableMode(parsing_result->descriptor.mode)) { 3467 if (IsLexicalVariableMode(parsing_result->descriptor.mode)) {
3478 ValidateLetPattern(CHECK_OK_CUSTOM(NullBlock)); 3468 ValidateLetPattern(CHECK_OK_CUSTOM(NullBlock));
3479 } 3469 }
3480 } 3470 }
3481 3471
3482 Scanner::Location variable_loc = scanner()->location(); 3472 Scanner::Location variable_loc = scanner()->location();
3483 bool single_name = impl()->IsIdentifier(pattern); 3473 bool single_name = impl()->IsIdentifier(pattern);
3484 3474
3485 if (single_name && fni_ != nullptr) { 3475 if (single_name) {
3486 impl()->PushVariableName(fni_, impl()->AsIdentifier(pattern)); 3476 impl()->PushVariableName(impl()->AsIdentifier(pattern));
3487 } 3477 }
3488 3478
3489 ExpressionT value = impl()->EmptyExpression(); 3479 ExpressionT value = impl()->EmptyExpression();
3490 int initializer_position = kNoSourcePosition; 3480 int initializer_position = kNoSourcePosition;
3491 if (Check(Token::ASSIGN)) { 3481 if (Check(Token::ASSIGN)) {
3492 ExpressionClassifier classifier(this); 3482 ExpressionClassifier classifier(this);
3493 value = ParseAssignmentExpression(var_context != kForStatement, 3483 value = ParseAssignmentExpression(var_context != kForStatement,
3494 CHECK_OK_CUSTOM(NullBlock)); 3484 CHECK_OK_CUSTOM(NullBlock));
3495 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullBlock)); 3485 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullBlock));
3496 variable_loc.end_pos = scanner()->location().end_pos; 3486 variable_loc.end_pos = scanner()->location().end_pos;
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
3756 FunctionLiteral::kNoDuplicateParameters, 3746 FunctionLiteral::kNoDuplicateParameters,
3757 FunctionLiteral::kAnonymousExpression, eager_compile_hint, arrow_kind, 3747 FunctionLiteral::kAnonymousExpression, eager_compile_hint, arrow_kind,
3758 formal_parameters.scope->start_position()); 3748 formal_parameters.scope->start_position());
3759 3749
3760 function_literal->set_function_token_position( 3750 function_literal->set_function_token_position(
3761 formal_parameters.scope->start_position()); 3751 formal_parameters.scope->start_position());
3762 if (should_be_used_once_hint) { 3752 if (should_be_used_once_hint) {
3763 function_literal->set_should_be_used_once_hint(); 3753 function_literal->set_should_be_used_once_hint();
3764 } 3754 }
3765 3755
3766 if (fni_ != NULL) impl()->InferFunctionName(fni_, function_literal); 3756 impl()->InferFunctionName(function_literal);
3767 3757
3768 return function_literal; 3758 return function_literal;
3769 } 3759 }
3770 3760
3771 template <typename Impl> 3761 template <typename Impl>
3772 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( 3762 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral(
3773 ExpressionT tag, int start, bool* ok) { 3763 ExpressionT tag, int start, bool* ok) {
3774 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal 3764 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal
3775 // text followed by a substitution expression), finalized by a single 3765 // text followed by a substitution expression), finalized by a single
3776 // TEMPLATE_TAIL. 3766 // TEMPLATE_TAIL.
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
3971 has_seen_constructor_ = true; 3961 has_seen_constructor_ = true;
3972 return; 3962 return;
3973 } 3963 }
3974 } 3964 }
3975 3965
3976 3966
3977 } // namespace internal 3967 } // namespace internal
3978 } // namespace v8 3968 } // namespace v8
3979 3969
3980 #endif // V8_PARSING_PARSER_BASE_H 3970 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698