| 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 3935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3946 | 3946 |
| 3947 function_state.SkipMaterializedLiterals( | 3947 function_state.SkipMaterializedLiterals( |
| 3948 formal_parameters.materialized_literals_count); | 3948 formal_parameters.materialized_literals_count); |
| 3949 | 3949 |
| 3950 impl()->ReindexLiterals(formal_parameters); | 3950 impl()->ReindexLiterals(formal_parameters); |
| 3951 | 3951 |
| 3952 Expect(Token::ARROW, CHECK_OK); | 3952 Expect(Token::ARROW, CHECK_OK); |
| 3953 | 3953 |
| 3954 if (peek() == Token::LBRACE) { | 3954 if (peek() == Token::LBRACE) { |
| 3955 // Multiple statement body | 3955 // Multiple statement body |
| 3956 Consume(Token::LBRACE); | |
| 3957 DCHECK_EQ(scope(), formal_parameters.scope); | 3956 DCHECK_EQ(scope(), formal_parameters.scope); |
| 3958 if (is_lazy_top_level_function) { | 3957 if (is_lazy_top_level_function) { |
| 3958 // FIXME(marja): Arrow function parameters will be parsed even if the |
| 3959 // body is preparsed; move relevant parts of parameter handling to |
| 3960 // simulate consistent parameter handling. |
| 3959 Scanner::BookmarkScope bookmark(scanner()); | 3961 Scanner::BookmarkScope bookmark(scanner()); |
| 3960 bookmark.Set(); | 3962 bookmark.Set(); |
| 3961 LazyParsingResult result = impl()->SkipLazyFunctionBody( | 3963 // For arrow functions, we don't need to retrieve data about function |
| 3964 // parameters. |
| 3965 int dummy_num_parameters = -1; |
| 3966 int dummy_function_length = -1; |
| 3967 bool dummy_has_duplicate_parameters = false; |
| 3968 DCHECK((kind & FunctionKind::kArrowFunction) != 0); |
| 3969 LazyParsingResult result = impl()->SkipFunction( |
| 3970 kind, formal_parameters.scope, &dummy_num_parameters, |
| 3971 &dummy_function_length, &dummy_has_duplicate_parameters, |
| 3962 &materialized_literal_count, &expected_property_count, false, true, | 3972 &materialized_literal_count, &expected_property_count, false, true, |
| 3963 CHECK_OK); | 3973 CHECK_OK); |
| 3964 formal_parameters.scope->ResetAfterPreparsing( | 3974 formal_parameters.scope->ResetAfterPreparsing( |
| 3965 ast_value_factory_, result == kLazyParsingAborted); | 3975 ast_value_factory_, result == kLazyParsingAborted); |
| 3966 | 3976 |
| 3967 if (formal_parameters.materialized_literals_count > 0) { | 3977 if (formal_parameters.materialized_literals_count > 0) { |
| 3968 materialized_literal_count += | 3978 materialized_literal_count += |
| 3969 formal_parameters.materialized_literals_count; | 3979 formal_parameters.materialized_literals_count; |
| 3970 } | 3980 } |
| 3971 | 3981 |
| 3972 if (result == kLazyParsingAborted) { | 3982 if (result == kLazyParsingAborted) { |
| 3973 bookmark.Apply(); | 3983 bookmark.Apply(); |
| 3974 // Trigger eager (re-)parsing, just below this block. | 3984 // Trigger eager (re-)parsing, just below this block. |
| 3975 is_lazy_top_level_function = false; | 3985 is_lazy_top_level_function = false; |
| 3976 | 3986 |
| 3977 // This is probably an initialization function. Inform the compiler it | 3987 // This is probably an initialization function. Inform the compiler it |
| 3978 // should also eager-compile this function, and that we expect it to | 3988 // should also eager-compile this function, and that we expect it to |
| 3979 // be used once. | 3989 // be used once. |
| 3980 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; | 3990 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
| 3981 should_be_used_once_hint = true; | 3991 should_be_used_once_hint = true; |
| 3982 } | 3992 } |
| 3983 } | 3993 } |
| 3984 if (!is_lazy_top_level_function) { | 3994 if (!is_lazy_top_level_function) { |
| 3995 Consume(Token::LBRACE); |
| 3985 body = impl()->ParseEagerFunctionBody( | 3996 body = impl()->ParseEagerFunctionBody( |
| 3986 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, | 3997 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, |
| 3987 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); | 3998 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); |
| 3988 materialized_literal_count = | 3999 materialized_literal_count = |
| 3989 function_state.materialized_literal_count(); | 4000 function_state.materialized_literal_count(); |
| 3990 expected_property_count = function_state.expected_property_count(); | 4001 expected_property_count = function_state.expected_property_count(); |
| 3991 } | 4002 } |
| 3992 } else { | 4003 } else { |
| 3993 // Single-expression body | 4004 // Single-expression body |
| 3994 int pos = position(); | 4005 int pos = position(); |
| (...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5461 has_seen_constructor_ = true; | 5472 has_seen_constructor_ = true; |
| 5462 return; | 5473 return; |
| 5463 } | 5474 } |
| 5464 } | 5475 } |
| 5465 | 5476 |
| 5466 | 5477 |
| 5467 } // namespace internal | 5478 } // namespace internal |
| 5468 } // namespace v8 | 5479 } // namespace v8 |
| 5469 | 5480 |
| 5470 #endif // V8_PARSING_PARSER_BASE_H | 5481 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |