Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: src/parsing/parser-base.h

Issue 2665513002: [parser] Lift template literal invalid escape restriction (Closed)
Patch Set: reintroduce DCHECK_EQ Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_async_iteration_(false) {} 229 allow_harmony_async_iteration_(false),
230 allow_harmony_template_escapes_(false) {}
230 231
231 #define ALLOW_ACCESSORS(name) \ 232 #define ALLOW_ACCESSORS(name) \
232 bool allow_##name() const { return allow_##name##_; } \ 233 bool allow_##name() const { return allow_##name##_; } \
233 void set_allow_##name(bool allow) { allow_##name##_ = allow; } 234 void set_allow_##name(bool allow) { allow_##name##_ = allow; }
234 235
235 ALLOW_ACCESSORS(natives); 236 ALLOW_ACCESSORS(natives);
236 ALLOW_ACCESSORS(tailcalls); 237 ALLOW_ACCESSORS(tailcalls);
237 ALLOW_ACCESSORS(harmony_do_expressions); 238 ALLOW_ACCESSORS(harmony_do_expressions);
238 ALLOW_ACCESSORS(harmony_function_sent); 239 ALLOW_ACCESSORS(harmony_function_sent);
239 ALLOW_ACCESSORS(harmony_restrictive_generators); 240 ALLOW_ACCESSORS(harmony_restrictive_generators);
240 ALLOW_ACCESSORS(harmony_trailing_commas); 241 ALLOW_ACCESSORS(harmony_trailing_commas);
241 ALLOW_ACCESSORS(harmony_class_fields); 242 ALLOW_ACCESSORS(harmony_class_fields);
242 ALLOW_ACCESSORS(harmony_object_rest_spread); 243 ALLOW_ACCESSORS(harmony_object_rest_spread);
243 ALLOW_ACCESSORS(harmony_dynamic_import); 244 ALLOW_ACCESSORS(harmony_dynamic_import);
244 ALLOW_ACCESSORS(harmony_async_iteration); 245 ALLOW_ACCESSORS(harmony_async_iteration);
246 ALLOW_ACCESSORS(harmony_template_escapes);
245 247
246 #undef ALLOW_ACCESSORS 248 #undef ALLOW_ACCESSORS
247 249
248 uintptr_t stack_limit() const { return stack_limit_; } 250 uintptr_t stack_limit() const { return stack_limit_; }
249 251
250 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } 252 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
251 253
252 void set_default_eager_compile_hint( 254 void set_default_eager_compile_hint(
253 FunctionLiteral::EagerCompileHint eager_compile_hint) { 255 FunctionLiteral::EagerCompileHint eager_compile_hint) {
254 default_eager_compile_hint_ = eager_compile_hint; 256 default_eager_compile_hint_ = eager_compile_hint;
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 return true; 811 return true;
810 } 812 }
811 return false; 813 return false;
812 } 814 }
813 815
814 bool PeekInOrOf() { 816 bool PeekInOrOf() {
815 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of")); 817 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of"));
816 } 818 }
817 819
818 // Checks whether an octal literal was last seen between beg_pos and end_pos. 820 // Checks whether an octal literal was last seen between beg_pos and end_pos.
819 // If so, reports an error. Only called for strict mode and template strings. 821 // Only called for strict mode strings.
820 void CheckOctalLiteral(int beg_pos, int end_pos, bool is_template, bool* ok) { 822 void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) {
821 Scanner::Location octal = scanner()->octal_position(); 823 Scanner::Location octal = scanner()->octal_position();
822 if (octal.IsValid() && beg_pos <= octal.beg_pos && 824 if (octal.IsValid() && beg_pos <= octal.beg_pos &&
823 octal.end_pos <= end_pos) { 825 octal.end_pos <= end_pos) {
824 MessageTemplate::Template message = 826 MessageTemplate::Template message = scanner()->octal_message();
825 is_template ? MessageTemplate::kTemplateOctalLiteral
826 : scanner()->octal_message();
827 DCHECK_NE(message, MessageTemplate::kNone); 827 DCHECK_NE(message, MessageTemplate::kNone);
828 impl()->ReportMessageAt(octal, message); 828 impl()->ReportMessageAt(octal, message);
829 scanner()->clear_octal_position(); 829 scanner()->clear_octal_position();
830 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) { 830 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) {
831 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode); 831 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode);
832 } 832 }
833 *ok = false; 833 *ok = false;
834 } 834 }
835 } 835 }
836 836
837 inline void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) { 837 // Checks if an octal literal or an invalid hex or unicode escape sequence
838 CheckOctalLiteral(beg_pos, end_pos, false, ok); 838 // appears in a template literal. In the presence of such, either
839 } 839 // returns false or reports an error, depending on should_throw. Otherwise
840 // returns true.
841 inline bool CheckTemplateEscapes(bool should_throw, bool* ok) {
842 if (!scanner()->has_invalid_template_escape()) {
843 return true;
844 }
840 845
841 inline void CheckTemplateOctalLiteral(int beg_pos, int end_pos, bool* ok) { 846 // Handle error case(s)
842 CheckOctalLiteral(beg_pos, end_pos, true, ok); 847 if (should_throw) {
848 impl()->ReportMessageAt(scanner()->invalid_template_escape_location(),
849 scanner()->invalid_template_escape_message());
850 *ok = false;
851 }
852 scanner()->clear_invalid_template_escape();
853 return false;
843 } 854 }
844 855
845 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos); 856 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos);
846 857
847 // Checking the name of a function literal. This has to be done after parsing 858 // Checking the name of a function literal. This has to be done after parsing
848 // the function, since the function can declare itself strict. 859 // the function, since the function can declare itself strict.
849 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name, 860 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name,
850 FunctionNameValidity function_name_validity, 861 FunctionNameValidity function_name_validity,
851 const Scanner::Location& function_name_loc, bool* ok) { 862 const Scanner::Location& function_name_loc, bool* ok) {
852 if (function_name_validity == kSkipFunctionNameCheck) return; 863 if (function_name_validity == kSkipFunctionNameCheck) return;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 const FormalParametersT& parameters, 1142 const FormalParametersT& parameters,
1132 bool* ok); 1143 bool* ok);
1133 void ParseAsyncFunctionBody(Scope* scope, StatementListT body, 1144 void ParseAsyncFunctionBody(Scope* scope, StatementListT body,
1134 FunctionKind kind, FunctionBodyType type, 1145 FunctionKind kind, FunctionBodyType type,
1135 bool accept_IN, int pos, bool* ok); 1146 bool accept_IN, int pos, bool* ok);
1136 ExpressionT ParseAsyncFunctionLiteral(bool* ok); 1147 ExpressionT ParseAsyncFunctionLiteral(bool* ok);
1137 ExpressionT ParseClassLiteral(IdentifierT name, 1148 ExpressionT ParseClassLiteral(IdentifierT name,
1138 Scanner::Location class_name_location, 1149 Scanner::Location class_name_location,
1139 bool name_is_strict_reserved, 1150 bool name_is_strict_reserved,
1140 int class_token_pos, bool* ok); 1151 int class_token_pos, bool* ok);
1141 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); 1152 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool tagged,
1153 bool* ok);
1142 ExpressionT ParseSuperExpression(bool is_new, bool* ok); 1154 ExpressionT ParseSuperExpression(bool is_new, bool* ok);
1143 ExpressionT ParseDynamicImportExpression(bool* ok); 1155 ExpressionT ParseDynamicImportExpression(bool* ok);
1144 ExpressionT ParseNewTargetExpression(bool* ok); 1156 ExpressionT ParseNewTargetExpression(bool* ok);
1145 1157
1146 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); 1158 void ParseFormalParameter(FormalParametersT* parameters, bool* ok);
1147 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); 1159 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok);
1148 void CheckArityRestrictions(int param_count, FunctionKind function_type, 1160 void CheckArityRestrictions(int param_count, FunctionKind function_type,
1149 bool has_rest, int formals_start_pos, 1161 bool has_rest, int formals_start_pos,
1150 int formals_end_pos, bool* ok); 1162 int formals_end_pos, bool* ok);
1151 1163
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 bool allow_natives_; 1454 bool allow_natives_;
1443 bool allow_tailcalls_; 1455 bool allow_tailcalls_;
1444 bool allow_harmony_do_expressions_; 1456 bool allow_harmony_do_expressions_;
1445 bool allow_harmony_function_sent_; 1457 bool allow_harmony_function_sent_;
1446 bool allow_harmony_restrictive_generators_; 1458 bool allow_harmony_restrictive_generators_;
1447 bool allow_harmony_trailing_commas_; 1459 bool allow_harmony_trailing_commas_;
1448 bool allow_harmony_class_fields_; 1460 bool allow_harmony_class_fields_;
1449 bool allow_harmony_object_rest_spread_; 1461 bool allow_harmony_object_rest_spread_;
1450 bool allow_harmony_dynamic_import_; 1462 bool allow_harmony_dynamic_import_;
1451 bool allow_harmony_async_iteration_; 1463 bool allow_harmony_async_iteration_;
1464 bool allow_harmony_template_escapes_;
1452 1465
1453 friend class DiscardableZoneScope; 1466 friend class DiscardableZoneScope;
1454 }; 1467 };
1455 1468
1456 template <typename Impl> 1469 template <typename Impl>
1457 ParserBase<Impl>::FunctionState::FunctionState( 1470 ParserBase<Impl>::FunctionState::FunctionState(
1458 FunctionState** function_state_stack, Scope** scope_stack, 1471 FunctionState** function_state_stack, Scope** scope_stack,
1459 DeclarationScope* scope) 1472 DeclarationScope* scope)
1460 : BlockState(scope_stack, scope), 1473 : BlockState(scope_stack, scope),
1461 next_materialized_literal_index_(0), 1474 next_materialized_literal_index_(0),
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1810 CHECK_OK); 1823 CHECK_OK);
1811 class_name_location = scanner()->location(); 1824 class_name_location = scanner()->location();
1812 } 1825 }
1813 return ParseClassLiteral(name, class_name_location, 1826 return ParseClassLiteral(name, class_name_location,
1814 is_strict_reserved_name, class_token_pos, ok); 1827 is_strict_reserved_name, class_token_pos, ok);
1815 } 1828 }
1816 1829
1817 case Token::TEMPLATE_SPAN: 1830 case Token::TEMPLATE_SPAN:
1818 case Token::TEMPLATE_TAIL: 1831 case Token::TEMPLATE_TAIL:
1819 BindingPatternUnexpectedToken(); 1832 BindingPatternUnexpectedToken();
1820 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, ok); 1833 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, false, ok);
1821 1834
1822 case Token::MOD: 1835 case Token::MOD:
1823 if (allow_natives() || extension_ != NULL) { 1836 if (allow_natives() || extension_ != NULL) {
1824 BindingPatternUnexpectedToken(); 1837 BindingPatternUnexpectedToken();
1825 return ParseV8Intrinsic(ok); 1838 return ParseV8Intrinsic(ok);
1826 } 1839 }
1827 break; 1840 break;
1828 1841
1829 case Token::DO: 1842 case Token::DO:
1830 if (allow_harmony_do_expressions()) { 1843 if (allow_harmony_do_expressions()) {
(...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after
3208 result, factory()->NewStringLiteral(name, pos), pos); 3221 result, factory()->NewStringLiteral(name, pos), pos);
3209 impl()->PushLiteralName(name); 3222 impl()->PushLiteralName(name);
3210 break; 3223 break;
3211 } 3224 }
3212 3225
3213 case Token::TEMPLATE_SPAN: 3226 case Token::TEMPLATE_SPAN:
3214 case Token::TEMPLATE_TAIL: { 3227 case Token::TEMPLATE_TAIL: {
3215 impl()->RewriteNonPattern(CHECK_OK); 3228 impl()->RewriteNonPattern(CHECK_OK);
3216 BindingPatternUnexpectedToken(); 3229 BindingPatternUnexpectedToken();
3217 ArrowFormalParametersUnexpectedToken(); 3230 ArrowFormalParametersUnexpectedToken();
3218 result = ParseTemplateLiteral(result, position(), CHECK_OK); 3231 result = ParseTemplateLiteral(result, position(), true, CHECK_OK);
3219 break; 3232 break;
3220 } 3233 }
3221 3234
3222 default: 3235 default:
3223 return result; 3236 return result;
3224 } 3237 }
3225 } 3238 }
3226 } 3239 }
3227 3240
3228 template <typename Impl> 3241 template <typename Impl>
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
3488 if (scanner()->current_token() == Token::IDENTIFIER) { 3501 if (scanner()->current_token() == Token::IDENTIFIER) {
3489 pos = position(); 3502 pos = position();
3490 } else { 3503 } else {
3491 pos = peek_position(); 3504 pos = peek_position();
3492 if (expression->IsFunctionLiteral()) { 3505 if (expression->IsFunctionLiteral()) {
3493 // If the tag function looks like an IIFE, set_parenthesized() to 3506 // If the tag function looks like an IIFE, set_parenthesized() to
3494 // force eager compilation. 3507 // force eager compilation.
3495 expression->AsFunctionLiteral()->SetShouldEagerCompile(); 3508 expression->AsFunctionLiteral()->SetShouldEagerCompile();
3496 } 3509 }
3497 } 3510 }
3498 expression = ParseTemplateLiteral(expression, pos, CHECK_OK); 3511 expression = ParseTemplateLiteral(expression, pos, true, CHECK_OK);
3499 break; 3512 break;
3500 } 3513 }
3501 case Token::ILLEGAL: { 3514 case Token::ILLEGAL: {
3502 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL); 3515 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL);
3503 *ok = false; 3516 *ok = false;
3504 return impl()->EmptyExpression(); 3517 return impl()->EmptyExpression();
3505 } 3518 }
3506 default: 3519 default:
3507 return expression; 3520 return expression;
3508 } 3521 }
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
4369 } 4382 }
4370 return impl()->ParseFunctionLiteral( 4383 return impl()->ParseFunctionLiteral(
4371 name, scanner()->location(), 4384 name, scanner()->location(),
4372 is_strict_reserved ? kFunctionNameIsStrictReserved 4385 is_strict_reserved ? kFunctionNameIsStrictReserved
4373 : kFunctionNameValidityUnknown, 4386 : kFunctionNameValidityUnknown,
4374 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK); 4387 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK);
4375 } 4388 }
4376 4389
4377 template <typename Impl> 4390 template <typename Impl>
4378 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( 4391 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral(
4379 ExpressionT tag, int start, bool* ok) { 4392 ExpressionT tag, int start, bool tagged, bool* ok) {
4380 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal 4393 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal
4381 // text followed by a substitution expression), finalized by a single 4394 // text followed by a substitution expression), finalized by a single
4382 // TEMPLATE_TAIL. 4395 // TEMPLATE_TAIL.
4383 // 4396 //
4384 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or 4397 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or
4385 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or 4398 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or
4386 // NoSubstitutionTemplate. 4399 // NoSubstitutionTemplate.
4387 // 4400 //
4388 // When parsing a TemplateLiteral, we must have scanned either an initial 4401 // When parsing a TemplateLiteral, we must have scanned either an initial
4389 // TEMPLATE_SPAN, or a TEMPLATE_TAIL. 4402 // TEMPLATE_SPAN, or a TEMPLATE_TAIL.
4390 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL); 4403 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL);
4391 4404
4405 bool forbid_illegal_escapes = !allow_harmony_template_escapes() || !tagged;
4406
4392 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate. 4407 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate.
4393 // In this case we may simply consume the token and build a template with a 4408 // In this case we may simply consume the token and build a template with a
4394 // single TEMPLATE_SPAN and no expressions. 4409 // single TEMPLATE_SPAN and no expressions.
4395 if (peek() == Token::TEMPLATE_TAIL) { 4410 if (peek() == Token::TEMPLATE_TAIL) {
4396 Consume(Token::TEMPLATE_TAIL); 4411 Consume(Token::TEMPLATE_TAIL);
4397 int pos = position(); 4412 int pos = position();
4398 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
4399 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); 4413 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos);
4400 impl()->AddTemplateSpan(&ts, true); 4414 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4415 impl()->AddTemplateSpan(&ts, is_valid, true);
4401 return impl()->CloseTemplateLiteral(&ts, start, tag); 4416 return impl()->CloseTemplateLiteral(&ts, start, tag);
4402 } 4417 }
4403 4418
4404 Consume(Token::TEMPLATE_SPAN); 4419 Consume(Token::TEMPLATE_SPAN);
4405 int pos = position(); 4420 int pos = position();
4406 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos); 4421 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos);
4407 impl()->AddTemplateSpan(&ts, false); 4422 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4423 impl()->AddTemplateSpan(&ts, is_valid, false);
4408 Token::Value next; 4424 Token::Value next;
4409 4425
4410 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression, 4426 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression,
4411 // and repeat if the following token is a TEMPLATE_SPAN as well (in this 4427 // and repeat if the following token is a TEMPLATE_SPAN as well (in this
4412 // case, representing a TemplateMiddle). 4428 // case, representing a TemplateMiddle).
4413 4429
4414 do { 4430 do {
4415 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
4416 next = peek(); 4431 next = peek();
4417 if (next == Token::EOS) { 4432 if (next == Token::EOS) {
4418 impl()->ReportMessageAt(Scanner::Location(start, peek_position()), 4433 impl()->ReportMessageAt(Scanner::Location(start, peek_position()),
4419 MessageTemplate::kUnterminatedTemplate); 4434 MessageTemplate::kUnterminatedTemplate);
4420 *ok = false; 4435 *ok = false;
4421 return impl()->EmptyExpression(); 4436 return impl()->EmptyExpression();
4422 } else if (next == Token::ILLEGAL) { 4437 } else if (next == Token::ILLEGAL) {
4423 impl()->ReportMessageAt( 4438 impl()->ReportMessageAt(
4424 Scanner::Location(position() + 1, peek_position()), 4439 Scanner::Location(position() + 1, peek_position()),
4425 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); 4440 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError);
(...skipping 25 matching lines...) Expand all
4451 *ok = false; 4466 *ok = false;
4452 return impl()->EmptyExpression(); 4467 return impl()->EmptyExpression();
4453 } else if (next == Token::ILLEGAL) { 4468 } else if (next == Token::ILLEGAL) {
4454 impl()->ReportMessageAt( 4469 impl()->ReportMessageAt(
4455 Scanner::Location(position() + 1, peek_position()), 4470 Scanner::Location(position() + 1, peek_position()),
4456 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError); 4471 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError);
4457 *ok = false; 4472 *ok = false;
4458 return impl()->EmptyExpression(); 4473 return impl()->EmptyExpression();
4459 } 4474 }
4460 4475
4461 impl()->AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL); 4476 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4477 impl()->AddTemplateSpan(&ts, is_valid, next == Token::TEMPLATE_TAIL);
4462 } while (next == Token::TEMPLATE_SPAN); 4478 } while (next == Token::TEMPLATE_SPAN);
4463 4479
4464 DCHECK_EQ(next, Token::TEMPLATE_TAIL); 4480 DCHECK_EQ(next, Token::TEMPLATE_TAIL);
4465 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
4466 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. 4481 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral.
4467 return impl()->CloseTemplateLiteral(&ts, start, tag); 4482 return impl()->CloseTemplateLiteral(&ts, start, tag);
4468 } 4483 }
4469 4484
4470 template <typename Impl> 4485 template <typename Impl>
4471 typename ParserBase<Impl>::ExpressionT 4486 typename ParserBase<Impl>::ExpressionT
4472 ParserBase<Impl>::CheckAndRewriteReferenceExpression( 4487 ParserBase<Impl>::CheckAndRewriteReferenceExpression(
4473 ExpressionT expression, int beg_pos, int end_pos, 4488 ExpressionT expression, int beg_pos, int end_pos,
4474 MessageTemplate::Template message, bool* ok) { 4489 MessageTemplate::Template message, bool* ok) {
4475 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, 4490 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos,
(...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after
5836 } 5851 }
5837 5852
5838 #undef CHECK_OK 5853 #undef CHECK_OK
5839 #undef CHECK_OK_CUSTOM 5854 #undef CHECK_OK_CUSTOM
5840 #undef CHECK_OK_VOID 5855 #undef CHECK_OK_VOID
5841 5856
5842 } // namespace internal 5857 } // namespace internal
5843 } // namespace v8 5858 } // namespace v8
5844 5859
5845 #endif // V8_PARSING_PARSER_BASE_H 5860 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698