| 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 #include "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
| 10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
| (...skipping 3975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3986 function_name = ast_value_factory()->empty_string(); | 3986 function_name = ast_value_factory()->empty_string(); |
| 3987 } | 3987 } |
| 3988 | 3988 |
| 3989 Scope* scope = NewScope(scope_, FUNCTION_SCOPE, kind); | 3989 Scope* scope = NewScope(scope_, FUNCTION_SCOPE, kind); |
| 3990 SetLanguageMode(scope, language_mode); | 3990 SetLanguageMode(scope, language_mode); |
| 3991 ZoneList<Statement*>* body = NULL; | 3991 ZoneList<Statement*>* body = NULL; |
| 3992 int arity = -1; | 3992 int arity = -1; |
| 3993 int materialized_literal_count = -1; | 3993 int materialized_literal_count = -1; |
| 3994 int expected_property_count = -1; | 3994 int expected_property_count = -1; |
| 3995 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 3995 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 3996 FunctionLiteral::EagerCompileHint eager_compile_hint = | |
| 3997 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile | |
| 3998 : FunctionLiteral::kShouldLazyCompile; | |
| 3999 bool should_be_used_once_hint = false; | 3996 bool should_be_used_once_hint = false; |
| 4000 bool has_duplicate_parameters; | 3997 bool has_duplicate_parameters; |
| 3998 FunctionLiteral::EagerCompileHint eager_compile_hint; |
| 3999 |
| 4001 // Parse function. | 4000 // Parse function. |
| 4002 { | 4001 { |
| 4003 AstNodeFactory function_factory(ast_value_factory()); | 4002 AstNodeFactory function_factory(ast_value_factory()); |
| 4004 FunctionState function_state(&function_state_, &scope_, scope, kind, | 4003 FunctionState function_state(&function_state_, &scope_, scope, kind, |
| 4005 &function_factory); | 4004 &function_factory); |
| 4006 scope_->SetScopeName(function_name); | 4005 scope_->SetScopeName(function_name); |
| 4007 ExpressionClassifier formals_classifier(this, &duplicate_finder); | 4006 ExpressionClassifier formals_classifier(this, &duplicate_finder); |
| 4008 | 4007 |
| 4008 eager_compile_hint = function_state_->this_function_is_parenthesized() |
| 4009 ? FunctionLiteral::kShouldEagerCompile |
| 4010 : FunctionLiteral::kShouldLazyCompile; |
| 4011 |
| 4009 if (is_generator) { | 4012 if (is_generator) { |
| 4010 // For generators, allocating variables in contexts is currently a win | 4013 // For generators, allocating variables in contexts is currently a win |
| 4011 // because it minimizes the work needed to suspend and resume an | 4014 // because it minimizes the work needed to suspend and resume an |
| 4012 // activation. The machine code produced for generators (by full-codegen) | 4015 // activation. The machine code produced for generators (by full-codegen) |
| 4013 // relies on this forced context allocation, but not in an essential way. | 4016 // relies on this forced context allocation, but not in an essential way. |
| 4014 scope_->ForceContextAllocation(); | 4017 scope_->ForceContextAllocation(); |
| 4015 | 4018 |
| 4016 // Calling a generator returns a generator object. That object is stored | 4019 // Calling a generator returns a generator object. That object is stored |
| 4017 // in a temporary variable, a definition that is used by "yield" | 4020 // in a temporary variable, a definition that is used by "yield" |
| 4018 // expressions. This also marks the FunctionState as a generator. | 4021 // expressions. This also marks the FunctionState as a generator. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4067 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume | 4070 // Now foo will be parsed eagerly and compiled eagerly (optimization: assume |
| 4068 // parenthesis before the function means that it will be called | 4071 // parenthesis before the function means that it will be called |
| 4069 // immediately). The inner function *must* be parsed eagerly to resolve the | 4072 // immediately). The inner function *must* be parsed eagerly to resolve the |
| 4070 // possible reference to the variable in foo's scope. However, it's possible | 4073 // possible reference to the variable in foo's scope. However, it's possible |
| 4071 // that it will be compiled lazily. | 4074 // that it will be compiled lazily. |
| 4072 | 4075 |
| 4073 // To make this additional case work, both Parser and PreParser implement a | 4076 // To make this additional case work, both Parser and PreParser implement a |
| 4074 // logic where only top-level functions will be parsed lazily. | 4077 // logic where only top-level functions will be parsed lazily. |
| 4075 bool is_lazily_parsed = mode() == PARSE_LAZILY && | 4078 bool is_lazily_parsed = mode() == PARSE_LAZILY && |
| 4076 scope_->AllowsLazyParsing() && | 4079 scope_->AllowsLazyParsing() && |
| 4077 !parenthesized_function_; | 4080 !function_state_->this_function_is_parenthesized(); |
| 4078 parenthesized_function_ = false; // The bit was set for this function only. | |
| 4079 | 4081 |
| 4080 // Eager or lazy parse? | 4082 // Eager or lazy parse? |
| 4081 // If is_lazily_parsed, we'll parse lazy. If we can set a bookmark, we'll | 4083 // If is_lazily_parsed, we'll parse lazy. If we can set a bookmark, we'll |
| 4082 // pass it to SkipLazyFunctionBody, which may use it to abort lazy | 4084 // pass it to SkipLazyFunctionBody, which may use it to abort lazy |
| 4083 // parsing if it suspect that wasn't a good idea. If so, or if we didn't | 4085 // parsing if it suspect that wasn't a good idea. If so, or if we didn't |
| 4084 // try to lazy parse in the first place, we'll have to parse eagerly. | 4086 // try to lazy parse in the first place, we'll have to parse eagerly. |
| 4085 Scanner::BookmarkScope bookmark(scanner()); | 4087 Scanner::BookmarkScope bookmark(scanner()); |
| 4086 if (is_lazily_parsed) { | 4088 if (is_lazily_parsed) { |
| 4087 Scanner::BookmarkScope* maybe_bookmark = | 4089 Scanner::BookmarkScope* maybe_bookmark = |
| 4088 bookmark.Set() ? &bookmark : nullptr; | 4090 bookmark.Set() ? &bookmark : nullptr; |
| (...skipping 2693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6782 try_block, target); | 6784 try_block, target); |
| 6783 final_loop = target; | 6785 final_loop = target; |
| 6784 } | 6786 } |
| 6785 | 6787 |
| 6786 return final_loop; | 6788 return final_loop; |
| 6787 } | 6789 } |
| 6788 | 6790 |
| 6789 | 6791 |
| 6790 } // namespace internal | 6792 } // namespace internal |
| 6791 } // namespace v8 | 6793 } // namespace v8 |
| OLD | NEW |