| 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/parser.h" | 5 #include "src/parser.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/ast.h" | 8 #include "src/ast.h" |
| 9 #include "src/ast-literal-reindexer.h" | 9 #include "src/ast-literal-reindexer.h" |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let); | 920 set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let); |
| 921 set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters); | 921 set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters); |
| 922 set_allow_harmony_default_parameters(FLAG_harmony_default_parameters); | 922 set_allow_harmony_default_parameters(FLAG_harmony_default_parameters); |
| 923 set_allow_harmony_spread_calls(FLAG_harmony_spread_calls); | 923 set_allow_harmony_spread_calls(FLAG_harmony_spread_calls); |
| 924 set_allow_harmony_destructuring(FLAG_harmony_destructuring); | 924 set_allow_harmony_destructuring(FLAG_harmony_destructuring); |
| 925 set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); | 925 set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); |
| 926 set_allow_harmony_new_target(FLAG_harmony_new_target); | 926 set_allow_harmony_new_target(FLAG_harmony_new_target); |
| 927 set_allow_strong_mode(FLAG_strong_mode); | 927 set_allow_strong_mode(FLAG_strong_mode); |
| 928 set_allow_legacy_const(FLAG_legacy_const); | 928 set_allow_legacy_const(FLAG_legacy_const); |
| 929 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); | 929 set_allow_harmony_do_expressions(FLAG_harmony_do_expressions); |
| 930 set_allow_harmony_async_await(FLAG_harmony_async_await); |
| 930 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; | 931 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
| 931 ++feature) { | 932 ++feature) { |
| 932 use_counts_[feature] = 0; | 933 use_counts_[feature] = 0; |
| 933 } | 934 } |
| 934 if (info->ast_value_factory() == NULL) { | 935 if (info->ast_value_factory() == NULL) { |
| 935 // info takes ownership of AstValueFactory. | 936 // info takes ownership of AstValueFactory. |
| 936 info->set_ast_value_factory(new AstValueFactory(zone(), info->hash_seed())); | 937 info->set_ast_value_factory(new AstValueFactory(zone(), info->hash_seed())); |
| 937 info->set_ast_value_factory_owned(); | 938 info->set_ast_value_factory_owned(); |
| 938 ast_value_factory_ = info->ast_value_factory(); | 939 ast_value_factory_ = info->ast_value_factory(); |
| 939 } | 940 } |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1401 // Statement | 1402 // Statement |
| 1402 // Declaration | 1403 // Declaration |
| 1403 | 1404 |
| 1404 if (peek() != Token::CLASS) { | 1405 if (peek() != Token::CLASS) { |
| 1405 // No more classes follow; reset the start position for the consecutive | 1406 // No more classes follow; reset the start position for the consecutive |
| 1406 // class declaration group. | 1407 // class declaration group. |
| 1407 scope_->set_class_declaration_group_start(-1); | 1408 scope_->set_class_declaration_group_start(-1); |
| 1408 } | 1409 } |
| 1409 | 1410 |
| 1410 switch (peek()) { | 1411 switch (peek()) { |
| 1412 case Token::ASYNC: |
| 1413 if (allow_harmony_async_await() && IsNextAsyncFunctionKeyword()) { |
| 1414 return ParseFunctionDeclaration(NULL, ok); |
| 1415 } |
| 1416 break; |
| 1411 case Token::FUNCTION: | 1417 case Token::FUNCTION: |
| 1412 return ParseFunctionDeclaration(NULL, ok); | 1418 return ParseFunctionDeclaration(NULL, ok); |
| 1413 case Token::CLASS: | 1419 case Token::CLASS: |
| 1414 if (scope_->class_declaration_group_start() < 0) { | 1420 if (scope_->class_declaration_group_start() < 0) { |
| 1415 scope_->set_class_declaration_group_start( | 1421 scope_->set_class_declaration_group_start( |
| 1416 scanner()->peek_location().beg_pos); | 1422 scanner()->peek_location().beg_pos); |
| 1417 } | 1423 } |
| 1418 return ParseClassDeclaration(NULL, ok); | 1424 return ParseClassDeclaration(NULL, ok); |
| 1419 case Token::CONST: | 1425 case Token::CONST: |
| 1420 if (allow_const()) { | 1426 if (allow_const()) { |
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2222 factory()->NewAssignment( | 2228 factory()->NewAssignment( |
| 2223 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), | 2229 Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), |
| 2224 pos); | 2230 pos); |
| 2225 } | 2231 } |
| 2226 | 2232 |
| 2227 | 2233 |
| 2228 Statement* Parser::ParseFunctionDeclaration( | 2234 Statement* Parser::ParseFunctionDeclaration( |
| 2229 ZoneList<const AstRawString*>* names, bool* ok) { | 2235 ZoneList<const AstRawString*>* names, bool* ok) { |
| 2230 // FunctionDeclaration :: | 2236 // FunctionDeclaration :: |
| 2231 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 2237 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 2238 // AsyncFunctionDeclaration :: |
| 2239 // 'async' 'function' Identifier '(' FormalParameterListopt ')' |
| 2240 // '{' FunctionBody '}' |
| 2232 // GeneratorDeclaration :: | 2241 // GeneratorDeclaration :: |
| 2233 // 'function' '*' Identifier '(' FormalParameterListopt ')' | 2242 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
| 2234 // '{' FunctionBody '}' | 2243 // '{' FunctionBody '}' |
| 2244 bool is_async = allow_harmony_async_await() ? Check(Token::ASYNC) : false; |
| 2235 Expect(Token::FUNCTION, CHECK_OK); | 2245 Expect(Token::FUNCTION, CHECK_OK); |
| 2236 int pos = position(); | 2246 int pos = position(); |
| 2237 bool is_generator = Check(Token::MUL); | 2247 bool is_generator = is_async ? false : Check(Token::MUL); |
| 2238 bool is_strict_reserved = false; | 2248 bool is_strict_reserved = false; |
| 2239 const AstRawString* name = ParseIdentifierOrStrictReservedWord( | 2249 const AstRawString* name = ParseIdentifierOrStrictReservedWord( |
| 2240 &is_strict_reserved, CHECK_OK); | 2250 &is_strict_reserved, CHECK_OK); |
| 2241 | 2251 |
| 2242 if (fni_ != NULL) { | 2252 if (fni_ != NULL) { |
| 2243 fni_->Enter(); | 2253 fni_->Enter(); |
| 2244 fni_->PushEnclosingName(name); | 2254 fni_->PushEnclosingName(name); |
| 2245 } | 2255 } |
| 2256 |
| 2257 FunctionKind kind = FunctionKind::kNormalFunction; |
| 2258 if (is_generator) { |
| 2259 kind = FunctionKind::kGeneratorFunction; |
| 2260 } else if (is_async) { |
| 2261 kind = FunctionKind::kAsyncFunction; |
| 2262 } |
| 2263 |
| 2246 FunctionLiteral* fun = ParseFunctionLiteral( | 2264 FunctionLiteral* fun = ParseFunctionLiteral( |
| 2247 name, scanner()->location(), | 2265 name, scanner()->location(), |
| 2248 is_strict_reserved ? kFunctionNameIsStrictReserved | 2266 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 2249 : kFunctionNameValidityUnknown, | 2267 : kFunctionNameValidityUnknown, |
| 2250 is_generator ? FunctionKind::kGeneratorFunction | 2268 kind, pos, FunctionLiteral::DECLARATION, FunctionLiteral::NORMAL_ARITY, |
| 2251 : FunctionKind::kNormalFunction, | |
| 2252 pos, FunctionLiteral::DECLARATION, FunctionLiteral::NORMAL_ARITY, | |
| 2253 language_mode(), CHECK_OK); | 2269 language_mode(), CHECK_OK); |
| 2254 if (fni_ != NULL) fni_->Leave(); | 2270 if (fni_ != NULL) fni_->Leave(); |
| 2255 | 2271 |
| 2256 // Even if we're not at the top-level of the global or a function | 2272 // Even if we're not at the top-level of the global or a function |
| 2257 // scope, we treat it as such and introduce the function with its | 2273 // scope, we treat it as such and introduce the function with its |
| 2258 // initial value upon entering the corresponding scope. | 2274 // initial value upon entering the corresponding scope. |
| 2259 // In ES6, a function behaves as a lexical binding, except in | 2275 // In ES6, a function behaves as a lexical binding, except in |
| 2260 // a script scope, or the initial scope of eval or another function. | 2276 // a script scope, or the initial scope of eval or another function. |
| 2261 VariableMode mode = | 2277 VariableMode mode = |
| 2262 is_strong(language_mode()) | 2278 is_strong(language_mode()) |
| (...skipping 2548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4811 SET_ALLOW(harmony_sloppy); | 4827 SET_ALLOW(harmony_sloppy); |
| 4812 SET_ALLOW(harmony_sloppy_let); | 4828 SET_ALLOW(harmony_sloppy_let); |
| 4813 SET_ALLOW(harmony_rest_parameters); | 4829 SET_ALLOW(harmony_rest_parameters); |
| 4814 SET_ALLOW(harmony_default_parameters); | 4830 SET_ALLOW(harmony_default_parameters); |
| 4815 SET_ALLOW(harmony_spread_calls); | 4831 SET_ALLOW(harmony_spread_calls); |
| 4816 SET_ALLOW(harmony_destructuring); | 4832 SET_ALLOW(harmony_destructuring); |
| 4817 SET_ALLOW(harmony_spread_arrays); | 4833 SET_ALLOW(harmony_spread_arrays); |
| 4818 SET_ALLOW(harmony_new_target); | 4834 SET_ALLOW(harmony_new_target); |
| 4819 SET_ALLOW(strong_mode); | 4835 SET_ALLOW(strong_mode); |
| 4820 SET_ALLOW(harmony_do_expressions); | 4836 SET_ALLOW(harmony_do_expressions); |
| 4837 SET_ALLOW(harmony_async_await); |
| 4821 #undef SET_ALLOW | 4838 #undef SET_ALLOW |
| 4822 } | 4839 } |
| 4823 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( | 4840 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
| 4824 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), | 4841 language_mode(), function_state_->kind(), scope_->has_simple_parameters(), |
| 4825 logger, bookmark); | 4842 logger, bookmark); |
| 4826 if (pre_parse_timer_ != NULL) { | 4843 if (pre_parse_timer_ != NULL) { |
| 4827 pre_parse_timer_->Stop(); | 4844 pre_parse_timer_->Stop(); |
| 4828 } | 4845 } |
| 4829 return result; | 4846 return result; |
| 4830 } | 4847 } |
| (...skipping 1556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6387 | 6404 |
| 6388 Expression* Parser::SpreadCallNew(Expression* function, | 6405 Expression* Parser::SpreadCallNew(Expression* function, |
| 6389 ZoneList<v8::internal::Expression*>* args, | 6406 ZoneList<v8::internal::Expression*>* args, |
| 6390 int pos) { | 6407 int pos) { |
| 6391 args->InsertAt(0, function, zone()); | 6408 args->InsertAt(0, function, zone()); |
| 6392 | 6409 |
| 6393 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); | 6410 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); |
| 6394 } | 6411 } |
| 6395 } // namespace internal | 6412 } // namespace internal |
| 6396 } // namespace v8 | 6413 } // namespace v8 |
| OLD | NEW |