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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 int start_position = peek_position(); | 116 int start_position = peek_position(); |
117 ParseLazyFunctionLiteralBody(&ok); | 117 ParseLazyFunctionLiteralBody(&ok); |
118 if (stack_overflow()) return kPreParseStackOverflow; | 118 if (stack_overflow()) return kPreParseStackOverflow; |
119 if (!ok) { | 119 if (!ok) { |
120 ReportUnexpectedToken(scanner()->current_token()); | 120 ReportUnexpectedToken(scanner()->current_token()); |
121 } else { | 121 } else { |
122 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 122 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
123 if (is_strict(scope_->language_mode())) { | 123 if (is_strict(scope_->language_mode())) { |
124 int end_pos = scanner()->location().end_pos; | 124 int end_pos = scanner()->location().end_pos; |
125 CheckStrictOctalLiteral(start_position, end_pos, &ok); | 125 CheckStrictOctalLiteral(start_position, end_pos, &ok); |
126 if (!ok) return kPreParseSuccess; | |
127 | |
128 if (is_strong(scope_->language_mode()) && IsSubclassConstructor(kind)) { | |
129 if (!function_state.super_location().IsValid()) { | |
130 ReportMessageAt(Scanner::Location(start_position, start_position + 1), | |
131 "strong_super_call_missing", kReferenceError); | |
132 return kPreParseSuccess; | |
133 } | |
134 } | |
135 } | 126 } |
136 } | 127 } |
137 return kPreParseSuccess; | 128 return kPreParseSuccess; |
138 } | 129 } |
139 | 130 |
140 | 131 |
141 PreParserExpression PreParserTraits::ParseClassLiteral( | 132 PreParserExpression PreParserTraits::ParseClassLiteral( |
142 PreParserIdentifier name, Scanner::Location class_name_location, | 133 PreParserIdentifier name, Scanner::Location class_name_location, |
143 bool name_is_strict_reserved, int pos, bool* ok) { | 134 bool name_is_strict_reserved, int pos, bool* ok) { |
144 return pre_parser_->ParseClassLiteral(name, class_name_location, | 135 return pre_parser_->ParseClassLiteral(name, class_name_location, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 | 189 |
199 void PreParser::ParseStatementList(int end_token, bool* ok) { | 190 void PreParser::ParseStatementList(int end_token, bool* ok) { |
200 // SourceElements :: | 191 // SourceElements :: |
201 // (Statement)* <end_token> | 192 // (Statement)* <end_token> |
202 | 193 |
203 bool directive_prologue = true; | 194 bool directive_prologue = true; |
204 while (peek() != end_token) { | 195 while (peek() != end_token) { |
205 if (directive_prologue && peek() != Token::STRING) { | 196 if (directive_prologue && peek() != Token::STRING) { |
206 directive_prologue = false; | 197 directive_prologue = false; |
207 } | 198 } |
208 Scanner::Location token_loc = scanner()->peek_location(); | 199 Token::Value token = peek(); |
209 Scanner::Location old_this_loc = function_state_->this_location(); | 200 Scanner::Location old_super_loc = function_state_->super_call_location(); |
210 Scanner::Location old_super_loc = function_state_->super_location(); | |
211 Statement statement = ParseStatementListItem(ok); | 201 Statement statement = ParseStatementListItem(ok); |
212 if (!*ok) return; | 202 if (!*ok) return; |
213 | 203 Scanner::Location super_loc = function_state_->super_call_location(); |
214 if (is_strong(language_mode()) && | 204 if (is_strong(language_mode()) && |
215 scope_->is_function_scope() && | 205 i::IsConstructor(function_state_->kind()) && |
216 i::IsConstructor(function_state_->kind())) { | 206 !old_super_loc.IsValid() && super_loc.IsValid() && |
217 Scanner::Location this_loc = function_state_->this_location(); | 207 token != Token::SUPER) { |
218 Scanner::Location super_loc = function_state_->super_location(); | 208 ReportMessageAt(super_loc, "strong_super_call_nested"); |
219 if (this_loc.beg_pos != old_this_loc.beg_pos && | 209 *ok = false; |
220 this_loc.beg_pos != token_loc.beg_pos) { | 210 return; |
221 ReportMessageAt(this_loc, "strong_constructor_this"); | |
222 *ok = false; | |
223 return; | |
224 } | |
225 if (super_loc.beg_pos != old_super_loc.beg_pos && | |
226 super_loc.beg_pos != token_loc.beg_pos) { | |
227 ReportMessageAt(super_loc, "strong_constructor_super"); | |
228 *ok = false; | |
229 return; | |
230 } | |
231 } | 211 } |
232 | |
233 if (directive_prologue) { | 212 if (directive_prologue) { |
234 if (statement.IsUseStrictLiteral()) { | 213 if (statement.IsUseStrictLiteral()) { |
235 scope_->SetLanguageMode( | 214 scope_->SetLanguageMode( |
236 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 215 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
237 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { | 216 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { |
238 scope_->SetLanguageMode(static_cast<LanguageMode>( | 217 scope_->SetLanguageMode(static_cast<LanguageMode>( |
239 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); | 218 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); |
240 } else if (!statement.IsStringLiteral()) { | 219 } else if (!statement.IsStringLiteral()) { |
241 directive_prologue = false; | 220 directive_prologue = false; |
242 } | 221 } |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 | 525 |
547 switch (peek()) { | 526 switch (peek()) { |
548 case Token::FUNCTION: | 527 case Token::FUNCTION: |
549 case Token::LBRACE: | 528 case Token::LBRACE: |
550 UNREACHABLE(); // Always handled by the callers. | 529 UNREACHABLE(); // Always handled by the callers. |
551 case Token::CLASS: | 530 case Token::CLASS: |
552 ReportUnexpectedToken(Next()); | 531 ReportUnexpectedToken(Next()); |
553 *ok = false; | 532 *ok = false; |
554 return Statement::Default(); | 533 return Statement::Default(); |
555 | 534 |
556 case Token::THIS: | |
557 case Token::SUPER: | |
558 if (is_strong(language_mode()) && | |
559 i::IsConstructor(function_state_->kind())) { | |
560 bool is_this = peek() == Token::THIS; | |
561 Expression expr = Expression::Default(); | |
562 if (is_this) { | |
563 expr = ParseStrongInitializationExpression(CHECK_OK); | |
564 } else { | |
565 expr = ParseStrongSuperCallExpression(CHECK_OK); | |
566 } | |
567 switch (peek()) { | |
568 case Token::SEMICOLON: | |
569 Consume(Token::SEMICOLON); | |
570 break; | |
571 case Token::RBRACE: | |
572 case Token::EOS: | |
573 break; | |
574 default: | |
575 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | |
576 ReportMessageAt(function_state_->this_location(), | |
577 is_this ? "strong_constructor_this" | |
578 : "strong_constructor_super"); | |
579 *ok = false; | |
580 return Statement::Default(); | |
581 } | |
582 } | |
583 return Statement::ExpressionStatement(expr); | |
584 } | |
585 break; | |
586 | |
587 // TODO(arv): Handle `let [` | 535 // TODO(arv): Handle `let [` |
588 // https://code.google.com/p/v8/issues/detail?id=3847 | 536 // https://code.google.com/p/v8/issues/detail?id=3847 |
589 | 537 |
590 default: | 538 default: |
591 break; | 539 break; |
592 } | 540 } |
593 | 541 |
594 bool starts_with_identifier = peek_any_identifier(); | 542 bool starts_with_identifier = peek_any_identifier(); |
595 Expression expr = ParseExpression(true, CHECK_OK); | 543 Expression expr = ParseExpression(true, CHECK_OK); |
596 // Even if the expression starts with an identifier, it is not necessarily an | 544 // Even if the expression starts with an identifier, it is not necessarily an |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 const bool use_strict_params = is_rest || IsConciseMethod(kind); | 965 const bool use_strict_params = is_rest || IsConciseMethod(kind); |
1018 CheckFunctionParameterNames(language_mode(), use_strict_params, error_locs, | 966 CheckFunctionParameterNames(language_mode(), use_strict_params, error_locs, |
1019 CHECK_OK); | 967 CHECK_OK); |
1020 | 968 |
1021 if (is_strict(language_mode())) { | 969 if (is_strict(language_mode())) { |
1022 int end_position = scanner()->location().end_pos; | 970 int end_position = scanner()->location().end_pos; |
1023 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 971 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
1024 } | 972 } |
1025 | 973 |
1026 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 974 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
1027 if (!function_state.super_location().IsValid()) { | 975 if (!function_state.super_call_location().IsValid()) { |
1028 ReportMessageAt(function_name_location, "strong_super_call_missing", | 976 ReportMessageAt(function_name_location, "strong_super_call_missing", |
1029 kReferenceError); | 977 kReferenceError); |
1030 *ok = false; | 978 *ok = false; |
1031 return Expression::Default(); | 979 return Expression::Default(); |
1032 } | 980 } |
1033 } | 981 } |
1034 | 982 |
1035 return Expression::Default(); | 983 return Expression::Default(); |
1036 } | 984 } |
1037 | 985 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 | 1067 |
1120 DCHECK(!spread_pos.IsValid()); | 1068 DCHECK(!spread_pos.IsValid()); |
1121 | 1069 |
1122 return Expression::Default(); | 1070 return Expression::Default(); |
1123 } | 1071 } |
1124 | 1072 |
1125 #undef CHECK_OK | 1073 #undef CHECK_OK |
1126 | 1074 |
1127 | 1075 |
1128 } } // v8::internal | 1076 } } // v8::internal |
OLD | NEW |