| 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 <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/ast/ast.h" | 10 #include "src/ast/ast.h" |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 bool call_super, int pos, | 213 bool call_super, int pos, |
| 214 int end_pos, | 214 int end_pos, |
| 215 LanguageMode language_mode) { | 215 LanguageMode language_mode) { |
| 216 int materialized_literal_count = -1; | 216 int materialized_literal_count = -1; |
| 217 int expected_property_count = -1; | 217 int expected_property_count = -1; |
| 218 int parameter_count = 0; | 218 int parameter_count = 0; |
| 219 if (name == nullptr) name = ast_value_factory()->empty_string(); | 219 if (name == nullptr) name = ast_value_factory()->empty_string(); |
| 220 | 220 |
| 221 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor | 221 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor |
| 222 : FunctionKind::kDefaultBaseConstructor; | 222 : FunctionKind::kDefaultBaseConstructor; |
| 223 Scope* function_scope = NewFunctionScope(kind); | 223 DeclarationScope* function_scope = NewFunctionScope(kind); |
| 224 SetLanguageMode(function_scope, | 224 SetLanguageMode(function_scope, |
| 225 static_cast<LanguageMode>(language_mode | STRICT)); | 225 static_cast<LanguageMode>(language_mode | STRICT)); |
| 226 // Set start and end position to the same value | 226 // Set start and end position to the same value |
| 227 function_scope->set_start_position(pos); | 227 function_scope->set_start_position(pos); |
| 228 function_scope->set_end_position(pos); | 228 function_scope->set_end_position(pos); |
| 229 ZoneList<Statement*>* body = NULL; | 229 ZoneList<Statement*>* body = NULL; |
| 230 | 230 |
| 231 { | 231 { |
| 232 FunctionState function_state(&function_state_, &scope_state_, | 232 FunctionState function_state(&function_state_, &scope_state_, |
| 233 function_scope, kind); | 233 function_scope, kind); |
| (...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 DCHECK_NULL(scope_state_); | 945 DCHECK_NULL(scope_state_); |
| 946 DCHECK_NULL(target_stack_); | 946 DCHECK_NULL(target_stack_); |
| 947 | 947 |
| 948 Mode parsing_mode = FLAG_lazy && allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY; | 948 Mode parsing_mode = FLAG_lazy && allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY; |
| 949 if (allow_natives() || extension_ != NULL) parsing_mode = PARSE_EAGERLY; | 949 if (allow_natives() || extension_ != NULL) parsing_mode = PARSE_EAGERLY; |
| 950 | 950 |
| 951 FunctionLiteral* result = NULL; | 951 FunctionLiteral* result = NULL; |
| 952 { | 952 { |
| 953 // TODO(wingo): Add an outer SCRIPT_SCOPE corresponding to the native | 953 // TODO(wingo): Add an outer SCRIPT_SCOPE corresponding to the native |
| 954 // context, which will have the "this" binding for script scopes. | 954 // context, which will have the "this" binding for script scopes. |
| 955 Scope* scope = NewScriptScope(); | 955 DeclarationScope* scope = NewScriptScope(); |
| 956 info->set_script_scope(scope); | 956 info->set_script_scope(scope); |
| 957 Scope* inner = scope; |
| 957 if (!info->context().is_null() && !info->context()->IsNativeContext()) { | 958 if (!info->context().is_null() && !info->context()->IsNativeContext()) { |
| 958 scope = Scope::DeserializeScopeChain(info->isolate(), zone(), | 959 // If we're compiling for eval, this isn't necessarily a declaration |
| 960 // scope. |
| 961 inner = Scope::DeserializeScopeChain(info->isolate(), zone(), |
| 959 *info->context(), scope, | 962 *info->context(), scope, |
| 960 ast_value_factory()); | 963 ast_value_factory()); |
| 961 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this | 964 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this |
| 962 // means the Parser cannot operate independent of the V8 heap. Tell the | 965 // means the Parser cannot operate independent of the V8 heap. Tell the |
| 963 // string table to internalize strings and values right after they're | 966 // string table to internalize strings and values right after they're |
| 964 // created. This kind of parsing can only be done in the main thread. | 967 // created. This kind of parsing can only be done in the main thread. |
| 965 DCHECK(parsing_on_main_thread_); | 968 DCHECK(parsing_on_main_thread_); |
| 966 ast_value_factory()->Internalize(info->isolate()); | 969 ast_value_factory()->Internalize(info->isolate()); |
| 967 } | 970 } |
| 968 original_scope_ = scope; | 971 original_scope_ = inner; |
| 969 if (info->is_eval()) { | 972 if (info->is_eval()) { |
| 970 if (!scope->is_script_scope() || is_strict(info->language_mode())) { | 973 if (!inner->is_script_scope() || is_strict(info->language_mode())) { |
| 971 parsing_mode = PARSE_EAGERLY; | 974 parsing_mode = PARSE_EAGERLY; |
| 972 } | 975 } |
| 973 scope = NewScopeWithParent(scope, EVAL_SCOPE); | 976 inner = NewEvalScope(inner); |
| 974 } else if (info->is_module()) { | 977 } else if (info->is_module()) { |
| 975 scope = NewScopeWithParent(scope, MODULE_SCOPE); | 978 inner = NewModuleScope(inner); |
| 976 } | 979 } |
| 977 | 980 |
| 981 scope = inner->AsDeclarationScope(); |
| 982 |
| 978 scope->set_start_position(0); | 983 scope->set_start_position(0); |
| 979 | 984 |
| 980 // Enter 'scope' with the given parsing mode. | 985 // Enter 'scope' with the given parsing mode. |
| 981 ParsingModeScope parsing_mode_scope(this, parsing_mode); | 986 ParsingModeScope parsing_mode_scope(this, parsing_mode); |
| 982 FunctionState function_state(&function_state_, &scope_state_, scope, | 987 FunctionState function_state(&function_state_, &scope_state_, scope, |
| 983 kNormalFunction); | 988 kNormalFunction); |
| 984 | 989 |
| 985 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 990 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
| 986 bool ok = true; | 991 bool ok = true; |
| 987 int beg_pos = scanner()->location().beg_pos; | 992 int beg_pos = scanner()->location().beg_pos; |
| 988 parsing_module_ = info->is_module(); | 993 parsing_module_ = info->is_module(); |
| 989 if (parsing_module_) { | 994 if (parsing_module_) { |
| 990 ParseModuleItemList(body, &ok); | 995 ParseModuleItemList(body, &ok); |
| 991 ok = ok && | 996 ok = ok && |
| 992 module()->Validate(this->scope(), &pending_error_handler_, zone()); | 997 module()->Validate(this->scope()->AsDeclarationScope(), |
| 998 &pending_error_handler_, zone()); |
| 993 } else { | 999 } else { |
| 994 // Don't count the mode in the use counters--give the program a chance | 1000 // Don't count the mode in the use counters--give the program a chance |
| 995 // to enable script-wide strict mode below. | 1001 // to enable script-wide strict mode below. |
| 996 this->scope()->SetLanguageMode(info->language_mode()); | 1002 this->scope()->SetLanguageMode(info->language_mode()); |
| 997 ParseStatementList(body, Token::EOS, &ok); | 1003 ParseStatementList(body, Token::EOS, &ok); |
| 998 } | 1004 } |
| 999 | 1005 |
| 1000 // The parser will peek but not consume EOS. Our scope logically goes all | 1006 // The parser will peek but not consume EOS. Our scope logically goes all |
| 1001 // the way to the EOS, though. | 1007 // the way to the EOS, though. |
| 1002 scope->set_end_position(scanner()->peek_location().beg_pos); | 1008 scope->set_end_position(scanner()->peek_location().beg_pos); |
| 1003 | 1009 |
| 1004 if (ok && is_strict(language_mode())) { | 1010 if (ok && is_strict(language_mode())) { |
| 1005 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 1011 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
| 1006 CheckDecimalLiteralWithLeadingZero(use_counts_, beg_pos, | 1012 CheckDecimalLiteralWithLeadingZero(use_counts_, beg_pos, |
| 1007 scanner()->location().end_pos); | 1013 scanner()->location().end_pos); |
| 1008 } | 1014 } |
| 1009 if (ok && is_sloppy(language_mode())) { | 1015 if (ok && is_sloppy(language_mode())) { |
| 1010 // TODO(littledan): Function bindings on the global object that modify | 1016 // TODO(littledan): Function bindings on the global object that modify |
| 1011 // pre-existing bindings should be made writable, enumerable and | 1017 // pre-existing bindings should be made writable, enumerable and |
| 1012 // nonconfigurable if possible, whereas this code will leave attributes | 1018 // nonconfigurable if possible, whereas this code will leave attributes |
| 1013 // unchanged if the property already exists. | 1019 // unchanged if the property already exists. |
| 1014 InsertSloppyBlockFunctionVarBindings(scope, nullptr, &ok); | 1020 InsertSloppyBlockFunctionVarBindings(scope, nullptr, &ok); |
| 1015 } | 1021 } |
| 1016 if (ok) { | 1022 if (ok) { |
| 1017 CheckConflictingVarDeclarations(this->scope(), &ok); | 1023 CheckConflictingVarDeclarations(scope, &ok); |
| 1018 } | 1024 } |
| 1019 | 1025 |
| 1020 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { | 1026 if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) { |
| 1021 if (body->length() != 1 || | 1027 if (body->length() != 1 || |
| 1022 !body->at(0)->IsExpressionStatement() || | 1028 !body->at(0)->IsExpressionStatement() || |
| 1023 !body->at(0)->AsExpressionStatement()-> | 1029 !body->at(0)->AsExpressionStatement()-> |
| 1024 expression()->IsFunctionLiteral()) { | 1030 expression()->IsFunctionLiteral()) { |
| 1025 ReportMessage(MessageTemplate::kSingleFunctionLiteral); | 1031 ReportMessage(MessageTemplate::kSingleFunctionLiteral); |
| 1026 ok = false; | 1032 ok = false; |
| 1027 } | 1033 } |
| 1028 } | 1034 } |
| 1029 | 1035 |
| 1030 if (ok) { | 1036 if (ok) { |
| 1031 ParserTraits::RewriteDestructuringAssignments(); | 1037 ParserTraits::RewriteDestructuringAssignments(); |
| 1032 result = factory()->NewScriptOrEvalFunctionLiteral( | 1038 result = factory()->NewScriptOrEvalFunctionLiteral( |
| 1033 this->scope(), body, function_state.materialized_literal_count(), | 1039 scope, body, function_state.materialized_literal_count(), |
| 1034 function_state.expected_property_count()); | 1040 function_state.expected_property_count()); |
| 1035 } | 1041 } |
| 1036 } | 1042 } |
| 1037 | 1043 |
| 1038 // Make sure the target stack is empty. | 1044 // Make sure the target stack is empty. |
| 1039 DCHECK(target_stack_ == NULL); | 1045 DCHECK(target_stack_ == NULL); |
| 1040 | 1046 |
| 1041 return result; | 1047 return result; |
| 1042 } | 1048 } |
| 1043 | 1049 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1111 const AstRawString* raw_name = ast_value_factory()->GetString(name); | 1117 const AstRawString* raw_name = ast_value_factory()->GetString(name); |
| 1112 fni_->PushEnclosingName(raw_name); | 1118 fni_->PushEnclosingName(raw_name); |
| 1113 | 1119 |
| 1114 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 1120 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 1115 | 1121 |
| 1116 // Place holder for the result. | 1122 // Place holder for the result. |
| 1117 FunctionLiteral* result = nullptr; | 1123 FunctionLiteral* result = nullptr; |
| 1118 | 1124 |
| 1119 { | 1125 { |
| 1120 // Parse the function literal. | 1126 // Parse the function literal. |
| 1121 Scope* scope = NewScriptScope(); | 1127 DeclarationScope* script_scope = NewScriptScope(); |
| 1122 info->set_script_scope(scope); | 1128 Scope* scope = script_scope; |
| 1129 info->set_script_scope(script_scope); |
| 1123 if (!info->context().is_null()) { | 1130 if (!info->context().is_null()) { |
| 1124 // Ok to use Isolate here, since lazy function parsing is only done in the | 1131 // Ok to use Isolate here, since lazy function parsing is only done in the |
| 1125 // main thread. | 1132 // main thread. |
| 1126 DCHECK(parsing_on_main_thread_); | 1133 DCHECK(parsing_on_main_thread_); |
| 1127 scope = Scope::DeserializeScopeChain(isolate, zone(), *info->context(), | 1134 scope = Scope::DeserializeScopeChain(isolate, zone(), *info->context(), |
| 1128 scope, ast_value_factory()); | 1135 scope, ast_value_factory()); |
| 1129 } | 1136 } |
| 1130 original_scope_ = scope; | 1137 original_scope_ = scope; |
| 1131 FunctionState function_state(&function_state_, &scope_state_, scope, | 1138 FunctionState function_state(&function_state_, &scope_state_, scope, |
| 1132 shared_info->kind()); | 1139 shared_info->kind()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1145 CHECK(stack_overflow()); | 1152 CHECK(stack_overflow()); |
| 1146 return nullptr; | 1153 return nullptr; |
| 1147 } | 1154 } |
| 1148 if (!(peek_any_identifier() || peek() == Token::LPAREN)) { | 1155 if (!(peek_any_identifier() || peek() == Token::LPAREN)) { |
| 1149 CHECK(stack_overflow()); | 1156 CHECK(stack_overflow()); |
| 1150 return nullptr; | 1157 return nullptr; |
| 1151 } | 1158 } |
| 1152 } | 1159 } |
| 1153 | 1160 |
| 1154 // TODO(adamk): We should construct this scope from the ScopeInfo. | 1161 // TODO(adamk): We should construct this scope from the ScopeInfo. |
| 1155 Scope* scope = NewFunctionScope(FunctionKind::kArrowFunction); | 1162 DeclarationScope* scope = NewFunctionScope(FunctionKind::kArrowFunction); |
| 1156 | 1163 |
| 1157 // These two bits only need to be explicitly set because we're | 1164 // These two bits only need to be explicitly set because we're |
| 1158 // not passing the ScopeInfo to the Scope constructor. | 1165 // not passing the ScopeInfo to the Scope constructor. |
| 1159 // TODO(adamk): Remove these calls once the above NewScope call | 1166 // TODO(adamk): Remove these calls once the above NewScope call |
| 1160 // passes the ScopeInfo. | 1167 // passes the ScopeInfo. |
| 1161 if (shared_info->scope_info()->CallsEval()) { | 1168 if (shared_info->scope_info()->CallsEval()) { |
| 1162 scope->RecordEvalCall(); | 1169 scope->RecordEvalCall(); |
| 1163 } | 1170 } |
| 1164 SetLanguageMode(scope, shared_info->language_mode()); | 1171 SetLanguageMode(scope, shared_info->language_mode()); |
| 1165 | 1172 |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1927 | 1934 |
| 1928 | 1935 |
| 1929 VariableProxy* Parser::NewUnresolved(const AstRawString* name, | 1936 VariableProxy* Parser::NewUnresolved(const AstRawString* name, |
| 1930 VariableMode mode) { | 1937 VariableMode mode) { |
| 1931 // If we are inside a function, a declaration of a 'var' variable is a | 1938 // If we are inside a function, a declaration of a 'var' variable is a |
| 1932 // truly local variable, and the scope of the variable is always the function | 1939 // truly local variable, and the scope of the variable is always the function |
| 1933 // scope. | 1940 // scope. |
| 1934 // Let/const variables are always added to the immediately enclosing scope. | 1941 // Let/const variables are always added to the immediately enclosing scope. |
| 1935 Scope* scope = IsLexicalVariableMode(mode) | 1942 Scope* scope = IsLexicalVariableMode(mode) |
| 1936 ? this->scope() | 1943 ? this->scope() |
| 1937 : this->scope()->DeclarationScope(); | 1944 : this->scope()->GetDeclarationScope(); |
| 1938 return scope->NewUnresolved(factory(), name, Variable::NORMAL, | 1945 return scope->NewUnresolved(factory(), name, Variable::NORMAL, |
| 1939 scanner()->location().beg_pos, | 1946 scanner()->location().beg_pos, |
| 1940 scanner()->location().end_pos); | 1947 scanner()->location().end_pos); |
| 1941 } | 1948 } |
| 1942 | 1949 |
| 1943 | 1950 |
| 1944 void Parser::DeclareImport(const AstRawString* local_name, int pos, bool* ok) { | 1951 void Parser::DeclareImport(const AstRawString* local_name, int pos, bool* ok) { |
| 1945 DCHECK_NOT_NULL(local_name); | 1952 DCHECK_NOT_NULL(local_name); |
| 1946 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1953 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
| 1947 Declaration* declaration = | 1954 Declaration* declaration = |
| 1948 factory()->NewVariableDeclaration(proxy, IMPORT, scope(), pos); | 1955 factory()->NewVariableDeclaration(proxy, IMPORT, scope(), pos); |
| 1949 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK_VOID); | 1956 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK_VOID); |
| 1950 } | 1957 } |
| 1951 | 1958 |
| 1952 | 1959 |
| 1953 Variable* Parser::Declare(Declaration* declaration, | 1960 Variable* Parser::Declare(Declaration* declaration, |
| 1954 DeclarationDescriptor::Kind declaration_kind, | 1961 DeclarationDescriptor::Kind declaration_kind, |
| 1955 bool resolve, bool* ok, Scope* scope) { | 1962 bool resolve, bool* ok, Scope* scope) { |
| 1956 VariableProxy* proxy = declaration->proxy(); | 1963 VariableProxy* proxy = declaration->proxy(); |
| 1957 DCHECK(proxy->raw_name() != NULL); | 1964 DCHECK(proxy->raw_name() != NULL); |
| 1958 const AstRawString* name = proxy->raw_name(); | 1965 const AstRawString* name = proxy->raw_name(); |
| 1959 VariableMode mode = declaration->mode(); | 1966 VariableMode mode = declaration->mode(); |
| 1960 DCHECK(IsDeclaredVariableMode(mode) && mode != CONST_LEGACY); | 1967 DCHECK(IsDeclaredVariableMode(mode) && mode != CONST_LEGACY); |
| 1961 bool is_function_declaration = declaration->IsFunctionDeclaration(); | 1968 bool is_function_declaration = declaration->IsFunctionDeclaration(); |
| 1962 if (scope == nullptr) scope = this->scope(); | 1969 if (scope == nullptr) scope = this->scope(); |
| 1963 Scope* declaration_scope = | 1970 Scope* declaration_scope = |
| 1964 IsLexicalVariableMode(mode) ? scope : scope->DeclarationScope(); | 1971 IsLexicalVariableMode(mode) ? scope : scope->GetDeclarationScope(); |
| 1965 Variable* var = NULL; | 1972 Variable* var = NULL; |
| 1966 | 1973 |
| 1967 // If a suitable scope exists, then we can statically declare this | 1974 // If a suitable scope exists, then we can statically declare this |
| 1968 // variable and also set its mode. In any case, a Declaration node | 1975 // variable and also set its mode. In any case, a Declaration node |
| 1969 // will be added to the scope so that the declaration can be added | 1976 // will be added to the scope so that the declaration can be added |
| 1970 // to the corresponding activation frame at runtime if necessary. | 1977 // to the corresponding activation frame at runtime if necessary. |
| 1971 // For instance, var declarations inside a sloppy eval scope need | 1978 // For instance, var declarations inside a sloppy eval scope need |
| 1972 // to be added to the calling function context. Similarly, strict | 1979 // to be added to the calling function context. Similarly, strict |
| 1973 // mode eval scope and lexical eval bindings do not leak variable | 1980 // mode eval scope and lexical eval bindings do not leak variable |
| 1974 // declarations to the caller's scope so we declare all locals, too. | 1981 // declarations to the caller's scope so we declare all locals, too. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1996 if (is_sloppy(language_mode()) && is_function_declaration && | 2003 if (is_sloppy(language_mode()) && is_function_declaration && |
| 1997 var->is_function()) { | 2004 var->is_function()) { |
| 1998 DCHECK(IsLexicalVariableMode(mode) && | 2005 DCHECK(IsLexicalVariableMode(mode) && |
| 1999 IsLexicalVariableMode(var->mode())); | 2006 IsLexicalVariableMode(var->mode())); |
| 2000 // If the duplication is allowed, then the var will show up | 2007 // If the duplication is allowed, then the var will show up |
| 2001 // in the SloppyBlockFunctionMap and the new FunctionKind | 2008 // in the SloppyBlockFunctionMap and the new FunctionKind |
| 2002 // will be a permitted duplicate. | 2009 // will be a permitted duplicate. |
| 2003 FunctionKind function_kind = | 2010 FunctionKind function_kind = |
| 2004 declaration->AsFunctionDeclaration()->fun()->kind(); | 2011 declaration->AsFunctionDeclaration()->fun()->kind(); |
| 2005 duplicate_allowed = | 2012 duplicate_allowed = |
| 2006 scope->DeclarationScope()->sloppy_block_function_map()->Lookup( | 2013 scope->GetDeclarationScope()->sloppy_block_function_map()->Lookup( |
| 2007 const_cast<AstRawString*>(name), name->hash()) != nullptr && | 2014 const_cast<AstRawString*>(name), name->hash()) != nullptr && |
| 2008 !IsAsyncFunction(function_kind) && | 2015 !IsAsyncFunction(function_kind) && |
| 2009 !(allow_harmony_restrictive_generators() && | 2016 !(allow_harmony_restrictive_generators() && |
| 2010 IsGeneratorFunction(function_kind)); | 2017 IsGeneratorFunction(function_kind)); |
| 2011 } | 2018 } |
| 2012 if (duplicate_allowed) { | 2019 if (duplicate_allowed) { |
| 2013 ++use_counts_[v8::Isolate::kSloppyModeBlockScopedFunctionRedefinition]; | 2020 ++use_counts_[v8::Isolate::kSloppyModeBlockScopedFunctionRedefinition]; |
| 2014 } else { | 2021 } else { |
| 2015 // The name was declared in this scope before; check for conflicting | 2022 // The name was declared in this scope before; check for conflicting |
| 2016 // re-declarations. We have a conflict if either of the declarations | 2023 // re-declarations. We have a conflict if either of the declarations |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 Expect(Token::COMMA, CHECK_OK); | 2130 Expect(Token::COMMA, CHECK_OK); |
| 2124 } | 2131 } |
| 2125 } | 2132 } |
| 2126 Expect(Token::RPAREN, CHECK_OK); | 2133 Expect(Token::RPAREN, CHECK_OK); |
| 2127 Expect(Token::SEMICOLON, CHECK_OK); | 2134 Expect(Token::SEMICOLON, CHECK_OK); |
| 2128 | 2135 |
| 2129 // Make sure that the function containing the native declaration | 2136 // Make sure that the function containing the native declaration |
| 2130 // isn't lazily compiled. The extension structures are only | 2137 // isn't lazily compiled. The extension structures are only |
| 2131 // accessible while parsing the first time not when reparsing | 2138 // accessible while parsing the first time not when reparsing |
| 2132 // because of lazy compilation. | 2139 // because of lazy compilation. |
| 2133 // TODO(adamk): Should this be ClosureScope()? | 2140 // TODO(adamk): Should this be GetClosureScope()? |
| 2134 scope()->DeclarationScope()->ForceEagerCompilation(); | 2141 scope()->GetDeclarationScope()->ForceEagerCompilation(); |
| 2135 | 2142 |
| 2136 // TODO(1240846): It's weird that native function declarations are | 2143 // TODO(1240846): It's weird that native function declarations are |
| 2137 // introduced dynamically when we meet their declarations, whereas | 2144 // introduced dynamically when we meet their declarations, whereas |
| 2138 // other functions are set up when entering the surrounding scope. | 2145 // other functions are set up when entering the surrounding scope. |
| 2139 VariableProxy* proxy = NewUnresolved(name, VAR); | 2146 VariableProxy* proxy = NewUnresolved(name, VAR); |
| 2140 Declaration* declaration = | 2147 Declaration* declaration = |
| 2141 factory()->NewVariableDeclaration(proxy, VAR, scope(), pos); | 2148 factory()->NewVariableDeclaration(proxy, VAR, scope(), pos); |
| 2142 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 2149 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); |
| 2143 NativeFunctionLiteral* lit = | 2150 NativeFunctionLiteral* lit = |
| 2144 factory()->NewNativeFunctionLiteral(name, extension_, kNoSourcePosition); | 2151 factory()->NewNativeFunctionLiteral(name, extension_, kNoSourcePosition); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2234 EmptyStatement* empty = factory()->NewEmptyStatement(kNoSourcePosition); | 2241 EmptyStatement* empty = factory()->NewEmptyStatement(kNoSourcePosition); |
| 2235 // Async functions don't undergo sloppy mode block scoped hoisting, and don't | 2242 // Async functions don't undergo sloppy mode block scoped hoisting, and don't |
| 2236 // allow duplicates in a block. Both are represented by the | 2243 // allow duplicates in a block. Both are represented by the |
| 2237 // sloppy_block_function_map. Don't add them to the map for async functions. | 2244 // sloppy_block_function_map. Don't add them to the map for async functions. |
| 2238 // Generators are also supposed to be prohibited; currently doing this behind | 2245 // Generators are also supposed to be prohibited; currently doing this behind |
| 2239 // a flag and UseCounting violations to assess web compatibility. | 2246 // a flag and UseCounting violations to assess web compatibility. |
| 2240 if (is_sloppy(language_mode()) && !scope()->is_declaration_scope() && | 2247 if (is_sloppy(language_mode()) && !scope()->is_declaration_scope() && |
| 2241 !is_async && !(allow_harmony_restrictive_generators() && is_generator)) { | 2248 !is_async && !(allow_harmony_restrictive_generators() && is_generator)) { |
| 2242 SloppyBlockFunctionStatement* delegate = | 2249 SloppyBlockFunctionStatement* delegate = |
| 2243 factory()->NewSloppyBlockFunctionStatement(empty, scope()); | 2250 factory()->NewSloppyBlockFunctionStatement(empty, scope()); |
| 2244 scope()->DeclarationScope()->sloppy_block_function_map()->Declare( | 2251 scope()->GetDeclarationScope()->sloppy_block_function_map()->Declare( |
| 2245 variable_name, delegate); | 2252 variable_name, delegate); |
| 2246 return delegate; | 2253 return delegate; |
| 2247 } | 2254 } |
| 2248 return empty; | 2255 return empty; |
| 2249 } | 2256 } |
| 2250 | 2257 |
| 2251 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, | 2258 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, |
| 2252 bool default_export, bool* ok) { | 2259 bool default_export, bool* ok) { |
| 2253 // ClassDeclaration :: | 2260 // ClassDeclaration :: |
| 2254 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' | 2261 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2801 ExpectSemicolon(CHECK_OK); | 2808 ExpectSemicolon(CHECK_OK); |
| 2802 | 2809 |
| 2803 if (is_generator()) { | 2810 if (is_generator()) { |
| 2804 return_value = BuildIteratorResult(return_value, true); | 2811 return_value = BuildIteratorResult(return_value, true); |
| 2805 } else if (is_async_function()) { | 2812 } else if (is_async_function()) { |
| 2806 return_value = BuildPromiseResolve(return_value, return_value->position()); | 2813 return_value = BuildPromiseResolve(return_value, return_value->position()); |
| 2807 } | 2814 } |
| 2808 | 2815 |
| 2809 result = factory()->NewReturnStatement(return_value, loc.beg_pos); | 2816 result = factory()->NewReturnStatement(return_value, loc.beg_pos); |
| 2810 | 2817 |
| 2811 Scope* decl_scope = scope()->DeclarationScope(); | 2818 DeclarationScope* decl_scope = scope()->GetDeclarationScope(); |
| 2812 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) { | 2819 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) { |
| 2813 ReportMessageAt(loc, MessageTemplate::kIllegalReturn); | 2820 ReportMessageAt(loc, MessageTemplate::kIllegalReturn); |
| 2814 *ok = false; | 2821 *ok = false; |
| 2815 return NULL; | 2822 return NULL; |
| 2816 } | 2823 } |
| 2817 return result; | 2824 return result; |
| 2818 } | 2825 } |
| 2819 | 2826 |
| 2820 | 2827 |
| 2821 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, | 2828 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, |
| (...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4201 DoExpression* Parser::ParseDoExpression(bool* ok) { | 4208 DoExpression* Parser::ParseDoExpression(bool* ok) { |
| 4202 // AssignmentExpression :: | 4209 // AssignmentExpression :: |
| 4203 // do '{' StatementList '}' | 4210 // do '{' StatementList '}' |
| 4204 int pos = peek_position(); | 4211 int pos = peek_position(); |
| 4205 | 4212 |
| 4206 Expect(Token::DO, CHECK_OK); | 4213 Expect(Token::DO, CHECK_OK); |
| 4207 Variable* result = | 4214 Variable* result = |
| 4208 scope()->NewTemporary(ast_value_factory()->dot_result_string()); | 4215 scope()->NewTemporary(ast_value_factory()->dot_result_string()); |
| 4209 Block* block = ParseBlock(nullptr, CHECK_OK); | 4216 Block* block = ParseBlock(nullptr, CHECK_OK); |
| 4210 DoExpression* expr = factory()->NewDoExpression(block, result, pos); | 4217 DoExpression* expr = factory()->NewDoExpression(block, result, pos); |
| 4211 if (!Rewriter::Rewrite(this, scope()->ClosureScope(), expr, | 4218 if (!Rewriter::Rewrite(this, scope()->GetClosureScope(), expr, |
| 4212 ast_value_factory())) { | 4219 ast_value_factory())) { |
| 4213 *ok = false; | 4220 *ok = false; |
| 4214 return nullptr; | 4221 return nullptr; |
| 4215 } | 4222 } |
| 4216 return expr; | 4223 return expr; |
| 4217 } | 4224 } |
| 4218 | 4225 |
| 4219 void ParserTraits::ParseArrowFunctionFormalParameterList( | 4226 void ParserTraits::ParseArrowFunctionFormalParameterList( |
| 4220 ParserFormalParameters* parameters, Expression* expr, | 4227 ParserFormalParameters* parameters, Expression* expr, |
| 4221 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, | 4228 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4350 // - The function literal shouldn't be hinted to eagerly compile. | 4357 // - The function literal shouldn't be hinted to eagerly compile. |
| 4351 // - For asm.js functions the body needs to be available when module | 4358 // - For asm.js functions the body needs to be available when module |
| 4352 // validation is active, because we examine the entire module at once. | 4359 // validation is active, because we examine the entire module at once. |
| 4353 bool use_temp_zone = | 4360 bool use_temp_zone = |
| 4354 !is_lazily_parsed && FLAG_lazy && !allow_natives() && | 4361 !is_lazily_parsed && FLAG_lazy && !allow_natives() && |
| 4355 extension_ == NULL && allow_lazy() && | 4362 extension_ == NULL && allow_lazy() && |
| 4356 function_type == FunctionLiteral::kDeclaration && | 4363 function_type == FunctionLiteral::kDeclaration && |
| 4357 eager_compile_hint != FunctionLiteral::kShouldEagerCompile && | 4364 eager_compile_hint != FunctionLiteral::kShouldEagerCompile && |
| 4358 !(FLAG_validate_asm && scope()->asm_module()); | 4365 !(FLAG_validate_asm && scope()->asm_module()); |
| 4359 | 4366 |
| 4360 Scope* main_scope = nullptr; | 4367 DeclarationScope* main_scope = nullptr; |
| 4361 if (use_temp_zone) { | 4368 if (use_temp_zone) { |
| 4362 // This Scope lives in the main Zone; we'll migrate data into it later. | 4369 // This Scope lives in the main Zone; we'll migrate data into it later. |
| 4363 main_scope = NewFunctionScope(kind); | 4370 main_scope = NewFunctionScope(kind); |
| 4364 } | 4371 } |
| 4365 | 4372 |
| 4366 ZoneList<Statement*>* body = nullptr; | 4373 ZoneList<Statement*>* body = nullptr; |
| 4367 int arity = -1; | 4374 int arity = -1; |
| 4368 int materialized_literal_count = -1; | 4375 int materialized_literal_count = -1; |
| 4369 int expected_property_count = -1; | 4376 int expected_property_count = -1; |
| 4370 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 4377 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
| 4371 bool should_be_used_once_hint = false; | 4378 bool should_be_used_once_hint = false; |
| 4372 bool has_duplicate_parameters; | 4379 bool has_duplicate_parameters; |
| 4373 | 4380 |
| 4374 { | 4381 { |
| 4375 // Temporary zones can nest. When we migrate free variables (see below), we | 4382 // Temporary zones can nest. When we migrate free variables (see below), we |
| 4376 // need to recreate them in the previous Zone. | 4383 // need to recreate them in the previous Zone. |
| 4377 AstNodeFactory previous_zone_ast_node_factory(ast_value_factory()); | 4384 AstNodeFactory previous_zone_ast_node_factory(ast_value_factory()); |
| 4378 previous_zone_ast_node_factory.set_zone(zone()); | 4385 previous_zone_ast_node_factory.set_zone(zone()); |
| 4379 | 4386 |
| 4380 // Open a new zone scope, which sets our AstNodeFactory to allocate in the | 4387 // Open a new zone scope, which sets our AstNodeFactory to allocate in the |
| 4381 // new temporary zone if the preconditions are satisfied, and ensures that | 4388 // new temporary zone if the preconditions are satisfied, and ensures that |
| 4382 // the previous zone is always restored after parsing the body. To be able | 4389 // the previous zone is always restored after parsing the body. To be able |
| 4383 // to do scope analysis correctly after full parsing, we migrate needed | 4390 // to do scope analysis correctly after full parsing, we migrate needed |
| 4384 // information from scope into main_scope when the function has been parsed. | 4391 // information from scope into main_scope when the function has been parsed. |
| 4385 Zone temp_zone(zone()->allocator()); | 4392 Zone temp_zone(zone()->allocator()); |
| 4386 DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone); | 4393 DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone); |
| 4387 | 4394 |
| 4388 Scope* scope = NewFunctionScope(kind); | 4395 DeclarationScope* scope = NewFunctionScope(kind); |
| 4389 SetLanguageMode(scope, language_mode); | 4396 SetLanguageMode(scope, language_mode); |
| 4390 if (!use_temp_zone) { | 4397 if (!use_temp_zone) { |
| 4391 main_scope = scope; | 4398 main_scope = scope; |
| 4392 } else { | 4399 } else { |
| 4393 DCHECK(main_scope->zone() != scope->zone()); | 4400 DCHECK(main_scope->zone() != scope->zone()); |
| 4394 } | 4401 } |
| 4395 | 4402 |
| 4396 FunctionState function_state(&function_state_, &scope_state_, scope, kind); | 4403 FunctionState function_state(&function_state_, &scope_state_, scope, kind); |
| 4397 #ifdef DEBUG | 4404 #ifdef DEBUG |
| 4398 this->scope()->SetScopeName(function_name); | 4405 scope->SetScopeName(function_name); |
| 4399 #endif | 4406 #endif |
| 4400 ExpressionClassifier formals_classifier(this, &duplicate_finder); | 4407 ExpressionClassifier formals_classifier(this, &duplicate_finder); |
| 4401 | 4408 |
| 4402 if (is_generator) { | 4409 if (is_generator) { |
| 4403 // For generators, allocating variables in contexts is currently a win | 4410 // For generators, allocating variables in contexts is currently a win |
| 4404 // because it minimizes the work needed to suspend and resume an | 4411 // because it minimizes the work needed to suspend and resume an |
| 4405 // activation. The machine code produced for generators (by full-codegen) | 4412 // activation. The machine code produced for generators (by full-codegen) |
| 4406 // relies on this forced context allocation, but not in an essential way. | 4413 // relies on this forced context allocation, but not in an essential way. |
| 4407 this->scope()->ForceContextAllocation(); | 4414 this->scope()->ForceContextAllocation(); |
| 4408 | 4415 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4724 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition); | 4731 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition); |
| 4725 initial_value = factory()->NewConditional( | 4732 initial_value = factory()->NewConditional( |
| 4726 condition, parameter.initializer, initial_value, kNoSourcePosition); | 4733 condition, parameter.initializer, initial_value, kNoSourcePosition); |
| 4727 descriptor.initialization_pos = parameter.initializer->position(); | 4734 descriptor.initialization_pos = parameter.initializer->position(); |
| 4728 initializer_position = parameter.initializer_end_position; | 4735 initializer_position = parameter.initializer_end_position; |
| 4729 } | 4736 } |
| 4730 | 4737 |
| 4731 Scope* param_scope = scope(); | 4738 Scope* param_scope = scope(); |
| 4732 Block* param_block = init_block; | 4739 Block* param_block = init_block; |
| 4733 if (!parameter.is_simple() && scope()->calls_sloppy_eval()) { | 4740 if (!parameter.is_simple() && scope()->calls_sloppy_eval()) { |
| 4734 param_scope = NewScope(BLOCK_SCOPE); | 4741 param_scope = NewVarblockScope(); |
| 4735 param_scope->set_is_declaration_scope(); | |
| 4736 param_scope->set_start_position(descriptor.initialization_pos); | 4742 param_scope->set_start_position(descriptor.initialization_pos); |
| 4737 param_scope->set_end_position(parameter.initializer_end_position); | 4743 param_scope->set_end_position(parameter.initializer_end_position); |
| 4738 param_scope->RecordEvalCall(); | 4744 param_scope->RecordEvalCall(); |
| 4739 param_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); | 4745 param_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); |
| 4740 param_block->set_scope(param_scope); | 4746 param_block->set_scope(param_scope); |
| 4741 descriptor.hoist_scope = scope(); | 4747 descriptor.hoist_scope = scope(); |
| 4742 // Pass the appropriate scope in so that PatternRewriter can appropriately | 4748 // Pass the appropriate scope in so that PatternRewriter can appropriately |
| 4743 // rewrite inner initializers of the pattern to param_scope | 4749 // rewrite inner initializers of the pattern to param_scope |
| 4744 descriptor.scope = param_scope; | 4750 descriptor.scope = param_scope; |
| 4745 // Rewrite the outer initializer to point to param_scope | 4751 // Rewrite the outer initializer to point to param_scope |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4831 // If we have a named function expression, we add a local variable | 4837 // If we have a named function expression, we add a local variable |
| 4832 // declaration to the body of the function with the name of the | 4838 // declaration to the body of the function with the name of the |
| 4833 // function and let it refer to the function itself (closure). | 4839 // function and let it refer to the function itself (closure). |
| 4834 // Not having parsed the function body, the language mode may still change, | 4840 // Not having parsed the function body, the language mode may still change, |
| 4835 // so we reserve a spot and create the actual const assignment later. | 4841 // so we reserve a spot and create the actual const assignment later. |
| 4836 DCHECK_EQ(kFunctionNameAssignmentIndex, result->length()); | 4842 DCHECK_EQ(kFunctionNameAssignmentIndex, result->length()); |
| 4837 result->Add(NULL, zone()); | 4843 result->Add(NULL, zone()); |
| 4838 } | 4844 } |
| 4839 | 4845 |
| 4840 ZoneList<Statement*>* body = result; | 4846 ZoneList<Statement*>* body = result; |
| 4841 Scope* inner_scope = scope(); | 4847 DeclarationScope* function_scope = scope()->AsDeclarationScope(); |
| 4848 DeclarationScope* inner_scope = function_scope; |
| 4842 Block* inner_block = nullptr; | 4849 Block* inner_block = nullptr; |
| 4843 if (!parameters.is_simple) { | 4850 if (!parameters.is_simple) { |
| 4844 inner_scope = NewScope(BLOCK_SCOPE); | 4851 inner_scope = NewVarblockScope(); |
| 4845 inner_scope->set_is_declaration_scope(); | |
| 4846 inner_scope->set_start_position(scanner()->location().beg_pos); | 4852 inner_scope->set_start_position(scanner()->location().beg_pos); |
| 4847 inner_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); | 4853 inner_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); |
| 4848 inner_block->set_scope(inner_scope); | 4854 inner_block->set_scope(inner_scope); |
| 4849 body = inner_block->statements(); | 4855 body = inner_block->statements(); |
| 4850 } | 4856 } |
| 4851 | 4857 |
| 4852 { | 4858 { |
| 4853 BlockState block_state(&scope_state_, inner_scope); | 4859 BlockState block_state(&scope_state_, inner_scope); |
| 4854 | 4860 |
| 4855 if (IsGeneratorFunction(kind)) { | 4861 if (IsGeneratorFunction(kind)) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4921 kNoSourcePosition), | 4927 kNoSourcePosition), |
| 4922 zone()); | 4928 zone()); |
| 4923 } | 4929 } |
| 4924 } | 4930 } |
| 4925 | 4931 |
| 4926 Expect(Token::RBRACE, CHECK_OK); | 4932 Expect(Token::RBRACE, CHECK_OK); |
| 4927 scope()->set_end_position(scanner()->location().end_pos); | 4933 scope()->set_end_position(scanner()->location().end_pos); |
| 4928 | 4934 |
| 4929 if (!parameters.is_simple) { | 4935 if (!parameters.is_simple) { |
| 4930 DCHECK_NOT_NULL(inner_scope); | 4936 DCHECK_NOT_NULL(inner_scope); |
| 4937 DCHECK_EQ(function_scope, scope()); |
| 4938 DCHECK_EQ(function_scope, inner_scope->outer_scope()); |
| 4931 DCHECK_EQ(body, inner_block->statements()); | 4939 DCHECK_EQ(body, inner_block->statements()); |
| 4932 SetLanguageMode(scope(), inner_scope->language_mode()); | 4940 SetLanguageMode(function_scope, inner_scope->language_mode()); |
| 4933 Block* init_block = BuildParameterInitializationBlock(parameters, CHECK_OK); | 4941 Block* init_block = BuildParameterInitializationBlock(parameters, CHECK_OK); |
| 4934 | 4942 |
| 4935 if (is_sloppy(inner_scope->language_mode())) { | 4943 if (is_sloppy(inner_scope->language_mode())) { |
| 4936 InsertSloppyBlockFunctionVarBindings( | 4944 InsertSloppyBlockFunctionVarBindings(inner_scope, function_scope, |
| 4937 inner_scope, inner_scope->outer_scope(), CHECK_OK); | 4945 CHECK_OK); |
| 4938 } | 4946 } |
| 4939 | 4947 |
| 4940 if (IsAsyncFunction(kind)) { | 4948 if (IsAsyncFunction(kind)) { |
| 4941 init_block = BuildRejectPromiseOnException(init_block); | 4949 init_block = BuildRejectPromiseOnException(init_block); |
| 4942 } | 4950 } |
| 4943 | 4951 |
| 4944 DCHECK_NOT_NULL(init_block); | 4952 DCHECK_NOT_NULL(init_block); |
| 4945 | 4953 |
| 4946 inner_scope->set_end_position(scanner()->location().end_pos); | 4954 inner_scope->set_end_position(scanner()->location().end_pos); |
| 4947 inner_scope = inner_scope->FinalizeBlockScope(); | 4955 if (inner_scope->FinalizeBlockScope() != nullptr) { |
| 4948 if (inner_scope != nullptr) { | |
| 4949 CheckConflictingVarDeclarations(inner_scope, CHECK_OK); | 4956 CheckConflictingVarDeclarations(inner_scope, CHECK_OK); |
| 4950 InsertShadowingVarBindingInitializers(inner_block); | 4957 InsertShadowingVarBindingInitializers(inner_block); |
| 4951 } | 4958 } |
| 4952 | 4959 |
| 4953 result->Add(init_block, zone()); | 4960 result->Add(init_block, zone()); |
| 4954 result->Add(inner_block, zone()); | 4961 result->Add(inner_block, zone()); |
| 4955 } else { | 4962 } else { |
| 4956 if (is_sloppy(inner_scope->language_mode())) { | 4963 DCHECK_EQ(inner_scope, function_scope); |
| 4957 InsertSloppyBlockFunctionVarBindings(inner_scope, nullptr, CHECK_OK); | 4964 if (is_sloppy(function_scope->language_mode())) { |
| 4965 InsertSloppyBlockFunctionVarBindings(function_scope, nullptr, CHECK_OK); |
| 4958 } | 4966 } |
| 4959 } | 4967 } |
| 4960 | 4968 |
| 4961 if (function_type == FunctionLiteral::kNamedExpression) { | 4969 if (function_type == FunctionLiteral::kNamedExpression) { |
| 4962 // Now that we know the language mode, we can create the const assignment | 4970 // Now that we know the language mode, we can create the const assignment |
| 4963 // in the previously reserved spot. | 4971 // in the previously reserved spot. |
| 4964 // NOTE: We create a proxy and resolve it here so that in the | 4972 // NOTE: We create a proxy and resolve it here so that in the |
| 4965 // future we can change the AST to only refer to VariableProxies | 4973 // future we can change the AST to only refer to VariableProxies |
| 4966 // instead of Variables and Proxies as is the case now. | 4974 // instead of Variables and Proxies as is the case now. |
| 4975 DCHECK_EQ(function_scope, scope()); |
| 4967 VariableMode fvar_mode = is_strict(language_mode()) ? CONST : CONST_LEGACY; | 4976 VariableMode fvar_mode = is_strict(language_mode()) ? CONST : CONST_LEGACY; |
| 4968 Variable* fvar = new (zone()) | 4977 Variable* fvar = new (zone()) |
| 4969 Variable(scope(), function_name, fvar_mode, Variable::NORMAL, | 4978 Variable(scope(), function_name, fvar_mode, Variable::NORMAL, |
| 4970 kCreatedInitialized, kNotAssigned); | 4979 kCreatedInitialized, kNotAssigned); |
| 4971 VariableProxy* proxy = factory()->NewVariableProxy(fvar); | 4980 VariableProxy* proxy = factory()->NewVariableProxy(fvar); |
| 4972 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( | 4981 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( |
| 4973 proxy, fvar_mode, scope(), kNoSourcePosition); | 4982 proxy, fvar_mode, scope(), kNoSourcePosition); |
| 4974 scope()->DeclareFunctionVar(fvar_declaration); | 4983 function_scope->DeclareFunctionVar(fvar_declaration); |
| 4975 | 4984 |
| 4976 VariableProxy* fproxy = factory()->NewVariableProxy(fvar); | 4985 VariableProxy* fproxy = factory()->NewVariableProxy(fvar); |
| 4977 result->Set(kFunctionNameAssignmentIndex, | 4986 result->Set(kFunctionNameAssignmentIndex, |
| 4978 factory()->NewExpressionStatement( | 4987 factory()->NewExpressionStatement( |
| 4979 factory()->NewAssignment(Token::INIT, fproxy, | 4988 factory()->NewAssignment(Token::INIT, fproxy, |
| 4980 factory()->NewThisFunction(pos), | 4989 factory()->NewThisFunction(pos), |
| 4981 kNoSourcePosition), | 4990 kNoSourcePosition), |
| 4982 kNoSourcePosition)); | 4991 kNoSourcePosition)); |
| 4983 } | 4992 } |
| 4984 | 4993 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5008 SET_ALLOW(harmony_for_in); | 5017 SET_ALLOW(harmony_for_in); |
| 5009 SET_ALLOW(harmony_function_sent); | 5018 SET_ALLOW(harmony_function_sent); |
| 5010 SET_ALLOW(harmony_exponentiation_operator); | 5019 SET_ALLOW(harmony_exponentiation_operator); |
| 5011 SET_ALLOW(harmony_restrictive_declarations); | 5020 SET_ALLOW(harmony_restrictive_declarations); |
| 5012 SET_ALLOW(harmony_async_await); | 5021 SET_ALLOW(harmony_async_await); |
| 5013 SET_ALLOW(harmony_trailing_commas); | 5022 SET_ALLOW(harmony_trailing_commas); |
| 5014 #undef SET_ALLOW | 5023 #undef SET_ALLOW |
| 5015 } | 5024 } |
| 5016 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 5025 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
| 5017 language_mode(), function_state_->kind(), | 5026 language_mode(), function_state_->kind(), |
| 5018 scope()->has_simple_parameters(), parsing_module_, logger, bookmark, | 5027 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_, |
| 5019 use_counts_); | 5028 logger, bookmark, use_counts_); |
| 5020 if (pre_parse_timer_ != NULL) { | 5029 if (pre_parse_timer_ != NULL) { |
| 5021 pre_parse_timer_->Stop(); | 5030 pre_parse_timer_->Stop(); |
| 5022 } | 5031 } |
| 5023 return result; | 5032 return result; |
| 5024 } | 5033 } |
| 5025 | 5034 |
| 5026 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, | 5035 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, |
| 5027 const AstRawString* name, | 5036 const AstRawString* name, |
| 5028 Scanner::Location class_name_location, | 5037 Scanner::Location class_name_location, |
| 5029 bool name_is_strict_reserved, int pos, | 5038 bool name_is_strict_reserved, int pos, |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5135 scope()->NewTemporary(ast_value_factory()->empty_string()); | 5144 scope()->NewTemporary(ast_value_factory()->empty_string()); |
| 5136 do_block->set_scope(block_state.FinalizedBlockScope()); | 5145 do_block->set_scope(block_state.FinalizedBlockScope()); |
| 5137 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); | 5146 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); |
| 5138 | 5147 |
| 5139 ClassLiteral* class_literal = factory()->NewClassLiteral( | 5148 ClassLiteral* class_literal = factory()->NewClassLiteral( |
| 5140 proxy, extends, constructor, properties, pos, end_pos); | 5149 proxy, extends, constructor, properties, pos, end_pos); |
| 5141 | 5150 |
| 5142 do_block->statements()->Add( | 5151 do_block->statements()->Add( |
| 5143 factory()->NewExpressionStatement(class_literal, pos), zone()); | 5152 factory()->NewExpressionStatement(class_literal, pos), zone()); |
| 5144 do_expr->set_represented_function(constructor); | 5153 do_expr->set_represented_function(constructor); |
| 5145 Rewriter::Rewrite(this, scope()->ClosureScope(), do_expr, | 5154 Rewriter::Rewrite(this, scope()->GetClosureScope(), do_expr, |
| 5146 ast_value_factory()); | 5155 ast_value_factory()); |
| 5147 | 5156 |
| 5148 return do_expr; | 5157 return do_expr; |
| 5149 } | 5158 } |
| 5150 | 5159 |
| 5151 | 5160 |
| 5152 Expression* Parser::ParseV8Intrinsic(bool* ok) { | 5161 Expression* Parser::ParseV8Intrinsic(bool* ok) { |
| 5153 // CallRuntime :: | 5162 // CallRuntime :: |
| 5154 // '%' Identifier Arguments | 5163 // '%' Identifier Arguments |
| 5155 | 5164 |
| 5156 int pos = peek_position(); | 5165 int pos = peek_position(); |
| 5157 Expect(Token::MOD, CHECK_OK); | 5166 Expect(Token::MOD, CHECK_OK); |
| 5158 // Allow "eval" or "arguments" for backward compatibility. | 5167 // Allow "eval" or "arguments" for backward compatibility. |
| 5159 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, | 5168 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, |
| 5160 CHECK_OK); | 5169 CHECK_OK); |
| 5161 Scanner::Location spread_pos; | 5170 Scanner::Location spread_pos; |
| 5162 ExpressionClassifier classifier(this); | 5171 ExpressionClassifier classifier(this); |
| 5163 ZoneList<Expression*>* args = | 5172 ZoneList<Expression*>* args = |
| 5164 ParseArguments(&spread_pos, &classifier, CHECK_OK); | 5173 ParseArguments(&spread_pos, &classifier, CHECK_OK); |
| 5165 | 5174 |
| 5166 DCHECK(!spread_pos.IsValid()); | 5175 DCHECK(!spread_pos.IsValid()); |
| 5167 | 5176 |
| 5168 if (extension_ != NULL) { | 5177 if (extension_ != NULL) { |
| 5169 // The extension structures are only accessible while parsing the | 5178 // The extension structures are only accessible while parsing the |
| 5170 // very first time not when reparsing because of lazy compilation. | 5179 // very first time not when reparsing because of lazy compilation. |
| 5171 scope()->DeclarationScope()->ForceEagerCompilation(); | 5180 scope()->GetDeclarationScope()->ForceEagerCompilation(); |
| 5172 } | 5181 } |
| 5173 | 5182 |
| 5174 const Runtime::Function* function = Runtime::FunctionForName(name->string()); | 5183 const Runtime::Function* function = Runtime::FunctionForName(name->string()); |
| 5175 | 5184 |
| 5176 if (function != NULL) { | 5185 if (function != NULL) { |
| 5177 // Check for possible name clash. | 5186 // Check for possible name clash. |
| 5178 DCHECK_EQ(Context::kNotFound, | 5187 DCHECK_EQ(Context::kNotFound, |
| 5179 Context::IntrinsicIndexForName(name->string())); | 5188 Context::IntrinsicIndexForName(name->string())); |
| 5180 // Check for built-in IS_VAR macro. | 5189 // Check for built-in IS_VAR macro. |
| 5181 if (function->function_id == Runtime::kIS_VAR) { | 5190 if (function->function_id == Runtime::kIS_VAR) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5254 VariableProxy* to = inner_scope->NewUnresolved(factory(), name); | 5263 VariableProxy* to = inner_scope->NewUnresolved(factory(), name); |
| 5255 VariableProxy* from = factory()->NewVariableProxy(parameter); | 5264 VariableProxy* from = factory()->NewVariableProxy(parameter); |
| 5256 Expression* assignment = | 5265 Expression* assignment = |
| 5257 factory()->NewAssignment(Token::ASSIGN, to, from, kNoSourcePosition); | 5266 factory()->NewAssignment(Token::ASSIGN, to, from, kNoSourcePosition); |
| 5258 Statement* statement = | 5267 Statement* statement = |
| 5259 factory()->NewExpressionStatement(assignment, kNoSourcePosition); | 5268 factory()->NewExpressionStatement(assignment, kNoSourcePosition); |
| 5260 inner_block->statements()->InsertAt(0, statement, zone()); | 5269 inner_block->statements()->InsertAt(0, statement, zone()); |
| 5261 } | 5270 } |
| 5262 } | 5271 } |
| 5263 | 5272 |
| 5264 void Parser::InsertSloppyBlockFunctionVarBindings(Scope* scope, | 5273 void Parser::InsertSloppyBlockFunctionVarBindings(DeclarationScope* scope, |
| 5265 Scope* complex_params_scope, | 5274 Scope* complex_params_scope, |
| 5266 bool* ok) { | 5275 bool* ok) { |
| 5267 // For each variable which is used as a function declaration in a sloppy | 5276 // For each variable which is used as a function declaration in a sloppy |
| 5268 // block, | 5277 // block, |
| 5269 DCHECK(scope->is_declaration_scope()); | |
| 5270 SloppyBlockFunctionMap* map = scope->sloppy_block_function_map(); | 5278 SloppyBlockFunctionMap* map = scope->sloppy_block_function_map(); |
| 5271 for (ZoneHashMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) { | 5279 for (ZoneHashMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) { |
| 5272 AstRawString* name = static_cast<AstRawString*>(p->key); | 5280 AstRawString* name = static_cast<AstRawString*>(p->key); |
| 5273 | 5281 |
| 5274 // If the variable wouldn't conflict with a lexical declaration | 5282 // If the variable wouldn't conflict with a lexical declaration |
| 5275 // or parameter, | 5283 // or parameter, |
| 5276 | 5284 |
| 5277 // Check if there's a conflict with a parameter. | 5285 // Check if there's a conflict with a parameter. |
| 5278 // This depends on the fact that functions always have a scope solely to | 5286 // This depends on the fact that functions always have a scope solely to |
| 5279 // hold complex parameters, and the names local to that scope are | 5287 // hold complex parameters, and the names local to that scope are |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5291 continue; | 5299 continue; |
| 5292 } | 5300 } |
| 5293 } | 5301 } |
| 5294 | 5302 |
| 5295 bool var_created = false; | 5303 bool var_created = false; |
| 5296 | 5304 |
| 5297 // Write in assignments to var for each block-scoped function declaration | 5305 // Write in assignments to var for each block-scoped function declaration |
| 5298 auto delegates = static_cast<SloppyBlockFunctionMap::Vector*>(p->value); | 5306 auto delegates = static_cast<SloppyBlockFunctionMap::Vector*>(p->value); |
| 5299 for (SloppyBlockFunctionStatement* delegate : *delegates) { | 5307 for (SloppyBlockFunctionStatement* delegate : *delegates) { |
| 5300 // Check if there's a conflict with a lexical declaration | 5308 // Check if there's a conflict with a lexical declaration |
| 5301 Scope* decl_scope = scope; | 5309 DeclarationScope* decl_scope = scope; |
| 5302 while (decl_scope->is_eval_scope()) { | 5310 while (decl_scope->is_eval_scope()) { |
| 5303 decl_scope = decl_scope->outer_scope()->DeclarationScope(); | 5311 decl_scope = decl_scope->outer_scope()->GetDeclarationScope(); |
| 5304 } | 5312 } |
| 5305 Scope* outer_scope = decl_scope->outer_scope(); | 5313 Scope* outer_scope = decl_scope->outer_scope(); |
| 5306 Scope* query_scope = delegate->scope()->outer_scope(); | 5314 Scope* query_scope = delegate->scope()->outer_scope(); |
| 5307 Variable* var = nullptr; | 5315 Variable* var = nullptr; |
| 5308 bool should_hoist = true; | 5316 bool should_hoist = true; |
| 5309 | 5317 |
| 5310 // Note that we perform this loop for each delegate named 'name', | 5318 // Note that we perform this loop for each delegate named 'name', |
| 5311 // which may duplicate work if those delegates share scopes. | 5319 // which may duplicate work if those delegates share scopes. |
| 5312 // It is not sufficient to just do a Lookup on query_scope: for | 5320 // It is not sufficient to just do a Lookup on query_scope: for |
| 5313 // example, that does not prevent hoisting of the function in | 5321 // example, that does not prevent hoisting of the function in |
| (...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6645 do_block_->statements()->Add(validate_iterator, zone); | 6653 do_block_->statements()->Add(validate_iterator, zone); |
| 6646 do_block_->statements()->Add(loop, zone); | 6654 do_block_->statements()->Add(loop, zone); |
| 6647 do_block_->statements()->Add(maybe_return_value, zone); | 6655 do_block_->statements()->Add(maybe_return_value, zone); |
| 6648 | 6656 |
| 6649 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); | 6657 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); |
| 6650 do_block->statements()->Add(do_block_, zone); | 6658 do_block->statements()->Add(do_block_, zone); |
| 6651 do_block->statements()->Add(get_value, zone); | 6659 do_block->statements()->Add(get_value, zone); |
| 6652 | 6660 |
| 6653 Variable* dot_result = scope->NewTemporary(avfactory->dot_result_string()); | 6661 Variable* dot_result = scope->NewTemporary(avfactory->dot_result_string()); |
| 6654 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); | 6662 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); |
| 6655 Rewriter::Rewrite(parser_, scope->ClosureScope(), yield_star, avfactory); | 6663 Rewriter::Rewrite(parser_, scope->GetClosureScope(), yield_star, avfactory); |
| 6656 } | 6664 } |
| 6657 | 6665 |
| 6658 return yield_star; | 6666 return yield_star; |
| 6659 } | 6667 } |
| 6660 | 6668 |
| 6661 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, | 6669 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, |
| 6662 int pos) { | 6670 int pos) { |
| 6663 auto factory = parser_->factory(); | 6671 auto factory = parser_->factory(); |
| 6664 auto avfactory = parser_->ast_value_factory(); | 6672 auto avfactory = parser_->ast_value_factory(); |
| 6665 const int nopos = kNoSourcePosition; | 6673 const int nopos = kNoSourcePosition; |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7122 node->Print(Isolate::Current()); | 7130 node->Print(Isolate::Current()); |
| 7123 } | 7131 } |
| 7124 #endif // DEBUG | 7132 #endif // DEBUG |
| 7125 | 7133 |
| 7126 #undef CHECK_OK | 7134 #undef CHECK_OK |
| 7127 #undef CHECK_OK_VOID | 7135 #undef CHECK_OK_VOID |
| 7128 #undef CHECK_FAILED | 7136 #undef CHECK_FAILED |
| 7129 | 7137 |
| 7130 } // namespace internal | 7138 } // namespace internal |
| 7131 } // namespace v8 | 7139 } // namespace v8 |
| OLD | NEW |