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

Side by Side Diff: src/preparser.h

Issue 939303002: Replace is_reference_error bool argument with ParseErrorType enum (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Marja comments addressed Created 5 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/preparse-data-format.h ('k') | src/preparser.cc » ('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_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 520
521 typename Traits::Type::Factory* factory() { 521 typename Traits::Type::Factory* factory() {
522 return function_state_->factory(); 522 return function_state_->factory();
523 } 523 }
524 524
525 LanguageMode language_mode() { return scope_->language_mode(); } 525 LanguageMode language_mode() { return scope_->language_mode(); }
526 bool is_generator() const { return function_state_->is_generator(); } 526 bool is_generator() const { return function_state_->is_generator(); }
527 527
528 // Report syntax errors. 528 // Report syntax errors.
529 void ReportMessage(const char* message, const char* arg = NULL, 529 void ReportMessage(const char* message, const char* arg = NULL,
530 bool is_reference_error = false) { 530 ParseErrorType error_type = kSyntaxError) {
531 Scanner::Location source_location = scanner()->location(); 531 Scanner::Location source_location = scanner()->location();
532 Traits::ReportMessageAt(source_location, message, arg, is_reference_error); 532 Traits::ReportMessageAt(source_location, message, arg, error_type);
533 } 533 }
534 534
535 void ReportMessageAt(Scanner::Location location, const char* message, 535 void ReportMessageAt(Scanner::Location location, const char* message,
536 bool is_reference_error = false) { 536 ParseErrorType error_type = kSyntaxError) {
537 Traits::ReportMessageAt(location, message, 537 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0),
538 reinterpret_cast<const char*>(0), 538 error_type);
539 is_reference_error);
540 } 539 }
541 540
542 void ReportUnexpectedToken(Token::Value token); 541 void ReportUnexpectedToken(Token::Value token);
543 542
544 // Recursive descent functions: 543 // Recursive descent functions:
545 544
546 // Parses an identifier that is valid for the current scope, in particular it 545 // Parses an identifier that is valid for the current scope, in particular it
547 // fails on strict mode future reserved keywords in a strict scope. If 546 // fails on strict mode future reserved keywords in a strict scope. If
548 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or 547 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or
549 // "arguments" as identifier even in strict mode (this is needed in cases like 548 // "arguments" as identifier even in strict mode (this is needed in cases like
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 PreParserExpression NewThrowSyntaxError( 1337 PreParserExpression NewThrowSyntaxError(
1339 const char* type, Handle<Object> arg, int pos) { 1338 const char* type, Handle<Object> arg, int pos) {
1340 return PreParserExpression::Default(); 1339 return PreParserExpression::Default();
1341 } 1340 }
1342 PreParserExpression NewThrowTypeError( 1341 PreParserExpression NewThrowTypeError(
1343 const char* type, Handle<Object> arg, int pos) { 1342 const char* type, Handle<Object> arg, int pos) {
1344 return PreParserExpression::Default(); 1343 return PreParserExpression::Default();
1345 } 1344 }
1346 1345
1347 // Reporting errors. 1346 // Reporting errors.
1348 void ReportMessageAt(Scanner::Location location, 1347 void ReportMessageAt(Scanner::Location location, const char* message,
1349 const char* message,
1350 const char* arg = NULL, 1348 const char* arg = NULL,
1351 bool is_reference_error = false); 1349 ParseErrorType error_type = kSyntaxError);
1352 void ReportMessageAt(int start_pos, 1350 void ReportMessageAt(int start_pos, int end_pos, const char* message,
1353 int end_pos,
1354 const char* message,
1355 const char* arg = NULL, 1351 const char* arg = NULL,
1356 bool is_reference_error = false); 1352 ParseErrorType error_type = kSyntaxError);
1357 1353
1358 // "null" return type creators. 1354 // "null" return type creators.
1359 static PreParserIdentifier EmptyIdentifier() { 1355 static PreParserIdentifier EmptyIdentifier() {
1360 return PreParserIdentifier::Default(); 1356 return PreParserIdentifier::Default();
1361 } 1357 }
1362 static PreParserIdentifier EmptyIdentifierString() { 1358 static PreParserIdentifier EmptyIdentifierString() {
1363 return PreParserIdentifier::Default(); 1359 return PreParserIdentifier::Default();
1364 } 1360 }
1365 static PreParserExpression EmptyExpression() { 1361 static PreParserExpression EmptyExpression() {
1366 return PreParserExpression::Default(); 1362 return PreParserExpression::Default();
(...skipping 1614 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); 2977 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
2982 next = peek(); 2978 next = peek();
2983 if (next == Token::EOS) { 2979 if (next == Token::EOS) {
2984 ReportMessageAt(Scanner::Location(start, peek_position()), 2980 ReportMessageAt(Scanner::Location(start, peek_position()),
2985 "unterminated_template"); 2981 "unterminated_template");
2986 *ok = false; 2982 *ok = false;
2987 return Traits::EmptyExpression(); 2983 return Traits::EmptyExpression();
2988 } else if (next == Token::ILLEGAL) { 2984 } else if (next == Token::ILLEGAL) {
2989 Traits::ReportMessageAt( 2985 Traits::ReportMessageAt(
2990 Scanner::Location(position() + 1, peek_position()), 2986 Scanner::Location(position() + 1, peek_position()),
2991 "unexpected_token", "ILLEGAL", false); 2987 "unexpected_token", "ILLEGAL", kSyntaxError);
2992 *ok = false; 2988 *ok = false;
2993 return Traits::EmptyExpression(); 2989 return Traits::EmptyExpression();
2994 } 2990 }
2995 2991
2996 int expr_pos = peek_position(); 2992 int expr_pos = peek_position();
2997 ExpressionT expression = this->ParseExpression(true, CHECK_OK); 2993 ExpressionT expression = this->ParseExpression(true, CHECK_OK);
2998 Traits::AddTemplateExpression(&ts, expression); 2994 Traits::AddTemplateExpression(&ts, expression);
2999 2995
3000 if (peek() != Token::RBRACE) { 2996 if (peek() != Token::RBRACE) {
3001 ReportMessageAt(Scanner::Location(expr_pos, peek_position()), 2997 ReportMessageAt(Scanner::Location(expr_pos, peek_position()),
3002 "unterminated_template_expr"); 2998 "unterminated_template_expr");
3003 *ok = false; 2999 *ok = false;
3004 return Traits::EmptyExpression(); 3000 return Traits::EmptyExpression();
3005 } 3001 }
3006 3002
3007 // If we didn't die parsing that expression, our next token should be a 3003 // If we didn't die parsing that expression, our next token should be a
3008 // TEMPLATE_SPAN or TEMPLATE_TAIL. 3004 // TEMPLATE_SPAN or TEMPLATE_TAIL.
3009 next = scanner()->ScanTemplateContinuation(); 3005 next = scanner()->ScanTemplateContinuation();
3010 Next(); 3006 Next();
3011 pos = position(); 3007 pos = position();
3012 3008
3013 if (next == Token::EOS) { 3009 if (next == Token::EOS) {
3014 ReportMessageAt(Scanner::Location(start, pos), "unterminated_template"); 3010 ReportMessageAt(Scanner::Location(start, pos), "unterminated_template");
3015 *ok = false; 3011 *ok = false;
3016 return Traits::EmptyExpression(); 3012 return Traits::EmptyExpression();
3017 } else if (next == Token::ILLEGAL) { 3013 } else if (next == Token::ILLEGAL) {
3018 Traits::ReportMessageAt( 3014 Traits::ReportMessageAt(
3019 Scanner::Location(position() + 1, peek_position()), 3015 Scanner::Location(position() + 1, peek_position()),
3020 "unexpected_token", "ILLEGAL", false); 3016 "unexpected_token", "ILLEGAL", kSyntaxError);
3021 *ok = false; 3017 *ok = false;
3022 return Traits::EmptyExpression(); 3018 return Traits::EmptyExpression();
3023 } 3019 }
3024 3020
3025 Traits::AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL); 3021 Traits::AddTemplateSpan(&ts, next == Token::TEMPLATE_TAIL);
3026 } while (next == Token::TEMPLATE_SPAN); 3022 } while (next == Token::TEMPLATE_SPAN);
3027 3023
3028 DCHECK_EQ(next, Token::TEMPLATE_TAIL); 3024 DCHECK_EQ(next, Token::TEMPLATE_TAIL);
3029 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK); 3025 CheckTemplateOctalLiteral(pos, peek_position(), CHECK_OK);
3030 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral. 3026 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral.
3031 return Traits::CloseTemplateLiteral(&ts, start, tag); 3027 return Traits::CloseTemplateLiteral(&ts, start, tag);
3032 } 3028 }
3033 3029
3034 3030
3035 template <typename Traits> 3031 template <typename Traits>
3036 typename ParserBase<Traits>::ExpressionT ParserBase< 3032 typename ParserBase<Traits>::ExpressionT ParserBase<
3037 Traits>::CheckAndRewriteReferenceExpression(ExpressionT expression, 3033 Traits>::CheckAndRewriteReferenceExpression(ExpressionT expression,
3038 Scanner::Location location, 3034 Scanner::Location location,
3039 const char* message, bool* ok) { 3035 const char* message, bool* ok) {
3040 if (is_strict(language_mode()) && this->IsIdentifier(expression) && 3036 if (is_strict(language_mode()) && this->IsIdentifier(expression) &&
3041 this->IsEvalOrArguments(this->AsIdentifier(expression))) { 3037 this->IsEvalOrArguments(this->AsIdentifier(expression))) {
3042 this->ReportMessageAt(location, "strict_eval_arguments", false); 3038 this->ReportMessageAt(location, "strict_eval_arguments", kSyntaxError);
3043 *ok = false; 3039 *ok = false;
3044 return this->EmptyExpression(); 3040 return this->EmptyExpression();
3045 } else if (expression->IsValidReferenceExpression()) { 3041 } else if (expression->IsValidReferenceExpression()) {
3046 return expression; 3042 return expression;
3047 } else if (expression->IsCall()) { 3043 } else if (expression->IsCall()) {
3048 // If it is a call, make it a runtime error for legacy web compatibility. 3044 // If it is a call, make it a runtime error for legacy web compatibility.
3049 // Rewrite `expr' to `expr[throw ReferenceError]'. 3045 // Rewrite `expr' to `expr[throw ReferenceError]'.
3050 int pos = location.beg_pos; 3046 int pos = location.beg_pos;
3051 ExpressionT error = this->NewThrowReferenceError(message, pos); 3047 ExpressionT error = this->NewThrowReferenceError(message, pos);
3052 return factory()->NewProperty(expression, error, pos); 3048 return factory()->NewProperty(expression, error, pos);
3053 } else { 3049 } else {
3054 this->ReportMessageAt(location, message, true); 3050 this->ReportMessageAt(location, message, kReferenceError);
3055 *ok = false; 3051 *ok = false;
3056 return this->EmptyExpression(); 3052 return this->EmptyExpression();
3057 } 3053 }
3058 } 3054 }
3059 3055
3060 3056
3061 #undef CHECK_OK 3057 #undef CHECK_OK
3062 #undef CHECK_OK_CUSTOM 3058 #undef CHECK_OK_CUSTOM
3063 3059
3064 3060
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3108 *ok = false; 3104 *ok = false;
3109 return; 3105 return;
3110 } 3106 }
3111 has_seen_constructor_ = true; 3107 has_seen_constructor_ = true;
3112 return; 3108 return;
3113 } 3109 }
3114 } 3110 }
3115 } } // v8::internal 3111 } } // v8::internal
3116 3112
3117 #endif // V8_PREPARSER_H 3113 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/preparse-data-format.h ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698