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-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 // Parse the function literal. | 933 // Parse the function literal. |
934 Scope* outer = original_scope_; | 934 Scope* outer = original_scope_; |
935 DeclarationScope* outer_function = outer->GetClosureScope(); | 935 DeclarationScope* outer_function = outer->GetClosureScope(); |
936 DCHECK(outer); | 936 DCHECK(outer); |
937 FunctionState function_state(&function_state_, &scope_state_, | 937 FunctionState function_state(&function_state_, &scope_state_, |
938 outer_function); | 938 outer_function); |
939 BlockState block_state(&scope_state_, outer); | 939 BlockState block_state(&scope_state_, outer); |
940 DCHECK(is_sloppy(outer->language_mode()) || | 940 DCHECK(is_sloppy(outer->language_mode()) || |
941 is_strict(info->language_mode())); | 941 is_strict(info->language_mode())); |
942 FunctionLiteral::FunctionType function_type = ComputeFunctionType(info); | 942 FunctionLiteral::FunctionType function_type = ComputeFunctionType(info); |
| 943 FunctionKind kind = info->function_kind(); |
943 bool ok = true; | 944 bool ok = true; |
944 | 945 |
945 if (info->is_arrow()) { | 946 if (IsArrowFunction(kind)) { |
946 bool is_async = allow_harmony_async_await() && info->is_async(); | 947 if (allow_harmony_async_await() && IsAsyncFunction(kind)) { |
947 if (is_async) { | |
948 DCHECK(!scanner()->HasAnyLineTerminatorAfterNext()); | 948 DCHECK(!scanner()->HasAnyLineTerminatorAfterNext()); |
949 if (!Check(Token::ASYNC)) { | 949 if (!Check(Token::ASYNC)) { |
950 CHECK(stack_overflow()); | 950 CHECK(stack_overflow()); |
951 return nullptr; | 951 return nullptr; |
952 } | 952 } |
953 if (!(peek_any_identifier() || peek() == Token::LPAREN)) { | 953 if (!(peek_any_identifier() || peek() == Token::LPAREN)) { |
954 CHECK(stack_overflow()); | 954 CHECK(stack_overflow()); |
955 return nullptr; | 955 return nullptr; |
956 } | 956 } |
957 } | 957 } |
958 | 958 |
959 // TODO(adamk): We should construct this scope from the ScopeInfo. | 959 // TODO(adamk): We should construct this scope from the ScopeInfo. |
960 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction; | 960 DeclarationScope* scope = NewFunctionScope(kind); |
961 DeclarationScope* scope = NewFunctionScope(arrow_kind); | |
962 | 961 |
963 // These two bits only need to be explicitly set because we're | 962 // These two bits only need to be explicitly set because we're |
964 // not passing the ScopeInfo to the Scope constructor. | 963 // not passing the ScopeInfo to the Scope constructor. |
965 // TODO(adamk): Remove these calls once the above NewScope call | 964 // TODO(adamk): Remove these calls once the above NewScope call |
966 // passes the ScopeInfo. | 965 // passes the ScopeInfo. |
967 if (info->calls_eval()) { | 966 if (info->calls_eval()) { |
968 scope->RecordEvalCall(); | 967 scope->RecordEvalCall(); |
969 } | 968 } |
970 SetLanguageMode(scope, info->language_mode()); | 969 SetLanguageMode(scope, info->language_mode()); |
971 | 970 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 if (scanner()->location().end_pos == info->end_position()) { | 1003 if (scanner()->location().end_pos == info->end_position()) { |
1005 // The pre-parser saw an arrow function here, so the full parser | 1004 // The pre-parser saw an arrow function here, so the full parser |
1006 // must produce a FunctionLiteral. | 1005 // must produce a FunctionLiteral. |
1007 DCHECK(expression->IsFunctionLiteral()); | 1006 DCHECK(expression->IsFunctionLiteral()); |
1008 result = expression->AsFunctionLiteral(); | 1007 result = expression->AsFunctionLiteral(); |
1009 } else { | 1008 } else { |
1010 ok = false; | 1009 ok = false; |
1011 } | 1010 } |
1012 } | 1011 } |
1013 } | 1012 } |
1014 } else if (info->is_default_constructor()) { | 1013 } else if (IsDefaultConstructor(kind)) { |
1015 DCHECK_EQ(scope(), outer); | 1014 DCHECK_EQ(scope(), outer); |
1016 bool is_subclass_constructor = | 1015 bool is_subclass_constructor = IsSubclassConstructor(kind); |
1017 IsSubclassConstructor(info->function_kind()); | |
1018 result = DefaultConstructor( | 1016 result = DefaultConstructor( |
1019 raw_name, is_subclass_constructor, info->requires_class_field_init(), | 1017 raw_name, is_subclass_constructor, info->requires_class_field_init(), |
1020 info->start_position(), info->end_position(), info->language_mode()); | 1018 info->start_position(), info->end_position(), info->language_mode()); |
1021 if (!is_subclass_constructor && info->requires_class_field_init()) { | 1019 if (!is_subclass_constructor && info->requires_class_field_init()) { |
1022 result = InsertClassFieldInitializer(result); | 1020 result = InsertClassFieldInitializer(result); |
1023 } | 1021 } |
1024 } else if (info->is_class_field_initializer()) { | 1022 } else if (info->is_class_field_initializer()) { |
1025 Handle<SharedFunctionInfo> shared_info = info->shared_info(); | 1023 Handle<SharedFunctionInfo> shared_info = info->shared_info(); |
1026 DCHECK(!shared_info.is_null()); | 1024 DCHECK(!shared_info.is_null()); |
1027 if (shared_info->length() == 0) { | 1025 if (shared_info->length() == 0) { |
1028 result = ParseClassFieldForInitializer( | 1026 result = ParseClassFieldForInitializer( |
1029 info->start_position() != info->end_position(), &ok); | 1027 info->start_position() != info->end_position(), &ok); |
1030 } else { | 1028 } else { |
1031 result = SynthesizeClassFieldInitializer(shared_info->length()); | 1029 result = SynthesizeClassFieldInitializer(shared_info->length()); |
1032 } | 1030 } |
1033 } else { | 1031 } else { |
1034 result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(), | 1032 result = ParseFunctionLiteral( |
1035 kSkipFunctionNameCheck, | 1033 raw_name, Scanner::Location::invalid(), kSkipFunctionNameCheck, kind, |
1036 info->function_kind(), kNoSourcePosition, | 1034 kNoSourcePosition, function_type, info->language_mode(), &ok); |
1037 function_type, info->language_mode(), &ok); | |
1038 if (info->requires_class_field_init()) { | 1035 if (info->requires_class_field_init()) { |
1039 result = InsertClassFieldInitializer(result); | 1036 result = InsertClassFieldInitializer(result); |
1040 } | 1037 } |
1041 } | 1038 } |
1042 // Make sure the results agree. | 1039 // Make sure the results agree. |
1043 DCHECK(ok == (result != nullptr)); | 1040 DCHECK(ok == (result != nullptr)); |
1044 } | 1041 } |
1045 | 1042 |
1046 // Make sure the target stack is empty. | 1043 // Make sure the target stack is empty. |
1047 DCHECK_NULL(target_stack_); | 1044 DCHECK_NULL(target_stack_); |
(...skipping 4514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5562 | 5559 |
5563 return final_loop; | 5560 return final_loop; |
5564 } | 5561 } |
5565 | 5562 |
5566 #undef CHECK_OK | 5563 #undef CHECK_OK |
5567 #undef CHECK_OK_VOID | 5564 #undef CHECK_OK_VOID |
5568 #undef CHECK_FAILED | 5565 #undef CHECK_FAILED |
5569 | 5566 |
5570 } // namespace internal | 5567 } // namespace internal |
5571 } // namespace v8 | 5568 } // namespace v8 |
OLD | NEW |