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 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
868 return true; | 870 return true; |
869 } | 871 } |
870 return false; | 872 return false; |
871 } | 873 } |
872 | 874 |
873 bool PeekInOrOf() { | 875 bool PeekInOrOf() { |
874 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of")); | 876 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of")); |
875 } | 877 } |
876 | 878 |
877 // Checks whether an octal literal was last seen between beg_pos and end_pos. | 879 // Checks whether an octal literal was last seen between beg_pos and end_pos. |
878 // If so, reports an error. Only called for strict mode and template strings. | 880 // Only called for strict mode strings. |
879 void CheckOctalLiteral(int beg_pos, int end_pos, bool is_template, bool* ok) { | 881 void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) { |
880 Scanner::Location octal = scanner()->octal_position(); | 882 Scanner::Location octal = scanner()->octal_position(); |
881 if (octal.IsValid() && beg_pos <= octal.beg_pos && | 883 if (octal.IsValid() && beg_pos <= octal.beg_pos && |
882 octal.end_pos <= end_pos) { | 884 octal.end_pos <= end_pos) { |
883 MessageTemplate::Template message = | 885 MessageTemplate::Template message = scanner()->octal_message(); |
884 is_template ? MessageTemplate::kTemplateOctalLiteral | |
885 : scanner()->octal_message(); | |
886 DCHECK_NE(message, MessageTemplate::kNone); | 886 DCHECK_NE(message, MessageTemplate::kNone); |
887 impl()->ReportMessageAt(octal, message); | 887 impl()->ReportMessageAt(octal, message); |
888 scanner()->clear_octal_position(); | 888 scanner()->clear_octal_position(); |
889 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) { | 889 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) { |
890 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode); | 890 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode); |
891 } | 891 } |
892 *ok = false; | 892 *ok = false; |
893 } | 893 } |
894 } | 894 } |
895 | 895 |
896 inline void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) { | 896 // Checks if an octal literal or an invalid hex or unicode escape sequence |
897 CheckOctalLiteral(beg_pos, end_pos, false, ok); | 897 // appears between beg_pos and end_pos. In the presence of such, either |
898 } | 898 // returns false or reports an error, depending on dont_throw. Otherwise |
899 | 899 // returns true. |
900 inline void CheckTemplateOctalLiteral(int beg_pos, int end_pos, bool* ok) { | 900 inline bool CheckTemplateEscapes(int beg_pos, int end_pos, bool dont_throw, |
901 CheckOctalLiteral(beg_pos, end_pos, true, ok); | 901 bool* ok) { |
902 Scanner::Location octal = scanner()->octal_position(); | |
903 if (octal.IsValid() && beg_pos <= octal.beg_pos && | |
904 octal.end_pos <= end_pos) { | |
905 if (dont_throw) { | |
906 scanner()->clear_octal_position(); | |
907 return false; | |
908 } | |
909 MessageTemplate::Template message = | |
910 MessageTemplate::kTemplateOctalLiteral; | |
911 impl()->ReportMessageAt(octal, message); | |
912 scanner()->clear_octal_position(); | |
913 *ok = false; | |
914 } else if (scanner()->has_error()) { | |
915 if (dont_throw) { | |
916 scanner()->clear_error(); | |
917 return false; | |
918 } | |
919 impl()->ReportMessageAt(scanner()->error_location(), scanner()->error()); | |
920 scanner()->clear_error(); | |
921 *ok = false; | |
922 } | |
923 return true; | |
902 } | 924 } |
903 | 925 |
904 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos); | 926 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos); |
905 | 927 |
906 // Checking the name of a function literal. This has to be done after parsing | 928 // Checking the name of a function literal. This has to be done after parsing |
907 // the function, since the function can declare itself strict. | 929 // the function, since the function can declare itself strict. |
908 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, | 930 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, |
909 FunctionNameValidity function_name_validity, | 931 FunctionNameValidity function_name_validity, |
910 const Scanner::Location& function_name_loc, bool* ok) { | 932 const Scanner::Location& function_name_loc, bool* ok) { |
911 if (function_name_validity == kSkipFunctionNameCheck) return; | 933 if (function_name_validity == kSkipFunctionNameCheck) return; |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1198 const FormalParametersT& parameters, | 1220 const FormalParametersT& parameters, |
1199 bool* ok); | 1221 bool* ok); |
1200 void ParseAsyncFunctionBody(Scope* scope, StatementListT body, | 1222 void ParseAsyncFunctionBody(Scope* scope, StatementListT body, |
1201 FunctionKind kind, FunctionBodyType type, | 1223 FunctionKind kind, FunctionBodyType type, |
1202 bool accept_IN, int pos, bool* ok); | 1224 bool accept_IN, int pos, bool* ok); |
1203 ExpressionT ParseAsyncFunctionLiteral(bool* ok); | 1225 ExpressionT ParseAsyncFunctionLiteral(bool* ok); |
1204 ExpressionT ParseClassLiteral(IdentifierT name, | 1226 ExpressionT ParseClassLiteral(IdentifierT name, |
1205 Scanner::Location class_name_location, | 1227 Scanner::Location class_name_location, |
1206 bool name_is_strict_reserved, | 1228 bool name_is_strict_reserved, |
1207 int class_token_pos, bool* ok); | 1229 int class_token_pos, bool* ok); |
1230 template <bool tagged> | |
vogelheim
2017/02/13 17:36:06
Why is this a template parameter, rather than a re
bakkot1
2017/02/13 20:22:24
I default to using template parameters for statica
| |
1208 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); | 1231 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); |
1209 ExpressionT ParseSuperExpression(bool is_new, bool* ok); | 1232 ExpressionT ParseSuperExpression(bool is_new, bool* ok); |
1210 ExpressionT ParseDynamicImportExpression(bool* ok); | 1233 ExpressionT ParseDynamicImportExpression(bool* ok); |
1211 ExpressionT ParseNewTargetExpression(bool* ok); | 1234 ExpressionT ParseNewTargetExpression(bool* ok); |
1212 | 1235 |
1213 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); | 1236 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); |
1214 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); | 1237 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); |
1215 void CheckArityRestrictions(int param_count, FunctionKind function_type, | 1238 void CheckArityRestrictions(int param_count, FunctionKind function_type, |
1216 bool has_rest, int formals_start_pos, | 1239 bool has_rest, int formals_start_pos, |
1217 int formals_end_pos, bool* ok); | 1240 int formals_end_pos, bool* ok); |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1480 | 1503 |
1481 bool allow_natives_; | 1504 bool allow_natives_; |
1482 bool allow_tailcalls_; | 1505 bool allow_tailcalls_; |
1483 bool allow_harmony_do_expressions_; | 1506 bool allow_harmony_do_expressions_; |
1484 bool allow_harmony_function_sent_; | 1507 bool allow_harmony_function_sent_; |
1485 bool allow_harmony_restrictive_generators_; | 1508 bool allow_harmony_restrictive_generators_; |
1486 bool allow_harmony_trailing_commas_; | 1509 bool allow_harmony_trailing_commas_; |
1487 bool allow_harmony_class_fields_; | 1510 bool allow_harmony_class_fields_; |
1488 bool allow_harmony_object_rest_spread_; | 1511 bool allow_harmony_object_rest_spread_; |
1489 bool allow_harmony_dynamic_import_; | 1512 bool allow_harmony_dynamic_import_; |
1513 bool allow_harmony_template_escapes_; | |
1490 | 1514 |
1491 friend class DiscardableZoneScope; | 1515 friend class DiscardableZoneScope; |
1492 }; | 1516 }; |
1493 | 1517 |
1494 template <typename Impl> | 1518 template <typename Impl> |
1495 ParserBase<Impl>::FunctionState::FunctionState( | 1519 ParserBase<Impl>::FunctionState::FunctionState( |
1496 FunctionState** function_state_stack, ScopeState** scope_stack, | 1520 FunctionState** function_state_stack, ScopeState** scope_stack, |
1497 DeclarationScope* scope) | 1521 DeclarationScope* scope) |
1498 : ScopeState(scope_stack, scope), | 1522 : ScopeState(scope_stack, scope), |
1499 next_materialized_literal_index_(0), | 1523 next_materialized_literal_index_(0), |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1849 CHECK_OK); | 1873 CHECK_OK); |
1850 class_name_location = scanner()->location(); | 1874 class_name_location = scanner()->location(); |
1851 } | 1875 } |
1852 return ParseClassLiteral(name, class_name_location, | 1876 return ParseClassLiteral(name, class_name_location, |
1853 is_strict_reserved_name, class_token_pos, ok); | 1877 is_strict_reserved_name, class_token_pos, ok); |
1854 } | 1878 } |
1855 | 1879 |
1856 case Token::TEMPLATE_SPAN: | 1880 case Token::TEMPLATE_SPAN: |
1857 case Token::TEMPLATE_TAIL: | 1881 case Token::TEMPLATE_TAIL: |
1858 BindingPatternUnexpectedToken(); | 1882 BindingPatternUnexpectedToken(); |
1859 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, ok); | 1883 return ParseTemplateLiteral<false>(impl()->NoTemplateTag(), beg_pos, ok); |
1860 | 1884 |
1861 case Token::MOD: | 1885 case Token::MOD: |
1862 if (allow_natives() || extension_ != NULL) { | 1886 if (allow_natives() || extension_ != NULL) { |
1863 BindingPatternUnexpectedToken(); | 1887 BindingPatternUnexpectedToken(); |
1864 return ParseV8Intrinsic(ok); | 1888 return ParseV8Intrinsic(ok); |
1865 } | 1889 } |
1866 break; | 1890 break; |
1867 | 1891 |
1868 case Token::DO: | 1892 case Token::DO: |
1869 if (allow_harmony_do_expressions()) { | 1893 if (allow_harmony_do_expressions()) { |
(...skipping 1400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3270 result, factory()->NewStringLiteral(name, pos), pos); | 3294 result, factory()->NewStringLiteral(name, pos), pos); |
3271 impl()->PushLiteralName(name); | 3295 impl()->PushLiteralName(name); |
3272 break; | 3296 break; |
3273 } | 3297 } |
3274 | 3298 |
3275 case Token::TEMPLATE_SPAN: | 3299 case Token::TEMPLATE_SPAN: |
3276 case Token::TEMPLATE_TAIL: { | 3300 case Token::TEMPLATE_TAIL: { |
3277 impl()->RewriteNonPattern(CHECK_OK); | 3301 impl()->RewriteNonPattern(CHECK_OK); |
3278 BindingPatternUnexpectedToken(); | 3302 BindingPatternUnexpectedToken(); |
3279 ArrowFormalParametersUnexpectedToken(); | 3303 ArrowFormalParametersUnexpectedToken(); |
3280 result = ParseTemplateLiteral(result, position(), CHECK_OK); | 3304 result = ParseTemplateLiteral<true>(result, position(), CHECK_OK); |
3281 break; | 3305 break; |
3282 } | 3306 } |
3283 | 3307 |
3284 default: | 3308 default: |
3285 return result; | 3309 return result; |
3286 } | 3310 } |
3287 } | 3311 } |
3288 } | 3312 } |
3289 | 3313 |
3290 template <typename Impl> | 3314 template <typename Impl> |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3545 if (scanner()->current_token() == Token::IDENTIFIER) { | 3569 if (scanner()->current_token() == Token::IDENTIFIER) { |
3546 pos = position(); | 3570 pos = position(); |
3547 } else { | 3571 } else { |
3548 pos = peek_position(); | 3572 pos = peek_position(); |
3549 if (expression->IsFunctionLiteral()) { | 3573 if (expression->IsFunctionLiteral()) { |
3550 // If the tag function looks like an IIFE, set_parenthesized() to | 3574 // If the tag function looks like an IIFE, set_parenthesized() to |
3551 // force eager compilation. | 3575 // force eager compilation. |
3552 expression->AsFunctionLiteral()->SetShouldEagerCompile(); | 3576 expression->AsFunctionLiteral()->SetShouldEagerCompile(); |
3553 } | 3577 } |
3554 } | 3578 } |
3555 expression = ParseTemplateLiteral(expression, pos, CHECK_OK); | 3579 expression = ParseTemplateLiteral<true>(expression, pos, CHECK_OK); |
3556 break; | 3580 break; |
3557 } | 3581 } |
3558 case Token::ILLEGAL: { | 3582 case Token::ILLEGAL: { |
3559 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); | 3583 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); |
3560 *ok = false; | 3584 *ok = false; |
3561 return impl()->EmptyExpression(); | 3585 return impl()->EmptyExpression(); |
3562 } | 3586 } |
3563 default: | 3587 default: |
3564 return expression; | 3588 return expression; |
3565 } | 3589 } |
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4437 &is_strict_reserved, CHECK_OK); | 4461 &is_strict_reserved, CHECK_OK); |
4438 } | 4462 } |
4439 return impl()->ParseFunctionLiteral( | 4463 return impl()->ParseFunctionLiteral( |
4440 name, scanner()->location(), | 4464 name, scanner()->location(), |
4441 is_strict_reserved ? kFunctionNameIsStrictReserved | 4465 is_strict_reserved ? kFunctionNameIsStrictReserved |
4442 : kFunctionNameValidityUnknown, | 4466 : kFunctionNameValidityUnknown, |
4443 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK); | 4467 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK); |
4444 } | 4468 } |
4445 | 4469 |
4446 template <typename Impl> | 4470 template <typename Impl> |
4471 template <bool tagged> | |
4447 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( | 4472 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( |
4448 ExpressionT tag, int start, bool* ok) { | 4473 ExpressionT tag, int start, bool* ok) { |
4449 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal | 4474 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal |
4450 // text followed by a substitution expression), finalized by a single | 4475 // text followed by a substitution expression), finalized by a single |
4451 // TEMPLATE_TAIL. | 4476 // TEMPLATE_TAIL. |
4452 // | 4477 // |
4453 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or | 4478 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or |
4454 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or | 4479 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or |
4455 // NoSubstitutionTemplate. | 4480 // NoSubstitutionTemplate. |
4456 // | 4481 // |
4457 // When parsing a TemplateLiteral, we must have scanned either an initial | 4482 // When parsing a TemplateLiteral, we must have scanned either an initial |
4458 // TEMPLATE_SPAN, or a TEMPLATE_TAIL. | 4483 // TEMPLATE_SPAN, or a TEMPLATE_TAIL. |
4459 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL); | 4484 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL); |
4460 | 4485 |
4486 bool allow_illegal_escapes = tagged && allow_harmony_template_escapes(); | |
4487 bool should_cook = true; | |
4488 | |
4461 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate. | 4489 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate. |
4462 // In this case we may simply consume the token and build a template with a | 4490 // In this case we may simply consume the token and build a template with a |
4463 // single TEMPLATE_SPAN and no expressions. | 4491 // single TEMPLATE_SPAN and no expressions. |
4464 if (peek() == Token::TEMPLATE_TAIL) { | 4492 if (peek() == Token::TEMPLATE_TAIL) { |
4465 Consume(Token::TEMPLATE_TAIL); | 4493 Consume(Token::TEMPLATE_TAIL); |
4466 int pos = position(); | 4494 int pos = position(); |
4467 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4468 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); | 4495 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); |
4469 impl()->AddTemplateSpan(&ts, true); | 4496 should_cook = CheckTemplateEscapes(pos, peek_position(), |
4497 allow_illegal_escapes, CHECK_OK); | |
4498 impl()->AddTemplateSpan(&ts, should_cook, true); | |
4470 return impl()->CloseTemplateLiteral(&ts, start, tag); | 4499 return impl()->CloseTemplateLiteral(&ts, start, tag); |
4471 } | 4500 } |
4472 | 4501 |
4473 Consume(Token::TEMPLATE_SPAN); | 4502 Consume(Token::TEMPLATE_SPAN); |
4474 int pos = position(); | 4503 int pos = position(); |
4504 should_cook = CheckTemplateEscapes(pos, peek_position(), | |
4505 allow_illegal_escapes, CHECK_OK); | |
4475 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); | 4506 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); |
4476 impl()->AddTemplateSpan(&ts, false); | 4507 impl()->AddTemplateSpan(&ts, should_cook, false); |
4477 Token::Value next; | 4508 Token::Value next; |
4478 | 4509 |
4479 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression, | 4510 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression, |
4480 // and repeat if the following token is a TEMPLATE_SPAN as well (in this | 4511 // and repeat if the following token is a TEMPLATE_SPAN as well (in this |
4481 // case, representing a TemplateMiddle). | 4512 // case, representing a TemplateMiddle). |
4482 | 4513 |
4483 do { | 4514 do { |
4484 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4485 next = peek(); | 4515 next = peek(); |
4486 if (next == Token::EOS) { | 4516 if (next == Token::EOS) { |
4487 impl()->ReportMessageAt(Scanner::Location(start, peek_position()), | 4517 impl()->ReportMessageAt(Scanner::Location(start, peek_position()), |
4488 MessageTemplate::kUnterminatedTemplate); | 4518 MessageTemplate::kUnterminatedTemplate); |
4489 *ok = false; | 4519 *ok = false; |
4490 return impl()->EmptyExpression(); | 4520 return impl()->EmptyExpression(); |
4491 } else if (next == Token::ILLEGAL) { | 4521 } else if (next == Token::ILLEGAL) { |
4492 impl()->ReportMessageAt( | 4522 impl()->ReportMessageAt( |
4493 Scanner::Location(position() + 1, peek_position()), | 4523 Scanner::Location(position() + 1, peek_position()), |
4494 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 4524 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); |
(...skipping 25 matching lines...) Expand all Loading... | |
4520 *ok = false; | 4550 *ok = false; |
4521 return impl()->EmptyExpression(); | 4551 return impl()->EmptyExpression(); |
4522 } else if (next == Token::ILLEGAL) { | 4552 } else if (next == Token::ILLEGAL) { |
4523 impl()->ReportMessageAt( | 4553 impl()->ReportMessageAt( |
4524 Scanner::Location(position() + 1, peek_position()), | 4554 Scanner::Location(position() + 1, peek_position()), |
4525 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); | 4555 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); |
4526 *ok = false; | 4556 *ok = false; |
4527 return impl()->EmptyExpression(); | 4557 return impl()->EmptyExpression(); |
4528 } | 4558 } |
4529 | 4559 |
4530 impl()->AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL); | 4560 should_cook = CheckTemplateEscapes(pos, peek_position(), |
4561 allow_illegal_escapes, CHECK_OK); | |
4562 impl()->AddTemplateSpan(&ts, should_cook, next == Token::TEMPLATE_TAIL); | |
4531 } while (next == Token::TEMPLATE_SPAN); | 4563 } while (next == Token::TEMPLATE_SPAN); |
4532 | 4564 |
4533 DCHECK_EQ(next, Token::TEMPLATE_TAIL); | 4565 DCHECK_EQ(next, Token::TEMPLATE_TAIL); |
4534 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); | |
4535 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. | 4566 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. |
4536 return impl()->CloseTemplateLiteral(&ts, start, tag); | 4567 return impl()->CloseTemplateLiteral(&ts, start, tag); |
4537 } | 4568 } |
4538 | 4569 |
4539 template <typename Impl> | 4570 template <typename Impl> |
4540 typename ParserBase<Impl>::ExpressionT | 4571 typename ParserBase<Impl>::ExpressionT |
4541 ParserBase<Impl>::CheckAndRewriteReferenceExpression( | 4572 ParserBase<Impl>::CheckAndRewriteReferenceExpression( |
4542 ExpressionT expression, int beg_pos, int end_pos, | 4573 ExpressionT expression, int beg_pos, int end_pos, |
4543 MessageTemplate::Template message, bool* ok) { | 4574 MessageTemplate::Template message, bool* ok) { |
4544 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, | 4575 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, |
(...skipping 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5751 return; | 5782 return; |
5752 } | 5783 } |
5753 } | 5784 } |
5754 | 5785 |
5755 #undef CHECK_OK_VOID | 5786 #undef CHECK_OK_VOID |
5756 | 5787 |
5757 } // namespace internal | 5788 } // namespace internal |
5758 } // namespace v8 | 5789 } // namespace v8 |
5759 | 5790 |
5760 #endif // V8_PARSING_PARSER_BASE_H | 5791 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |