OLD | NEW |
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/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 2258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2269 } | 2269 } |
2270 initializer_scope->set_end_position(scanner()->location().end_pos); | 2270 initializer_scope->set_end_position(scanner()->location().end_pos); |
2271 typename Types::StatementList body = impl()->NewStatementList(1); | 2271 typename Types::StatementList body = impl()->NewStatementList(1); |
2272 body->Add(factory()->NewReturnStatement(value, kNoSourcePosition), zone()); | 2272 body->Add(factory()->NewReturnStatement(value, kNoSourcePosition), zone()); |
2273 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( | 2273 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
2274 impl()->EmptyIdentifierString(), initializer_scope, body, | 2274 impl()->EmptyIdentifierString(), initializer_scope, body, |
2275 initializer_state.materialized_literal_count(), | 2275 initializer_state.materialized_literal_count(), |
2276 initializer_state.expected_property_count(), 0, 0, | 2276 initializer_state.expected_property_count(), 0, 0, |
2277 FunctionLiteral::kNoDuplicateParameters, | 2277 FunctionLiteral::kNoDuplicateParameters, |
2278 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint_, | 2278 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint_, |
2279 initializer_scope->start_position()); | 2279 initializer_scope->start_position(), true); |
2280 function_literal->set_is_class_field_initializer(true); | 2280 function_literal->set_is_class_field_initializer(true); |
2281 return function_literal; | 2281 return function_literal; |
2282 } | 2282 } |
2283 | 2283 |
2284 template <typename Impl> | 2284 template <typename Impl> |
2285 typename ParserBase<Impl>::ObjectLiteralPropertyT | 2285 typename ParserBase<Impl>::ObjectLiteralPropertyT |
2286 ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker, | 2286 ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker, |
2287 bool* is_computed_name, | 2287 bool* is_computed_name, |
2288 bool* ok) { | 2288 bool* ok) { |
2289 bool is_get = false; | 2289 bool is_get = false; |
(...skipping 1613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3903 FunctionKind kind = formal_parameters.scope->function_kind(); | 3903 FunctionKind kind = formal_parameters.scope->function_kind(); |
3904 FunctionLiteral::EagerCompileHint eager_compile_hint = | 3904 FunctionLiteral::EagerCompileHint eager_compile_hint = |
3905 default_eager_compile_hint_; | 3905 default_eager_compile_hint_; |
3906 bool can_preparse = impl()->parse_lazily() && | 3906 bool can_preparse = impl()->parse_lazily() && |
3907 eager_compile_hint == FunctionLiteral::kShouldLazyCompile; | 3907 eager_compile_hint == FunctionLiteral::kShouldLazyCompile; |
3908 // TODO(marja): consider lazy-parsing inner arrow functions too. is_this | 3908 // TODO(marja): consider lazy-parsing inner arrow functions too. is_this |
3909 // handling in Scope::ResolveVariable needs to change. | 3909 // handling in Scope::ResolveVariable needs to change. |
3910 bool is_lazy_top_level_function = | 3910 bool is_lazy_top_level_function = |
3911 can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); | 3911 can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); |
3912 bool should_be_used_once_hint = false; | 3912 bool should_be_used_once_hint = false; |
| 3913 bool has_braces = true; |
3913 { | 3914 { |
3914 FunctionState function_state(&function_state_, &scope_state_, | 3915 FunctionState function_state(&function_state_, &scope_state_, |
3915 formal_parameters.scope); | 3916 formal_parameters.scope); |
3916 | 3917 |
3917 function_state.SkipMaterializedLiterals( | 3918 function_state.SkipMaterializedLiterals( |
3918 formal_parameters.materialized_literals_count); | 3919 formal_parameters.materialized_literals_count); |
3919 | 3920 |
3920 impl()->ReindexLiterals(formal_parameters); | 3921 impl()->ReindexLiterals(formal_parameters); |
3921 | 3922 |
3922 Expect(Token::ARROW, CHECK_OK); | 3923 Expect(Token::ARROW, CHECK_OK); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3965 Consume(Token::LBRACE); | 3966 Consume(Token::LBRACE); |
3966 body = impl()->ParseEagerFunctionBody( | 3967 body = impl()->ParseEagerFunctionBody( |
3967 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, | 3968 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, |
3968 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); | 3969 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); |
3969 materialized_literal_count = | 3970 materialized_literal_count = |
3970 function_state.materialized_literal_count(); | 3971 function_state.materialized_literal_count(); |
3971 expected_property_count = function_state.expected_property_count(); | 3972 expected_property_count = function_state.expected_property_count(); |
3972 } | 3973 } |
3973 } else { | 3974 } else { |
3974 // Single-expression body | 3975 // Single-expression body |
| 3976 has_braces = false; |
3975 int pos = position(); | 3977 int pos = position(); |
3976 DCHECK(ReturnExprContext::kInsideValidBlock == | 3978 DCHECK(ReturnExprContext::kInsideValidBlock == |
3977 function_state_->return_expr_context()); | 3979 function_state_->return_expr_context()); |
3978 ReturnExprScope allow_tail_calls( | 3980 ReturnExprScope allow_tail_calls( |
3979 function_state_, ReturnExprContext::kInsideValidReturnStatement); | 3981 function_state_, ReturnExprContext::kInsideValidReturnStatement); |
3980 body = impl()->NewStatementList(1); | 3982 body = impl()->NewStatementList(1); |
3981 impl()->AddParameterInitializationBlock( | 3983 impl()->AddParameterInitializationBlock( |
3982 formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK); | 3984 formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK); |
3983 ExpressionClassifier classifier(this); | 3985 ExpressionClassifier classifier(this); |
3984 if (kind == kAsyncArrowFunction) { | 3986 if (kind == kAsyncArrowFunction) { |
3985 ParseAsyncFunctionBody(scope(), body, kAsyncArrowFunction, | 3987 ParseAsyncFunctionBody(scope(), body, kAsyncArrowFunction, |
3986 FunctionBodyType::kSingleExpression, accept_IN, | 3988 FunctionBodyType::kSingleExpression, accept_IN, |
3987 pos, CHECK_OK); | 3989 pos, CHECK_OK); |
3988 impl()->RewriteNonPattern(CHECK_OK); | 3990 impl()->RewriteNonPattern(CHECK_OK); |
3989 } else { | 3991 } else { |
3990 ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK); | 3992 ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK); |
3991 impl()->RewriteNonPattern(CHECK_OK); | 3993 impl()->RewriteNonPattern(CHECK_OK); |
3992 body->Add(factory()->NewReturnStatement(expression, pos), zone()); | 3994 body->Add( |
| 3995 factory()->NewReturnStatement(expression, expression->position()), |
| 3996 zone()); |
3993 if (allow_tailcalls() && !is_sloppy(language_mode())) { | 3997 if (allow_tailcalls() && !is_sloppy(language_mode())) { |
3994 // ES6 14.6.1 Static Semantics: IsInTailPosition | 3998 // ES6 14.6.1 Static Semantics: IsInTailPosition |
3995 impl()->MarkTailPosition(expression); | 3999 impl()->MarkTailPosition(expression); |
3996 } | 4000 } |
3997 } | 4001 } |
3998 materialized_literal_count = function_state.materialized_literal_count(); | 4002 materialized_literal_count = function_state.materialized_literal_count(); |
3999 expected_property_count = function_state.expected_property_count(); | 4003 expected_property_count = function_state.expected_property_count(); |
4000 impl()->MarkCollectedTailCallExpressions(); | 4004 impl()->MarkCollectedTailCallExpressions(); |
4001 } | 4005 } |
4002 | 4006 |
(...skipping 22 matching lines...) Expand all Loading... |
4025 PrintF(" [%s]: %i-%i (arrow function)\n", | 4029 PrintF(" [%s]: %i-%i (arrow function)\n", |
4026 is_lazy_top_level_function ? "Preparse no-resolution" : "Full parse", | 4030 is_lazy_top_level_function ? "Preparse no-resolution" : "Full parse", |
4027 scope->start_position(), scope->end_position()); | 4031 scope->start_position(), scope->end_position()); |
4028 } | 4032 } |
4029 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( | 4033 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
4030 impl()->EmptyIdentifierString(), formal_parameters.scope, body, | 4034 impl()->EmptyIdentifierString(), formal_parameters.scope, body, |
4031 materialized_literal_count, expected_property_count, | 4035 materialized_literal_count, expected_property_count, |
4032 formal_parameters.num_parameters(), formal_parameters.function_length, | 4036 formal_parameters.num_parameters(), formal_parameters.function_length, |
4033 FunctionLiteral::kNoDuplicateParameters, | 4037 FunctionLiteral::kNoDuplicateParameters, |
4034 FunctionLiteral::kAnonymousExpression, eager_compile_hint, | 4038 FunctionLiteral::kAnonymousExpression, eager_compile_hint, |
4035 formal_parameters.scope->start_position()); | 4039 formal_parameters.scope->start_position(), has_braces); |
4036 | 4040 |
4037 function_literal->set_function_token_position( | 4041 function_literal->set_function_token_position( |
4038 formal_parameters.scope->start_position()); | 4042 formal_parameters.scope->start_position()); |
4039 if (should_be_used_once_hint) { | 4043 if (should_be_used_once_hint) { |
4040 function_literal->set_should_be_used_once_hint(); | 4044 function_literal->set_should_be_used_once_hint(); |
4041 } | 4045 } |
4042 | 4046 |
4043 impl()->AddFunctionForNameInference(function_literal); | 4047 impl()->AddFunctionForNameInference(function_literal); |
4044 | 4048 |
4045 return function_literal; | 4049 return function_literal; |
(...skipping 1396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5442 has_seen_constructor_ = true; | 5446 has_seen_constructor_ = true; |
5443 return; | 5447 return; |
5444 } | 5448 } |
5445 } | 5449 } |
5446 | 5450 |
5447 | 5451 |
5448 } // namespace internal | 5452 } // namespace internal |
5449 } // namespace v8 | 5453 } // namespace v8 |
5450 | 5454 |
5451 #endif // V8_PARSING_PARSER_BASE_H | 5455 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |