| 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 3904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3915 } | 3915 } |
| 3916 | 3916 |
| 3917 StatementListT body = impl()->NullStatementList(); | 3917 StatementListT body = impl()->NullStatementList(); |
| 3918 int num_parameters = formal_parameters.scope->num_parameters(); | 3918 int num_parameters = formal_parameters.scope->num_parameters(); |
| 3919 int materialized_literal_count = -1; | 3919 int materialized_literal_count = -1; |
| 3920 int expected_property_count = -1; | 3920 int expected_property_count = -1; |
| 3921 | 3921 |
| 3922 FunctionKind kind = formal_parameters.scope->function_kind(); | 3922 FunctionKind kind = formal_parameters.scope->function_kind(); |
| 3923 FunctionLiteral::EagerCompileHint eager_compile_hint = | 3923 FunctionLiteral::EagerCompileHint eager_compile_hint = |
| 3924 default_eager_compile_hint_; | 3924 default_eager_compile_hint_; |
| 3925 bool can_preparse = mode() == PARSE_LAZILY && |
| 3926 eager_compile_hint == FunctionLiteral::kShouldLazyCompile; |
| 3927 // TODO(marja): consider lazy-parsing inner arrow functions too. is_this |
| 3928 // handling in Scope::ResolveVariable needs to change. |
| 3929 bool is_lazy_top_level_function = |
| 3930 can_preparse && scope()->AllowsLazyParsingWithoutUnresolvedVariables(); |
| 3925 bool should_be_used_once_hint = false; | 3931 bool should_be_used_once_hint = false; |
| 3926 { | 3932 { |
| 3927 FunctionState function_state(&function_state_, &scope_state_, | 3933 FunctionState function_state(&function_state_, &scope_state_, |
| 3928 formal_parameters.scope); | 3934 formal_parameters.scope); |
| 3929 | 3935 |
| 3930 function_state.SkipMaterializedLiterals( | 3936 function_state.SkipMaterializedLiterals( |
| 3931 formal_parameters.materialized_literals_count); | 3937 formal_parameters.materialized_literals_count); |
| 3932 | 3938 |
| 3933 impl()->ReindexLiterals(formal_parameters); | 3939 impl()->ReindexLiterals(formal_parameters); |
| 3934 | 3940 |
| 3935 Expect(Token::ARROW, CHECK_OK); | 3941 Expect(Token::ARROW, CHECK_OK); |
| 3936 | 3942 |
| 3937 if (peek() == Token::LBRACE) { | 3943 if (peek() == Token::LBRACE) { |
| 3938 // Multiple statement body | 3944 // Multiple statement body |
| 3939 Consume(Token::LBRACE); | 3945 Consume(Token::LBRACE); |
| 3940 DCHECK_EQ(scope(), formal_parameters.scope); | 3946 DCHECK_EQ(scope(), formal_parameters.scope); |
| 3941 bool is_lazily_parsed = | 3947 if (is_lazy_top_level_function) { |
| 3942 (mode() == PARSE_LAZILY && | |
| 3943 formal_parameters.scope | |
| 3944 ->AllowsLazyParsingWithoutUnresolvedVariables() && | |
| 3945 eager_compile_hint == FunctionLiteral::kShouldLazyCompile); | |
| 3946 // TODO(marja): consider lazy-parsing inner arrow functions too. is_this | |
| 3947 // handling in Scope::ResolveVariable needs to change. | |
| 3948 if (is_lazily_parsed) { | |
| 3949 Scanner::BookmarkScope bookmark(scanner()); | 3948 Scanner::BookmarkScope bookmark(scanner()); |
| 3950 bookmark.Set(); | 3949 bookmark.Set(); |
| 3951 LazyParsingResult result = impl()->SkipLazyFunctionBody( | 3950 LazyParsingResult result = impl()->SkipLazyFunctionBody( |
| 3952 &materialized_literal_count, &expected_property_count, false, true, | 3951 &materialized_literal_count, &expected_property_count, false, true, |
| 3953 CHECK_OK); | 3952 CHECK_OK); |
| 3954 formal_parameters.scope->ResetAfterPreparsing( | 3953 formal_parameters.scope->ResetAfterPreparsing( |
| 3955 ast_value_factory_, result == kLazyParsingAborted); | 3954 ast_value_factory_, result == kLazyParsingAborted); |
| 3956 | 3955 |
| 3957 if (formal_parameters.materialized_literals_count > 0) { | 3956 if (formal_parameters.materialized_literals_count > 0) { |
| 3958 materialized_literal_count += | 3957 materialized_literal_count += |
| 3959 formal_parameters.materialized_literals_count; | 3958 formal_parameters.materialized_literals_count; |
| 3960 } | 3959 } |
| 3961 | 3960 |
| 3962 if (result == kLazyParsingAborted) { | 3961 if (result == kLazyParsingAborted) { |
| 3963 bookmark.Apply(); | 3962 bookmark.Apply(); |
| 3964 // Trigger eager (re-)parsing, just below this block. | 3963 // Trigger eager (re-)parsing, just below this block. |
| 3965 is_lazily_parsed = false; | 3964 is_lazy_top_level_function = false; |
| 3966 | 3965 |
| 3967 // This is probably an initialization function. Inform the compiler it | 3966 // This is probably an initialization function. Inform the compiler it |
| 3968 // should also eager-compile this function, and that we expect it to | 3967 // should also eager-compile this function, and that we expect it to |
| 3969 // be used once. | 3968 // be used once. |
| 3970 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; | 3969 eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
| 3971 should_be_used_once_hint = true; | 3970 should_be_used_once_hint = true; |
| 3972 } | 3971 } |
| 3973 } | 3972 } |
| 3974 if (!is_lazily_parsed) { | 3973 if (!is_lazy_top_level_function) { |
| 3975 body = impl()->ParseEagerFunctionBody( | 3974 body = impl()->ParseEagerFunctionBody( |
| 3976 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, | 3975 impl()->EmptyIdentifier(), kNoSourcePosition, formal_parameters, |
| 3977 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); | 3976 kind, FunctionLiteral::kAnonymousExpression, CHECK_OK); |
| 3978 materialized_literal_count = | 3977 materialized_literal_count = |
| 3979 function_state.materialized_literal_count(); | 3978 function_state.materialized_literal_count(); |
| 3980 expected_property_count = function_state.expected_property_count(); | 3979 expected_property_count = function_state.expected_property_count(); |
| 3981 } | 3980 } |
| 3982 } else { | 3981 } else { |
| 3983 // Single-expression body | 3982 // Single-expression body |
| 3984 int pos = position(); | 3983 int pos = position(); |
| (...skipping 1471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5456 has_seen_constructor_ = true; | 5455 has_seen_constructor_ = true; |
| 5457 return; | 5456 return; |
| 5458 } | 5457 } |
| 5459 } | 5458 } |
| 5460 | 5459 |
| 5461 | 5460 |
| 5462 } // namespace internal | 5461 } // namespace internal |
| 5463 } // namespace v8 | 5462 } // namespace v8 |
| 5464 | 5463 |
| 5465 #endif // V8_PARSING_PARSER_BASE_H | 5464 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |