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 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
7 | 7 |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile), | 218 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile), |
219 function_literal_id_(0), | 219 function_literal_id_(0), |
220 allow_natives_(false), | 220 allow_natives_(false), |
221 allow_tailcalls_(false), | 221 allow_tailcalls_(false), |
222 allow_harmony_do_expressions_(false), | 222 allow_harmony_do_expressions_(false), |
223 allow_harmony_function_sent_(false), | 223 allow_harmony_function_sent_(false), |
224 allow_harmony_restrictive_generators_(false), | 224 allow_harmony_restrictive_generators_(false), |
225 allow_harmony_trailing_commas_(false), | 225 allow_harmony_trailing_commas_(false), |
226 allow_harmony_class_fields_(false), | 226 allow_harmony_class_fields_(false), |
227 allow_harmony_object_rest_spread_(false), | 227 allow_harmony_object_rest_spread_(false), |
228 allow_harmony_dynamic_import_(false) {} | 228 allow_harmony_dynamic_import_(false), |
| 229 allow_harmony_template_escapes_(false) {} |
229 | 230 |
230 #define ALLOW_ACCESSORS(name) \ | 231 #define ALLOW_ACCESSORS(name) \ |
231 bool allow_##name() const { return allow_##name##_; } \ | 232 bool allow_##name() const { return allow_##name##_; } \ |
232 void set_allow_##name(bool allow) { allow_##name##_ = allow; } | 233 void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
233 | 234 |
234 ALLOW_ACCESSORS(natives); | 235 ALLOW_ACCESSORS(natives); |
235 ALLOW_ACCESSORS(tailcalls); | 236 ALLOW_ACCESSORS(tailcalls); |
236 ALLOW_ACCESSORS(harmony_do_expressions); | 237 ALLOW_ACCESSORS(harmony_do_expressions); |
237 ALLOW_ACCESSORS(harmony_function_sent); | 238 ALLOW_ACCESSORS(harmony_function_sent); |
238 ALLOW_ACCESSORS(harmony_restrictive_generators); | 239 ALLOW_ACCESSORS(harmony_restrictive_generators); |
239 ALLOW_ACCESSORS(harmony_trailing_commas); | 240 ALLOW_ACCESSORS(harmony_trailing_commas); |
240 ALLOW_ACCESSORS(harmony_class_fields); | 241 ALLOW_ACCESSORS(harmony_class_fields); |
241 ALLOW_ACCESSORS(harmony_object_rest_spread); | 242 ALLOW_ACCESSORS(harmony_object_rest_spread); |
242 ALLOW_ACCESSORS(harmony_dynamic_import); | 243 ALLOW_ACCESSORS(harmony_dynamic_import); |
| 244 ALLOW_ACCESSORS(harmony_template_escapes); |
243 | 245 |
244 #undef ALLOW_ACCESSORS | 246 #undef ALLOW_ACCESSORS |
245 | 247 |
246 uintptr_t stack_limit() const { return stack_limit_; } | 248 uintptr_t stack_limit() const { return stack_limit_; } |
247 | 249 |
248 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } | 250 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } |
249 | 251 |
250 void set_default_eager_compile_hint( | 252 void set_default_eager_compile_hint( |
251 FunctionLiteral::EagerCompileHint eager_compile_hint) { | 253 FunctionLiteral::EagerCompileHint eager_compile_hint) { |
252 default_eager_compile_hint_ = eager_compile_hint; | 254 default_eager_compile_hint_ = eager_compile_hint; |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 return true; | 859 return true; |
858 } | 860 } |
859 return false; | 861 return false; |
860 } | 862 } |
861 | 863 |
862 bool PeekInOrOf() { | 864 bool PeekInOrOf() { |
863 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of")); | 865 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of")); |
864 } | 866 } |
865 | 867 |
866 // Checks whether an octal literal was last seen between beg_pos and end_pos. | 868 // Checks whether an octal literal was last seen between beg_pos and end_pos. |
867 // If so, reports an error. Only called for strict mode and template strings. | 869 // Only called for strict mode strings. |
868 void CheckOctalLiteral(int beg_pos, int end_pos, bool is_template, bool* ok) { | 870 void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) { |
869 Scanner::Location octal = scanner()->octal_position(); | 871 Scanner::Location octal = scanner()->octal_position(); |
870 if (octal.IsValid() && beg_pos <= octal.beg_pos && | 872 if (octal.IsValid() && beg_pos <= octal.beg_pos && |
871 octal.end_pos <= end_pos) { | 873 octal.end_pos <= end_pos) { |
872 MessageTemplate::Template message = | 874 MessageTemplate::Template message = scanner()->octal_message(); |
873 is_template ? MessageTemplate::kTemplateOctalLiteral | |
874 : scanner()->octal_message(); | |
875 DCHECK_NE(message, MessageTemplate::kNone); | 875 DCHECK_NE(message, MessageTemplate::kNone); |
876 impl()->ReportMessageAt(octal, message); | 876 impl()->ReportMessageAt(octal, message); |
877 scanner()->clear_octal_position(); | 877 scanner()->clear_octal_position(); |
878 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) { | 878 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) { |
879 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode); | 879 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode); |
880 } | 880 } |
881 *ok = false; | 881 *ok = false; |
882 } | 882 } |
883 } | 883 } |
884 | 884 |
885 inline void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) { | 885 // Checks if an octal literal or an invalid hex or unicode escape sequence |
886 CheckOctalLiteral(beg_pos, end_pos, false, ok); | 886 // appears between beg_pos and end_pos. In the presence of such, either |
887 } | 887 // returns false or reports an error, depending on dont_throw. Otherwise |
888 | 888 // returns true. |
889 inline void CheckTemplateOctalLiteral(int beg_pos, int end_pos, bool* ok) { | 889 inline bool CheckTemplateEscapes(int beg_pos, int end_pos, bool dont_throw, |
890 CheckOctalLiteral(beg_pos, end_pos, true, ok); | 890 bool* ok) { |
| 891 Scanner::Location octal = scanner()->octal_position(); |
| 892 if (octal.IsValid() && beg_pos <= octal.beg_pos && |
| 893 octal.end_pos <= end_pos) { |
| 894 if (dont_throw) { |
| 895 scanner()->clear_octal_position(); |
| 896 return false; |
| 897 } |
| 898 MessageTemplate::Template message = |
| 899 MessageTemplate::kTemplateOctalLiteral; |
| 900 impl()->ReportMessageAt(octal, message); |
| 901 scanner()->clear_octal_position(); |
| 902 *ok = false; |
| 903 } else if (scanner()->has_invalid_template_escape()) { |
| 904 if (dont_throw) { |
| 905 scanner()->clear_invalid_template_escape(); |
| 906 return false; |
| 907 } |
| 908 impl()->ReportMessageAt(scanner()->invalid_template_escape_location(), |
| 909 scanner()->invalid_template_escape_message()); |
| 910 scanner()->clear_invalid_template_escape(); |
| 911 *ok = false; |
| 912 } |
| 913 return true; |
891 } | 914 } |
892 | 915 |
893 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos); | 916 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos); |
894 | 917 |
895 // Checking the name of a function literal. This has to be done after parsing | 918 // Checking the name of a function literal. This has to be done after parsing |
896 // the function, since the function can declare itself strict. | 919 // the function, since the function can declare itself strict. |
897 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, | 920 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, |
898 FunctionNameValidity function_name_validity, | 921 FunctionNameValidity function_name_validity, |
899 const Scanner::Location& function_name_loc, bool* ok) { | 922 const Scanner::Location& function_name_loc, bool* ok) { |
900 if (function_name_validity == kSkipFunctionNameCheck) return; | 923 if (function_name_validity == kSkipFunctionNameCheck) return; |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 const FormalParametersT& parameters, | 1210 const FormalParametersT& parameters, |
1188 bool* ok); | 1211 bool* ok); |
1189 void ParseAsyncFunctionBody(Scope* scope, StatementListT body, | 1212 void ParseAsyncFunctionBody(Scope* scope, StatementListT body, |
1190 FunctionKind kind, FunctionBodyType type, | 1213 FunctionKind kind, FunctionBodyType type, |
1191 bool accept_IN, int pos, bool* ok); | 1214 bool accept_IN, int pos, bool* ok); |
1192 ExpressionT ParseAsyncFunctionLiteral(bool* ok); | 1215 ExpressionT ParseAsyncFunctionLiteral(bool* ok); |
1193 ExpressionT ParseClassLiteral(IdentifierT name, | 1216 ExpressionT ParseClassLiteral(IdentifierT name, |
1194 Scanner::Location class_name_location, | 1217 Scanner::Location class_name_location, |
1195 bool name_is_strict_reserved, | 1218 bool name_is_strict_reserved, |
1196 int class_token_pos, bool* ok); | 1219 int class_token_pos, bool* ok); |
1197 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); | 1220 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool tagged, |
| 1221 bool* ok); |
1198 ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 1222 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
1199 ExpressionT ParseDynamicImportExpression(bool* ok); | 1223 ExpressionT ParseDynamicImportExpression(bool* ok); |
1200 ExpressionT ParseNewTargetExpression(bool* ok); | 1224 ExpressionT ParseNewTargetExpression(bool* ok); |
1201 | 1225 |
1202 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); | 1226 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); |
1203 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); | 1227 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); |
1204 void CheckArityRestrictions(int param_count, FunctionKind function_type, | 1228 void CheckArityRestrictions(int param_count, FunctionKind function_type, |
1205 bool has_rest, int formals_start_pos, | 1229 bool has_rest, int formals_start_pos, |
1206 int formals_end_pos, bool* ok); | 1230 int formals_end_pos, bool* ok); |
1207 | 1231 |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1496 | 1520 |
1497 bool allow_natives_; | 1521 bool allow_natives_; |
1498 bool allow_tailcalls_; | 1522 bool allow_tailcalls_; |
1499 bool allow_harmony_do_expressions_; | 1523 bool allow_harmony_do_expressions_; |
1500 bool allow_harmony_function_sent_; | 1524 bool allow_harmony_function_sent_; |
1501 bool allow_harmony_restrictive_generators_; | 1525 bool allow_harmony_restrictive_generators_; |
1502 bool allow_harmony_trailing_commas_; | 1526 bool allow_harmony_trailing_commas_; |
1503 bool allow_harmony_class_fields_; | 1527 bool allow_harmony_class_fields_; |
1504 bool allow_harmony_object_rest_spread_; | 1528 bool allow_harmony_object_rest_spread_; |
1505 bool allow_harmony_dynamic_import_; | 1529 bool allow_harmony_dynamic_import_; |
| 1530 bool allow_harmony_template_escapes_; |
1506 | 1531 |
1507 friend class DiscardableZoneScope; | 1532 friend class DiscardableZoneScope; |
1508 }; | 1533 }; |
1509 | 1534 |
1510 template <typename Impl> | 1535 template <typename Impl> |
1511 ParserBase<Impl>::FunctionState::FunctionState( | 1536 ParserBase<Impl>::FunctionState::FunctionState( |
1512 FunctionState** function_state_stack, ScopeState** scope_stack, | 1537 FunctionState** function_state_stack, ScopeState** scope_stack, |
1513 DeclarationScope* scope) | 1538 DeclarationScope* scope) |
1514 : ScopeState(scope_stack, scope), | 1539 : ScopeState(scope_stack, scope), |
1515 next_materialized_literal_index_(0), | 1540 next_materialized_literal_index_(0), |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1866 CHECK_OK); | 1891 CHECK_OK); |
1867 class_name_location = scanner()->location(); | 1892 class_name_location = scanner()->location(); |
1868 } | 1893 } |
1869 return ParseClassLiteral(name, class_name_location, | 1894 return ParseClassLiteral(name, class_name_location, |
1870 is_strict_reserved_name, class_token_pos, ok); | 1895 is_strict_reserved_name, class_token_pos, ok); |
1871 } | 1896 } |
1872 | 1897 |
1873 case Token::TEMPLATE_SPAN: | 1898 case Token::TEMPLATE_SPAN: |
1874 case Token::TEMPLATE_TAIL: | 1899 case Token::TEMPLATE_TAIL: |
1875 BindingPatternUnexpectedToken(); | 1900 BindingPatternUnexpectedToken(); |
1876 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, ok); | 1901 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, false, ok); |
1877 | 1902 |
1878 case Token::MOD: | 1903 case Token::MOD: |
1879 if (allow_natives() || extension_ != NULL) { | 1904 if (allow_natives() || extension_ != NULL) { |
1880 BindingPatternUnexpectedToken(); | 1905 BindingPatternUnexpectedToken(); |
1881 return ParseV8Intrinsic(ok); | 1906 return ParseV8Intrinsic(ok); |
1882 } | 1907 } |
1883 break; | 1908 break; |
1884 | 1909 |
1885 case Token::DO: | 1910 case Token::DO: |
1886 if (allow_harmony_do_expressions()) { | 1911 if (allow_harmony_do_expressions()) { |
(...skipping 1400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3287 result, factory()->NewStringLiteral(name, pos), pos); | 3312 result, factory()->NewStringLiteral(name, pos), pos); |
3288 impl()->PushLiteralName(name); | 3313 impl()->PushLiteralName(name); |
3289 break; | 3314 break; |
3290 } | 3315 } |
3291 | 3316 |
3292 case Token::TEMPLATE_SPAN: | 3317 case Token::TEMPLATE_SPAN: |
3293 case Token::TEMPLATE_TAIL: { | 3318 case Token::TEMPLATE_TAIL: { |
3294 impl()->RewriteNonPattern(CHECK_OK); | 3319 impl()->RewriteNonPattern(CHECK_OK); |
3295 BindingPatternUnexpectedToken(); | 3320 BindingPatternUnexpectedToken(); |
3296 ArrowFormalParametersUnexpectedToken(); | 3321 ArrowFormalParametersUnexpectedToken(); |
3297 result = ParseTemplateLiteral(result, position(), CHECK_OK); | 3322 result = ParseTemplateLiteral(result, position(), true, CHECK_OK); |
3298 break; | 3323 break; |
3299 } | 3324 } |
3300 | 3325 |
3301 default: | 3326 default: |
3302 return result; | 3327 return result; |
3303 } | 3328 } |
3304 } | 3329 } |
3305 } | 3330 } |
3306 | 3331 |
3307 template <typename Impl> | 3332 template <typename Impl> |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3562 if (scanner()->current_token() == Token::IDENTIFIER) { | 3587 if (scanner()->current_token() == Token::IDENTIFIER) { |
3563 pos = position(); | 3588 pos = position(); |
3564 } else { | 3589 } else { |
3565 pos = peek_position(); | 3590 pos = peek_position(); |
3566 if (expression->IsFunctionLiteral()) { | 3591 if (expression->IsFunctionLiteral()) { |
3567 // If the tag function looks like an IIFE, set_parenthesized() to | 3592 // If the tag function looks like an IIFE, set_parenthesized() to |
3568 // force eager compilation. | 3593 // force eager compilation. |
3569 expression->AsFunctionLiteral()->SetShouldEagerCompile(); | 3594 expression->AsFunctionLiteral()->SetShouldEagerCompile(); |
3570 } | 3595 } |
3571 } | 3596 } |
3572 expression = ParseTemplateLiteral(expression, pos, CHECK_OK); | 3597 expression = ParseTemplateLiteral(expression, pos, true, CHECK_OK); |
3573 break; | 3598 break; |
3574 } | 3599 } |
3575 case Token::ILLEGAL: { | 3600 case Token::ILLEGAL: { |
3576 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); | 3601 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); |
3577 *ok = false; | 3602 *ok = false; |
3578 return impl()->EmptyExpression(); | 3603 return impl()->EmptyExpression(); |
3579 } | 3604 } |
3580 default: | 3605 default: |
3581 return expression; | 3606 return expression; |
3582 } | 3607 } |
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4448 } | 4473 } |
4449 return impl()->ParseFunctionLiteral( | 4474 return impl()->ParseFunctionLiteral( |
4450 name, scanner()->location(), | 4475 name, scanner()->location(), |
4451 is_strict_reserved ? kFunctionNameIsStrictReserved | 4476 is_strict_reserved ? kFunctionNameIsStrictReserved |
4452 : kFunctionNameValidityUnknown, | 4477 : kFunctionNameValidityUnknown, |
4453 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK); | 4478 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK); |
4454 } | 4479 } |
4455 | 4480 |
4456 template <typename Impl> | 4481 template <typename Impl> |
4457 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 4482 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( |
4458 ExpressionT tag, int start, bool* ok) { | 4483 ExpressionT tag, int start, bool tagged, bool* ok) { |
4459 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal | 4484 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal |
4460 // text followed by a substitution expression), finalized by a single | 4485 // text followed by a substitution expression), finalized by a single |
4461 // TEMPLATE_TAIL. | 4486 // TEMPLATE_TAIL. |
4462 // | 4487 // |
4463 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or | 4488 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or |
4464 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or | 4489 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or |
4465 // NoSubstitutionTemplate. | 4490 // NoSubstitutionTemplate. |
4466 // | 4491 // |
4467 // When parsing a TemplateLiteral, we must have scanned either an initial | 4492 // When parsing a TemplateLiteral, we must have scanned either an initial |
4468 // TEMPLATE_SPAN, or a TEMPLATE_TAIL. | 4493 // TEMPLATE_SPAN, or a TEMPLATE_TAIL. |
4469 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL); | 4494 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL); |
4470 | 4495 |
| 4496 bool allow_illegal_escapes = tagged && allow_harmony_template_escapes(); |
| 4497 bool should_cook = true; |
| 4498 |
4471 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate. | 4499 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate. |
4472 // In this case we may simply consume the token and build a template with a | 4500 // In this case we may simply consume the token and build a template with a |
4473 // single TEMPLATE_SPAN and no expressions. | 4501 // single TEMPLATE_SPAN and no expressions. |
4474 if (peek() == Token::TEMPLATE_TAIL) { | 4502 if (peek() == Token::TEMPLATE_TAIL) { |
4475 Consume(Token::TEMPLATE_TAIL); | 4503 Consume(Token::TEMPLATE_TAIL); |
4476 int pos = position(); | 4504 int pos = position(); |
4477 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4478 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); | 4505 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); |
4479 impl()->AddTemplateSpan(&ts, true); | 4506 should_cook = CheckTemplateEscapes(pos, peek_position(), |
| 4507 allow_illegal_escapes, CHECK_OK); |
| 4508 impl()->AddTemplateSpan(&ts, should_cook, true); |
4480 return impl()->CloseTemplateLiteral(&ts, start, tag); | 4509 return impl()->CloseTemplateLiteral(&ts, start, tag); |
4481 } | 4510 } |
4482 | 4511 |
4483 Consume(Token::TEMPLATE_SPAN); | 4512 Consume(Token::TEMPLATE_SPAN); |
4484 int pos = position(); | 4513 int pos = position(); |
| 4514 should_cook = CheckTemplateEscapes(pos, peek_position(), |
| 4515 allow_illegal_escapes, CHECK_OK); |
4485 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); | 4516 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); |
4486 impl()->AddTemplateSpan(&ts, false); | 4517 impl()->AddTemplateSpan(&ts, should_cook, false); |
4487 Token::Value next; | 4518 Token::Value next; |
4488 | 4519 |
4489 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression, | 4520 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression, |
4490 // and repeat if the following token is a TEMPLATE_SPAN as well (in this | 4521 // and repeat if the following token is a TEMPLATE_SPAN as well (in this |
4491 // case, representing a TemplateMiddle). | 4522 // case, representing a TemplateMiddle). |
4492 | 4523 |
4493 do { | 4524 do { |
4494 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4495 next = peek(); | 4525 next = peek(); |
4496 if (next == Token::EOS) { | 4526 if (next == Token::EOS) { |
4497 impl()->ReportMessageAt(Scanner::Location(start, peek_position()), | 4527 impl()->ReportMessageAt(Scanner::Location(start, peek_position()), |
4498 MessageTemplate::kUnterminatedTemplate); | 4528 MessageTemplate::kUnterminatedTemplate); |
4499 *ok = false; | 4529 *ok = false; |
4500 return impl()->EmptyExpression(); | 4530 return impl()->EmptyExpression(); |
4501 } else if (next == Token::ILLEGAL) { | 4531 } else if (next == Token::ILLEGAL) { |
4502 impl()->ReportMessageAt( | 4532 impl()->ReportMessageAt( |
4503 Scanner::Location(position() + 1, peek_position()), | 4533 Scanner::Location(position() + 1, peek_position()), |
4504 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 4534 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); |
(...skipping 25 matching lines...) Expand all Loading... |
4530 *ok = false; | 4560 *ok = false; |
4531 return impl()->EmptyExpression(); | 4561 return impl()->EmptyExpression(); |
4532 } else if (next == Token::ILLEGAL) { | 4562 } else if (next == Token::ILLEGAL) { |
4533 impl()->ReportMessageAt( | 4563 impl()->ReportMessageAt( |
4534 Scanner::Location(position() + 1, peek_position()), | 4564 Scanner::Location(position() + 1, peek_position()), |
4535 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 4565 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); |
4536 *ok = false; | 4566 *ok = false; |
4537 return impl()->EmptyExpression(); | 4567 return impl()->EmptyExpression(); |
4538 } | 4568 } |
4539 | 4569 |
4540 impl()->AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL); | 4570 should_cook = CheckTemplateEscapes(pos, peek_position(), |
| 4571 allow_illegal_escapes, CHECK_OK); |
| 4572 impl()->AddTemplateSpan(&ts, should_cook, next == Token::TEMPLATE_TAIL); |
4541 } while (next == Token::TEMPLATE_SPAN); | 4573 } while (next == Token::TEMPLATE_SPAN); |
4542 | 4574 |
4543 DCHECK_EQ(next, Token::TEMPLATE_TAIL); | 4575 DCHECK_EQ(next, Token::TEMPLATE_TAIL); |
4544 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4545 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. | 4576 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. |
4546 return impl()->CloseTemplateLiteral(&ts, start, tag); | 4577 return impl()->CloseTemplateLiteral(&ts, start, tag); |
4547 } | 4578 } |
4548 | 4579 |
4549 template <typename Impl> | 4580 template <typename Impl> |
4550 typename ParserBase<Impl>::ExpressionT | 4581 typename ParserBase<Impl>::ExpressionT |
4551 ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 4582 ParserBase<Impl>::CheckAndRewriteReferenceExpression( |
4552 ExpressionT expression, int beg_pos, int end_pos, | 4583 ExpressionT expression, int beg_pos, int end_pos, |
4553 MessageTemplate::Template message, bool* ok) { | 4584 MessageTemplate::Template message, bool* ok) { |
4554 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, | 4585 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, |
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5767 } | 5798 } |
5768 | 5799 |
5769 #undef CHECK_OK | 5800 #undef CHECK_OK |
5770 #undef CHECK_OK_CUSTOM | 5801 #undef CHECK_OK_CUSTOM |
5771 #undef CHECK_OK_VOID | 5802 #undef CHECK_OK_VOID |
5772 | 5803 |
5773 } // namespace internal | 5804 } // namespace internal |
5774 } // namespace v8 | 5805 } // namespace v8 |
5775 | 5806 |
5776 #endif // V8_PARSING_PARSER_BASE_H | 5807 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |