OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 | 186 |
187 void PreParser::ParseStatementList(int end_token, bool* ok) { | 187 void PreParser::ParseStatementList(int end_token, bool* ok) { |
188 // SourceElements :: | 188 // SourceElements :: |
189 // (Statement)* <end_token> | 189 // (Statement)* <end_token> |
190 | 190 |
191 bool directive_prologue = true; | 191 bool directive_prologue = true; |
192 while (peek() != end_token) { | 192 while (peek() != end_token) { |
193 if (directive_prologue && peek() != Token::STRING) { | 193 if (directive_prologue && peek() != Token::STRING) { |
194 directive_prologue = false; | 194 directive_prologue = false; |
195 } | 195 } |
| 196 Token::Value token = peek(); |
| 197 Scanner::Location old_super_loc = function_state_->super_call_location(); |
196 Statement statement = ParseStatementListItem(ok); | 198 Statement statement = ParseStatementListItem(ok); |
197 if (!*ok) return; | 199 if (!*ok) return; |
| 200 Scanner::Location super_loc = function_state_->super_call_location(); |
| 201 if (is_strong(language_mode()) && |
| 202 i::IsConstructor(function_state_->kind()) && |
| 203 !old_super_loc.IsValid() && super_loc.IsValid() && |
| 204 token != Token::SUPER) { |
| 205 ReportMessageAt(super_loc, "strong_super_call_nested"); |
| 206 *ok = false; |
| 207 return; |
| 208 } |
198 if (directive_prologue) { | 209 if (directive_prologue) { |
199 if (statement.IsUseStrictLiteral()) { | 210 if (statement.IsUseStrictLiteral()) { |
200 scope_->SetLanguageMode( | 211 scope_->SetLanguageMode( |
201 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 212 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
202 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { | 213 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { |
203 scope_->SetLanguageMode(static_cast<LanguageMode>( | 214 scope_->SetLanguageMode(static_cast<LanguageMode>( |
204 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); | 215 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); |
205 } else if (!statement.IsStringLiteral()) { | 216 } else if (!statement.IsStringLiteral()) { |
206 directive_prologue = false; | 217 directive_prologue = false; |
207 } | 218 } |
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
931 const bool use_strict_params = is_rest || IsConciseMethod(kind); | 942 const bool use_strict_params = is_rest || IsConciseMethod(kind); |
932 CheckFunctionParameterNames(language_mode(), use_strict_params, | 943 CheckFunctionParameterNames(language_mode(), use_strict_params, |
933 eval_args_error_loc, dupe_error_loc, | 944 eval_args_error_loc, dupe_error_loc, |
934 reserved_error_loc, CHECK_OK); | 945 reserved_error_loc, CHECK_OK); |
935 | 946 |
936 if (is_strict(language_mode())) { | 947 if (is_strict(language_mode())) { |
937 int end_position = scanner()->location().end_pos; | 948 int end_position = scanner()->location().end_pos; |
938 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 949 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
939 } | 950 } |
940 | 951 |
| 952 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
| 953 if (!function_state.super_call_location().IsValid()) { |
| 954 ReportMessageAt(function_name_location, "strong_super_call_missing", |
| 955 kReferenceError); |
| 956 *ok = false; |
| 957 return Expression::Default(); |
| 958 } |
| 959 } |
| 960 |
941 return Expression::Default(); | 961 return Expression::Default(); |
942 } | 962 } |
943 | 963 |
944 | 964 |
945 void PreParser::ParseLazyFunctionLiteralBody(bool* ok) { | 965 void PreParser::ParseLazyFunctionLiteralBody(bool* ok) { |
946 int body_start = position(); | 966 int body_start = position(); |
947 ParseStatementList(Token::RBRACE, ok); | 967 ParseStatementList(Token::RBRACE, ok); |
948 if (!*ok) return; | 968 if (!*ok) return; |
949 | 969 |
950 // Position right after terminal '}'. | 970 // Position right after terminal '}'. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 1036 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
1017 ParseArguments(ok); | 1037 ParseArguments(ok); |
1018 | 1038 |
1019 return Expression::Default(); | 1039 return Expression::Default(); |
1020 } | 1040 } |
1021 | 1041 |
1022 #undef CHECK_OK | 1042 #undef CHECK_OK |
1023 | 1043 |
1024 | 1044 |
1025 } } // v8::internal | 1045 } } // v8::internal |
OLD | NEW |