| 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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 int start_position = peek_position(); | 113 int start_position = peek_position(); |
| 114 ParseLazyFunctionLiteralBody(&ok); | 114 ParseLazyFunctionLiteralBody(&ok); |
| 115 if (stack_overflow()) return kPreParseStackOverflow; | 115 if (stack_overflow()) return kPreParseStackOverflow; |
| 116 if (!ok) { | 116 if (!ok) { |
| 117 ReportUnexpectedToken(scanner()->current_token()); | 117 ReportUnexpectedToken(scanner()->current_token()); |
| 118 } else { | 118 } else { |
| 119 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 119 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
| 120 if (is_strict(scope_->language_mode())) { | 120 if (is_strict(scope_->language_mode())) { |
| 121 int end_pos = scanner()->location().end_pos; | 121 int end_pos = scanner()->location().end_pos; |
| 122 CheckStrictOctalLiteral(start_position, end_pos, &ok); | 122 CheckStrictOctalLiteral(start_position, end_pos, &ok); |
| 123 if (!ok) return kPreParseSuccess; |
| 124 |
| 125 if (is_strong(scope_->language_mode()) && IsSubclassConstructor(kind)) { |
| 126 if (!function_state.super_location().IsValid()) { |
| 127 ReportMessageAt(Scanner::Location(start_position, start_position + 1), |
| 128 "strong_super_call_missing", kReferenceError); |
| 129 return kPreParseSuccess; |
| 130 } |
| 131 } |
| 123 } | 132 } |
| 124 } | 133 } |
| 125 return kPreParseSuccess; | 134 return kPreParseSuccess; |
| 126 } | 135 } |
| 127 | 136 |
| 128 | 137 |
| 129 PreParserExpression PreParserTraits::ParseClassLiteral( | 138 PreParserExpression PreParserTraits::ParseClassLiteral( |
| 130 PreParserIdentifier name, Scanner::Location class_name_location, | 139 PreParserIdentifier name, Scanner::Location class_name_location, |
| 131 bool name_is_strict_reserved, int pos, bool* ok) { | 140 bool name_is_strict_reserved, int pos, bool* ok) { |
| 132 return pre_parser_->ParseClassLiteral(name, class_name_location, | 141 return pre_parser_->ParseClassLiteral(name, class_name_location, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 195 |
| 187 void PreParser::ParseStatementList(int end_token, bool* ok) { | 196 void PreParser::ParseStatementList(int end_token, bool* ok) { |
| 188 // SourceElements :: | 197 // SourceElements :: |
| 189 // (Statement)* <end_token> | 198 // (Statement)* <end_token> |
| 190 | 199 |
| 191 bool directive_prologue = true; | 200 bool directive_prologue = true; |
| 192 while (peek() != end_token) { | 201 while (peek() != end_token) { |
| 193 if (directive_prologue && peek() != Token::STRING) { | 202 if (directive_prologue && peek() != Token::STRING) { |
| 194 directive_prologue = false; | 203 directive_prologue = false; |
| 195 } | 204 } |
| 196 Token::Value token = peek(); | 205 Scanner::Location token_loc = scanner()->peek_location(); |
| 197 Scanner::Location old_super_loc = function_state_->super_call_location(); | 206 Scanner::Location old_this_loc = function_state_->this_location(); |
| 207 Scanner::Location old_super_loc = function_state_->super_location(); |
| 198 Statement statement = ParseStatementListItem(ok); | 208 Statement statement = ParseStatementListItem(ok); |
| 199 if (!*ok) return; | 209 if (!*ok) return; |
| 200 Scanner::Location super_loc = function_state_->super_call_location(); | 210 |
| 201 if (is_strong(language_mode()) && | 211 if (is_strong(language_mode()) && |
| 202 i::IsConstructor(function_state_->kind()) && | 212 scope_->is_function_scope() && |
| 203 !old_super_loc.IsValid() && super_loc.IsValid() && | 213 i::IsConstructor(function_state_->kind())) { |
| 204 token != Token::SUPER) { | 214 Scanner::Location this_loc = function_state_->this_location(); |
| 205 ReportMessageAt(super_loc, "strong_super_call_nested"); | 215 Scanner::Location super_loc = function_state_->super_location(); |
| 206 *ok = false; | 216 if (this_loc.beg_pos != old_this_loc.beg_pos && |
| 207 return; | 217 this_loc.beg_pos != token_loc.beg_pos) { |
| 218 ReportMessageAt(this_loc, "strong_constructor_this"); |
| 219 *ok = false; |
| 220 return; |
| 221 } |
| 222 if (super_loc.beg_pos != old_super_loc.beg_pos && |
| 223 super_loc.beg_pos != token_loc.beg_pos) { |
| 224 ReportMessageAt(super_loc, "strong_constructor_super"); |
| 225 *ok = false; |
| 226 return; |
| 227 } |
| 208 } | 228 } |
| 229 |
| 209 if (directive_prologue) { | 230 if (directive_prologue) { |
| 210 if (statement.IsUseStrictLiteral()) { | 231 if (statement.IsUseStrictLiteral()) { |
| 211 scope_->SetLanguageMode( | 232 scope_->SetLanguageMode( |
| 212 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); | 233 static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT)); |
| 213 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { | 234 } else if (statement.IsUseStrongLiteral() && allow_strong_mode()) { |
| 214 scope_->SetLanguageMode(static_cast<LanguageMode>( | 235 scope_->SetLanguageMode(static_cast<LanguageMode>( |
| 215 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); | 236 scope_->language_mode() | STRICT_BIT | STRONG_BIT)); |
| 216 } else if (!statement.IsStringLiteral()) { | 237 } else if (!statement.IsStringLiteral()) { |
| 217 directive_prologue = false; | 238 directive_prologue = false; |
| 218 } | 239 } |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 | 529 |
| 509 switch (peek()) { | 530 switch (peek()) { |
| 510 case Token::FUNCTION: | 531 case Token::FUNCTION: |
| 511 case Token::LBRACE: | 532 case Token::LBRACE: |
| 512 UNREACHABLE(); // Always handled by the callers. | 533 UNREACHABLE(); // Always handled by the callers. |
| 513 case Token::CLASS: | 534 case Token::CLASS: |
| 514 ReportUnexpectedToken(Next()); | 535 ReportUnexpectedToken(Next()); |
| 515 *ok = false; | 536 *ok = false; |
| 516 return Statement::Default(); | 537 return Statement::Default(); |
| 517 | 538 |
| 539 case Token::THIS: |
| 540 case Token::SUPER: |
| 541 if (is_strong(language_mode()) && |
| 542 i::IsConstructor(function_state_->kind())) { |
| 543 bool is_this = peek() == Token::THIS; |
| 544 Expression expr = Expression::Default(); |
| 545 if (is_this) { |
| 546 expr = ParseStrongInitializationExpression(CHECK_OK); |
| 547 } else { |
| 548 expr = ParseStrongSuperCallExpression(CHECK_OK); |
| 549 } |
| 550 switch (peek()) { |
| 551 case Token::SEMICOLON: |
| 552 Consume(Token::SEMICOLON); |
| 553 break; |
| 554 case Token::RBRACE: |
| 555 case Token::EOS: |
| 556 break; |
| 557 default: |
| 558 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { |
| 559 ReportMessageAt(function_state_->this_location(), |
| 560 is_this ? "strong_constructor_this" |
| 561 : "strong_constructor_super"); |
| 562 *ok = false; |
| 563 return Statement::Default(); |
| 564 } |
| 565 } |
| 566 return Statement::ExpressionStatement(expr); |
| 567 } |
| 568 break; |
| 569 |
| 518 // TODO(arv): Handle `let [` | 570 // TODO(arv): Handle `let [` |
| 519 // https://code.google.com/p/v8/issues/detail?id=3847 | 571 // https://code.google.com/p/v8/issues/detail?id=3847 |
| 520 | 572 |
| 521 default: | 573 default: |
| 522 break; | 574 break; |
| 523 } | 575 } |
| 524 | 576 |
| 525 bool starts_with_identifier = peek_any_identifier(); | 577 bool starts_with_identifier = peek_any_identifier(); |
| 526 Expression expr = ParseExpression(true, CHECK_OK); | 578 Expression expr = ParseExpression(true, CHECK_OK); |
| 527 // Even if the expression starts with an identifier, it is not necessarily an | 579 // Even if the expression starts with an identifier, it is not necessarily an |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 CheckFunctionParameterNames(language_mode(), use_strict_params, | 1004 CheckFunctionParameterNames(language_mode(), use_strict_params, |
| 953 eval_args_error_loc, dupe_error_loc, | 1005 eval_args_error_loc, dupe_error_loc, |
| 954 reserved_error_loc, CHECK_OK); | 1006 reserved_error_loc, CHECK_OK); |
| 955 | 1007 |
| 956 if (is_strict(language_mode())) { | 1008 if (is_strict(language_mode())) { |
| 957 int end_position = scanner()->location().end_pos; | 1009 int end_position = scanner()->location().end_pos; |
| 958 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 1010 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
| 959 } | 1011 } |
| 960 | 1012 |
| 961 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { | 1013 if (is_strong(language_mode()) && IsSubclassConstructor(kind)) { |
| 962 if (!function_state.super_call_location().IsValid()) { | 1014 if (!function_state.super_location().IsValid()) { |
| 963 ReportMessageAt(function_name_location, "strong_super_call_missing", | 1015 ReportMessageAt(function_name_location, "strong_super_call_missing", |
| 964 kReferenceError); | 1016 kReferenceError); |
| 965 *ok = false; | 1017 *ok = false; |
| 966 return Expression::Default(); | 1018 return Expression::Default(); |
| 967 } | 1019 } |
| 968 } | 1020 } |
| 969 | 1021 |
| 970 return Expression::Default(); | 1022 return Expression::Default(); |
| 971 } | 1023 } |
| 972 | 1024 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); | 1097 ParseIdentifier(kAllowEvalOrArguments, CHECK_OK); |
| 1046 ParseArguments(ok); | 1098 ParseArguments(ok); |
| 1047 | 1099 |
| 1048 return Expression::Default(); | 1100 return Expression::Default(); |
| 1049 } | 1101 } |
| 1050 | 1102 |
| 1051 #undef CHECK_OK | 1103 #undef CHECK_OK |
| 1052 | 1104 |
| 1053 | 1105 |
| 1054 } } // v8::internal | 1106 } } // v8::internal |
| OLD | NEW |