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

Side by Side Diff: src/preparser.cc

Issue 8417035: Introduce extended mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed more comments. Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/preparser.h ('k') | src/runtime.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 PreParser::SourceElements PreParser::ParseSourceElements(int end_token, 142 PreParser::SourceElements PreParser::ParseSourceElements(int end_token,
143 bool* ok) { 143 bool* ok) {
144 // SourceElements :: 144 // SourceElements ::
145 // (Statement)* <end_token> 145 // (Statement)* <end_token>
146 146
147 bool allow_directive_prologue = true; 147 bool allow_directive_prologue = true;
148 while (peek() != end_token) { 148 while (peek() != end_token) {
149 Statement statement = ParseSourceElement(CHECK_OK); 149 Statement statement = ParseSourceElement(CHECK_OK);
150 if (allow_directive_prologue) { 150 if (allow_directive_prologue) {
151 if (statement.IsUseStrictLiteral()) { 151 if (statement.IsUseStrictLiteral()) {
152 set_strict_mode(); 152 set_language_mode(harmony_scoping_ ?
153 i::EXTENDED_MODE : i::STRICT_MODE);
153 } else if (!statement.IsStringLiteral()) { 154 } else if (!statement.IsStringLiteral()) {
154 allow_directive_prologue = false; 155 allow_directive_prologue = false;
155 } 156 }
156 } 157 }
157 } 158 }
158 return kUnknownSourceElements; 159 return kUnknownSourceElements;
159 } 160 }
160 161
161 162
162 #undef CHECK_OK 163 #undef CHECK_OK
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 case i::Token::THROW: 236 case i::Token::THROW:
236 return ParseThrowStatement(ok); 237 return ParseThrowStatement(ok);
237 238
238 case i::Token::TRY: 239 case i::Token::TRY:
239 return ParseTryStatement(ok); 240 return ParseTryStatement(ok);
240 241
241 case i::Token::FUNCTION: { 242 case i::Token::FUNCTION: {
242 i::Scanner::Location start_location = scanner_->peek_location(); 243 i::Scanner::Location start_location = scanner_->peek_location();
243 Statement statement = ParseFunctionDeclaration(CHECK_OK); 244 Statement statement = ParseFunctionDeclaration(CHECK_OK);
244 i::Scanner::Location end_location = scanner_->location(); 245 i::Scanner::Location end_location = scanner_->location();
245 if (strict_mode() || harmony_scoping_) { 246 if (!is_classic_mode()) {
246 ReportMessageAt(start_location.beg_pos, end_location.end_pos, 247 ReportMessageAt(start_location.beg_pos, end_location.end_pos,
247 "strict_function", NULL); 248 "strict_function", NULL);
248 *ok = false; 249 *ok = false;
249 return Statement::Default(); 250 return Statement::Default();
250 } else { 251 } else {
251 return statement; 252 return statement;
252 } 253 }
253 } 254 }
254 255
255 case i::Token::DEBUGGER: 256 case i::Token::DEBUGGER:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 289
289 PreParser::Statement PreParser::ParseBlock(bool* ok) { 290 PreParser::Statement PreParser::ParseBlock(bool* ok) {
290 // Block :: 291 // Block ::
291 // '{' Statement* '}' 292 // '{' Statement* '}'
292 293
293 // Note that a Block does not introduce a new execution scope! 294 // Note that a Block does not introduce a new execution scope!
294 // (ECMA-262, 3rd, 12.2) 295 // (ECMA-262, 3rd, 12.2)
295 // 296 //
296 Expect(i::Token::LBRACE, CHECK_OK); 297 Expect(i::Token::LBRACE, CHECK_OK);
297 while (peek() != i::Token::RBRACE) { 298 while (peek() != i::Token::RBRACE) {
298 if (harmony_scoping_) { 299 if (is_extended_mode()) {
299 ParseSourceElement(CHECK_OK); 300 ParseSourceElement(CHECK_OK);
300 } else { 301 } else {
301 ParseStatement(CHECK_OK); 302 ParseStatement(CHECK_OK);
302 } 303 }
303 } 304 }
304 Expect(i::Token::RBRACE, ok); 305 Expect(i::Token::RBRACE, ok);
305 return Statement::Default(); 306 return Statement::Default();
306 } 307 }
307 308
308 309
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 // ConstBinding :: 342 // ConstBinding ::
342 // Identifier '=' AssignmentExpression 343 // Identifier '=' AssignmentExpression
343 // 344 //
344 // TODO(ES6): 345 // TODO(ES6):
345 // ConstBinding :: 346 // ConstBinding ::
346 // BindingPattern '=' AssignmentExpression 347 // BindingPattern '=' AssignmentExpression
347 bool require_initializer = false; 348 bool require_initializer = false;
348 if (peek() == i::Token::VAR) { 349 if (peek() == i::Token::VAR) {
349 Consume(i::Token::VAR); 350 Consume(i::Token::VAR);
350 } else if (peek() == i::Token::CONST) { 351 } else if (peek() == i::Token::CONST) {
351 if (harmony_scoping_) { 352 switch (language_mode()) {
352 if (var_context != kSourceElement && 353 case i::CLASSIC_MODE:
353 var_context != kForStatement) { 354 break;
355 case i::STRICT_MODE: {
354 i::Scanner::Location location = scanner_->peek_location(); 356 i::Scanner::Location location = scanner_->peek_location();
355 ReportMessageAt(location.beg_pos, location.end_pos, 357 ReportMessageAt(location, "strict_const", NULL);
356 "unprotected_const", NULL);
357 *ok = false; 358 *ok = false;
358 return Statement::Default(); 359 return Statement::Default();
359 } 360 }
360 require_initializer = true; 361 case i::EXTENDED_MODE:
361 } else if (strict_mode()) { 362 if (var_context != kSourceElement &&
362 i::Scanner::Location location = scanner_->peek_location(); 363 var_context != kForStatement) {
363 ReportMessageAt(location, "strict_const", NULL); 364 i::Scanner::Location location = scanner_->peek_location();
364 *ok = false; 365 ReportMessageAt(location.beg_pos, location.end_pos,
365 return Statement::Default(); 366 "unprotected_const", NULL);
367 *ok = false;
368 return Statement::Default();
369 }
370 require_initializer = true;
371 break;
366 } 372 }
367 Consume(i::Token::CONST); 373 Consume(i::Token::CONST);
368 } else if (peek() == i::Token::LET) { 374 } else if (peek() == i::Token::LET) {
375 ASSERT(is_extended_mode());
369 if (var_context != kSourceElement && 376 if (var_context != kSourceElement &&
370 var_context != kForStatement) { 377 var_context != kForStatement) {
371 i::Scanner::Location location = scanner_->peek_location(); 378 i::Scanner::Location location = scanner_->peek_location();
372 ReportMessageAt(location.beg_pos, location.end_pos, 379 ReportMessageAt(location.beg_pos, location.end_pos,
373 "unprotected_let", NULL); 380 "unprotected_let", NULL);
374 *ok = false; 381 *ok = false;
375 return Statement::Default(); 382 return Statement::Default();
376 } 383 }
377 Consume(i::Token::LET); 384 Consume(i::Token::LET);
378 } else { 385 } else {
379 *ok = false; 386 *ok = false;
380 return Statement::Default(); 387 return Statement::Default();
381 } 388 }
382 389
383 // The scope of a var/const declared variable anywhere inside a function 390 // The scope of a var/const declared variable anywhere inside a function
384 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope 391 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope
385 // of a let declared variable is the scope of the immediately enclosing 392 // of a let declared variable is the scope of the immediately enclosing
386 // block. 393 // block.
387 int nvars = 0; // the number of variables declared 394 int nvars = 0; // the number of variables declared
388 do { 395 do {
389 // Parse variable name. 396 // Parse variable name.
390 if (nvars > 0) Consume(i::Token::COMMA); 397 if (nvars > 0) Consume(i::Token::COMMA);
391 Identifier identifier = ParseIdentifier(CHECK_OK); 398 Identifier identifier = ParseIdentifier(CHECK_OK);
392 if (strict_mode() && !identifier.IsValidStrictVariable()) { 399 if (!is_classic_mode() && !identifier.IsValidStrictVariable()) {
393 StrictModeIdentifierViolation(scanner_->location(), 400 StrictModeIdentifierViolation(scanner_->location(),
394 "strict_var_name", 401 "strict_var_name",
395 identifier, 402 identifier,
396 ok); 403 ok);
397 return Statement::Default(); 404 return Statement::Default();
398 } 405 }
399 nvars++; 406 nvars++;
400 if (peek() == i::Token::ASSIGN || require_initializer) { 407 if (peek() == i::Token::ASSIGN || require_initializer) {
401 Expect(i::Token::ASSIGN, CHECK_OK); 408 Expect(i::Token::ASSIGN, CHECK_OK);
402 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); 409 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
403 if (decl_props != NULL) *decl_props = kHasInitializers; 410 if (decl_props != NULL) *decl_props = kHasInitializers;
404 } 411 }
405 } while (peek() == i::Token::COMMA); 412 } while (peek() == i::Token::COMMA);
406 413
407 if (num_decl != NULL) *num_decl = nvars; 414 if (num_decl != NULL) *num_decl = nvars;
408 return Statement::Default(); 415 return Statement::Default();
409 } 416 }
410 417
411 418
412 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { 419 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) {
413 // ExpressionStatement | LabelledStatement :: 420 // ExpressionStatement | LabelledStatement ::
414 // Expression ';' 421 // Expression ';'
415 // Identifier ':' Statement 422 // Identifier ':' Statement
416 423
417 Expression expr = ParseExpression(true, CHECK_OK); 424 Expression expr = ParseExpression(true, CHECK_OK);
418 if (expr.IsRawIdentifier()) { 425 if (expr.IsRawIdentifier()) {
419 ASSERT(!expr.AsIdentifier().IsFutureReserved()); 426 ASSERT(!expr.AsIdentifier().IsFutureReserved());
420 ASSERT(!strict_mode() || !expr.AsIdentifier().IsFutureStrictReserved()); 427 ASSERT(is_classic_mode() || !expr.AsIdentifier().IsFutureStrictReserved());
421 if (peek() == i::Token::COLON) { 428 if (peek() == i::Token::COLON) {
422 Consume(i::Token::COLON); 429 Consume(i::Token::COLON);
423 return ParseStatement(ok); 430 return ParseStatement(ok);
424 } 431 }
425 // Preparsing is disabled for extensions (because the extension details 432 // Preparsing is disabled for extensions (because the extension details
426 // aren't passed to lazily compiled functions), so we don't 433 // aren't passed to lazily compiled functions), so we don't
427 // accept "native function" in the preparser. 434 // accept "native function" in the preparser.
428 } 435 }
429 // Parsed expression statement. 436 // Parsed expression statement.
430 ExpectSemicolon(CHECK_OK); 437 ExpectSemicolon(CHECK_OK);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 } 513 }
507 ExpectSemicolon(CHECK_OK); 514 ExpectSemicolon(CHECK_OK);
508 return Statement::Default(); 515 return Statement::Default();
509 } 516 }
510 517
511 518
512 PreParser::Statement PreParser::ParseWithStatement(bool* ok) { 519 PreParser::Statement PreParser::ParseWithStatement(bool* ok) {
513 // WithStatement :: 520 // WithStatement ::
514 // 'with' '(' Expression ')' Statement 521 // 'with' '(' Expression ')' Statement
515 Expect(i::Token::WITH, CHECK_OK); 522 Expect(i::Token::WITH, CHECK_OK);
516 if (strict_mode()) { 523 if (!is_classic_mode()) {
517 i::Scanner::Location location = scanner_->location(); 524 i::Scanner::Location location = scanner_->location();
518 ReportMessageAt(location, "strict_mode_with", NULL); 525 ReportMessageAt(location, "strict_mode_with", NULL);
519 *ok = false; 526 *ok = false;
520 return Statement::Default(); 527 return Statement::Default();
521 } 528 }
522 Expect(i::Token::LPAREN, CHECK_OK); 529 Expect(i::Token::LPAREN, CHECK_OK);
523 ParseExpression(true, CHECK_OK); 530 ParseExpression(true, CHECK_OK);
524 Expect(i::Token::RPAREN, CHECK_OK); 531 Expect(i::Token::RPAREN, CHECK_OK);
525 532
526 scope_->EnterWith(); 533 scope_->EnterWith();
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 682
676 Expect(i::Token::TRY, CHECK_OK); 683 Expect(i::Token::TRY, CHECK_OK);
677 684
678 ParseBlock(CHECK_OK); 685 ParseBlock(CHECK_OK);
679 686
680 bool catch_or_finally_seen = false; 687 bool catch_or_finally_seen = false;
681 if (peek() == i::Token::CATCH) { 688 if (peek() == i::Token::CATCH) {
682 Consume(i::Token::CATCH); 689 Consume(i::Token::CATCH);
683 Expect(i::Token::LPAREN, CHECK_OK); 690 Expect(i::Token::LPAREN, CHECK_OK);
684 Identifier id = ParseIdentifier(CHECK_OK); 691 Identifier id = ParseIdentifier(CHECK_OK);
685 if (strict_mode() && !id.IsValidStrictVariable()) { 692 if (!is_classic_mode() && !id.IsValidStrictVariable()) {
686 StrictModeIdentifierViolation(scanner_->location(), 693 StrictModeIdentifierViolation(scanner_->location(),
687 "strict_catch_variable", 694 "strict_catch_variable",
688 id, 695 id,
689 ok); 696 ok);
690 return Statement::Default(); 697 return Statement::Default();
691 } 698 }
692 Expect(i::Token::RPAREN, CHECK_OK); 699 Expect(i::Token::RPAREN, CHECK_OK);
693 scope_->EnterWith(); 700 scope_->EnterWith();
694 ParseBlock(ok); 701 ParseBlock(ok);
695 scope_->LeaveWith(); 702 scope_->LeaveWith();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 // LeftHandSideExpression AssignmentOperator AssignmentExpression 760 // LeftHandSideExpression AssignmentOperator AssignmentExpression
754 761
755 i::Scanner::Location before = scanner_->peek_location(); 762 i::Scanner::Location before = scanner_->peek_location();
756 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK); 763 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK);
757 764
758 if (!i::Token::IsAssignmentOp(peek())) { 765 if (!i::Token::IsAssignmentOp(peek())) {
759 // Parsed conditional expression only (no assignment). 766 // Parsed conditional expression only (no assignment).
760 return expression; 767 return expression;
761 } 768 }
762 769
763 if (strict_mode() && expression.IsIdentifier() && 770 if (!is_classic_mode() &&
771 expression.IsIdentifier() &&
764 expression.AsIdentifier().IsEvalOrArguments()) { 772 expression.AsIdentifier().IsEvalOrArguments()) {
765 i::Scanner::Location after = scanner_->location(); 773 i::Scanner::Location after = scanner_->location();
766 ReportMessageAt(before.beg_pos, after.end_pos, 774 ReportMessageAt(before.beg_pos, after.end_pos,
767 "strict_lhs_assignment", NULL); 775 "strict_lhs_assignment", NULL);
768 *ok = false; 776 *ok = false;
769 return Expression::Default(); 777 return Expression::Default();
770 } 778 }
771 779
772 i::Token::Value op = Next(); // Get assignment operator. 780 i::Token::Value op = Next(); // Get assignment operator.
773 ParseAssignmentExpression(accept_IN, CHECK_OK); 781 ParseAssignmentExpression(accept_IN, CHECK_OK);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 849
842 i::Token::Value op = peek(); 850 i::Token::Value op = peek();
843 if (i::Token::IsUnaryOp(op)) { 851 if (i::Token::IsUnaryOp(op)) {
844 op = Next(); 852 op = Next();
845 ParseUnaryExpression(ok); 853 ParseUnaryExpression(ok);
846 return Expression::Default(); 854 return Expression::Default();
847 } else if (i::Token::IsCountOp(op)) { 855 } else if (i::Token::IsCountOp(op)) {
848 op = Next(); 856 op = Next();
849 i::Scanner::Location before = scanner_->peek_location(); 857 i::Scanner::Location before = scanner_->peek_location();
850 Expression expression = ParseUnaryExpression(CHECK_OK); 858 Expression expression = ParseUnaryExpression(CHECK_OK);
851 if (strict_mode() && expression.IsIdentifier() && 859 if (!is_classic_mode() &&
860 expression.IsIdentifier() &&
852 expression.AsIdentifier().IsEvalOrArguments()) { 861 expression.AsIdentifier().IsEvalOrArguments()) {
853 i::Scanner::Location after = scanner_->location(); 862 i::Scanner::Location after = scanner_->location();
854 ReportMessageAt(before.beg_pos, after.end_pos, 863 ReportMessageAt(before.beg_pos, after.end_pos,
855 "strict_lhs_prefix", NULL); 864 "strict_lhs_prefix", NULL);
856 *ok = false; 865 *ok = false;
857 } 866 }
858 return Expression::Default(); 867 return Expression::Default();
859 } else { 868 } else {
860 return ParsePostfixExpression(ok); 869 return ParsePostfixExpression(ok);
861 } 870 }
862 } 871 }
863 872
864 873
865 PreParser::Expression PreParser::ParsePostfixExpression(bool* ok) { 874 PreParser::Expression PreParser::ParsePostfixExpression(bool* ok) {
866 // PostfixExpression :: 875 // PostfixExpression ::
867 // LeftHandSideExpression ('++' | '--')? 876 // LeftHandSideExpression ('++' | '--')?
868 877
869 i::Scanner::Location before = scanner_->peek_location(); 878 i::Scanner::Location before = scanner_->peek_location();
870 Expression expression = ParseLeftHandSideExpression(CHECK_OK); 879 Expression expression = ParseLeftHandSideExpression(CHECK_OK);
871 if (!scanner_->HasAnyLineTerminatorBeforeNext() && 880 if (!scanner_->HasAnyLineTerminatorBeforeNext() &&
872 i::Token::IsCountOp(peek())) { 881 i::Token::IsCountOp(peek())) {
873 if (strict_mode() && expression.IsIdentifier() && 882 if (!is_classic_mode() &&
883 expression.IsIdentifier() &&
874 expression.AsIdentifier().IsEvalOrArguments()) { 884 expression.AsIdentifier().IsEvalOrArguments()) {
875 i::Scanner::Location after = scanner_->location(); 885 i::Scanner::Location after = scanner_->location();
876 ReportMessageAt(before.beg_pos, after.end_pos, 886 ReportMessageAt(before.beg_pos, after.end_pos,
877 "strict_lhs_postfix", NULL); 887 "strict_lhs_postfix", NULL);
878 *ok = false; 888 *ok = false;
879 return Expression::Default(); 889 return Expression::Default();
880 } 890 }
881 Next(); 891 Next();
882 return Expression::Default(); 892 return Expression::Default();
883 } 893 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 case i::Token::FUTURE_RESERVED_WORD: { 1060 case i::Token::FUTURE_RESERVED_WORD: {
1051 Next(); 1061 Next();
1052 i::Scanner::Location location = scanner_->location(); 1062 i::Scanner::Location location = scanner_->location();
1053 ReportMessageAt(location.beg_pos, location.end_pos, 1063 ReportMessageAt(location.beg_pos, location.end_pos,
1054 "reserved_word", NULL); 1064 "reserved_word", NULL);
1055 *ok = false; 1065 *ok = false;
1056 return Expression::Default(); 1066 return Expression::Default();
1057 } 1067 }
1058 1068
1059 case i::Token::FUTURE_STRICT_RESERVED_WORD: 1069 case i::Token::FUTURE_STRICT_RESERVED_WORD:
1060 if (strict_mode()) { 1070 if (!is_classic_mode()) {
1061 Next(); 1071 Next();
1062 i::Scanner::Location location = scanner_->location(); 1072 i::Scanner::Location location = scanner_->location();
1063 ReportMessageAt(location, "strict_reserved_word", NULL); 1073 ReportMessageAt(location, "strict_reserved_word", NULL);
1064 *ok = false; 1074 *ok = false;
1065 return Expression::Default(); 1075 return Expression::Default();
1066 } 1076 }
1067 // FALLTHROUGH 1077 // FALLTHROUGH
1068 case i::Token::IDENTIFIER: { 1078 case i::Token::IDENTIFIER: {
1069 Identifier id = ParseIdentifier(CHECK_OK); 1079 Identifier id = ParseIdentifier(CHECK_OK);
1070 result = Expression::FromIdentifier(id); 1080 result = Expression::FromIdentifier(id);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 old_type = finder->AddNumber(scanner_->literal_ascii_string(), type); 1160 old_type = finder->AddNumber(scanner_->literal_ascii_string(), type);
1151 } else if (scanner_->is_literal_ascii()) { 1161 } else if (scanner_->is_literal_ascii()) {
1152 old_type = finder->AddAsciiSymbol(scanner_->literal_ascii_string(), 1162 old_type = finder->AddAsciiSymbol(scanner_->literal_ascii_string(),
1153 type); 1163 type);
1154 } else { 1164 } else {
1155 old_type = finder->AddUC16Symbol(scanner_->literal_uc16_string(), type); 1165 old_type = finder->AddUC16Symbol(scanner_->literal_uc16_string(), type);
1156 } 1166 }
1157 if (HasConflict(old_type, type)) { 1167 if (HasConflict(old_type, type)) {
1158 if (IsDataDataConflict(old_type, type)) { 1168 if (IsDataDataConflict(old_type, type)) {
1159 // Both are data properties. 1169 // Both are data properties.
1160 if (!strict_mode()) return; 1170 if (is_classic_mode()) return;
1161 ReportMessageAt(scanner_->location(), 1171 ReportMessageAt(scanner_->location(),
1162 "strict_duplicate_property", NULL); 1172 "strict_duplicate_property", NULL);
1163 } else if (IsDataAccessorConflict(old_type, type)) { 1173 } else if (IsDataAccessorConflict(old_type, type)) {
1164 // Both a data and an accessor property with the same name. 1174 // Both a data and an accessor property with the same name.
1165 ReportMessageAt(scanner_->location(), 1175 ReportMessageAt(scanner_->location(),
1166 "accessor_data_property", NULL); 1176 "accessor_data_property", NULL);
1167 } else { 1177 } else {
1168 ASSERT(IsAccessorAccessorConflict(old_type, type)); 1178 ASSERT(IsAccessorAccessorConflict(old_type, type));
1169 // Both accessors of the same type. 1179 // Both accessors of the same type.
1170 ReportMessageAt(scanner_->location(), 1180 ReportMessageAt(scanner_->location(),
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1357 log_->ResumeRecording(); 1367 log_->ResumeRecording();
1358 if (!*ok) Expression::Default(); 1368 if (!*ok) Expression::Default();
1359 1369
1360 Expect(i::Token::RBRACE, CHECK_OK); 1370 Expect(i::Token::RBRACE, CHECK_OK);
1361 1371
1362 // Position right after terminal '}'. 1372 // Position right after terminal '}'.
1363 int end_pos = scanner_->location().end_pos; 1373 int end_pos = scanner_->location().end_pos;
1364 log_->LogFunction(function_block_pos, end_pos, 1374 log_->LogFunction(function_block_pos, end_pos,
1365 function_scope.materialized_literal_count(), 1375 function_scope.materialized_literal_count(),
1366 function_scope.expected_properties(), 1376 function_scope.expected_properties(),
1367 strict_mode_flag()); 1377 language_mode());
1368 } else { 1378 } else {
1369 ParseSourceElements(i::Token::RBRACE, CHECK_OK); 1379 ParseSourceElements(i::Token::RBRACE, CHECK_OK);
1370 Expect(i::Token::RBRACE, CHECK_OK); 1380 Expect(i::Token::RBRACE, CHECK_OK);
1371 } 1381 }
1372 1382
1373 if (strict_mode()) { 1383 if (!is_classic_mode()) {
1374 int end_position = scanner_->location().end_pos; 1384 int end_position = scanner_->location().end_pos;
1375 CheckOctalLiteral(start_position, end_position, CHECK_OK); 1385 CheckOctalLiteral(start_position, end_position, CHECK_OK);
1376 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK); 1386 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK);
1377 return Expression::StrictFunction(); 1387 return Expression::StrictFunction();
1378 } 1388 }
1379 1389
1380 return Expression::Default(); 1390 return Expression::Default();
1381 } 1391 }
1382 1392
1383 1393
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 i::Token::Value next = Next(); 1477 i::Token::Value next = Next();
1468 switch (next) { 1478 switch (next) {
1469 case i::Token::FUTURE_RESERVED_WORD: { 1479 case i::Token::FUTURE_RESERVED_WORD: {
1470 i::Scanner::Location location = scanner_->location(); 1480 i::Scanner::Location location = scanner_->location();
1471 ReportMessageAt(location.beg_pos, location.end_pos, 1481 ReportMessageAt(location.beg_pos, location.end_pos,
1472 "reserved_word", NULL); 1482 "reserved_word", NULL);
1473 *ok = false; 1483 *ok = false;
1474 return GetIdentifierSymbol(); 1484 return GetIdentifierSymbol();
1475 } 1485 }
1476 case i::Token::FUTURE_STRICT_RESERVED_WORD: 1486 case i::Token::FUTURE_STRICT_RESERVED_WORD:
1477 if (strict_mode()) { 1487 if (!is_classic_mode()) {
1478 i::Scanner::Location location = scanner_->location(); 1488 i::Scanner::Location location = scanner_->location();
1479 ReportMessageAt(location.beg_pos, location.end_pos, 1489 ReportMessageAt(location.beg_pos, location.end_pos,
1480 "strict_reserved_word", NULL); 1490 "strict_reserved_word", NULL);
1481 *ok = false; 1491 *ok = false;
1482 } 1492 }
1483 // FALLTHROUGH 1493 // FALLTHROUGH
1484 case i::Token::IDENTIFIER: 1494 case i::Token::IDENTIFIER:
1485 return GetIdentifierSymbol(); 1495 return GetIdentifierSymbol();
1486 default: 1496 default:
1487 *ok = false; 1497 *ok = false;
1488 return Identifier::Default(); 1498 return Identifier::Default();
1489 } 1499 }
1490 } 1500 }
1491 1501
1492 1502
1493 void PreParser::SetStrictModeViolation(i::Scanner::Location location, 1503 void PreParser::SetStrictModeViolation(i::Scanner::Location location,
1494 const char* type, 1504 const char* type,
1495 bool* ok) { 1505 bool* ok) {
1496 if (strict_mode()) { 1506 if (!is_classic_mode()) {
1497 ReportMessageAt(location, type, NULL); 1507 ReportMessageAt(location, type, NULL);
1498 *ok = false; 1508 *ok = false;
1499 return; 1509 return;
1500 } 1510 }
1501 // Delay report in case this later turns out to be strict code 1511 // Delay report in case this later turns out to be strict code
1502 // (i.e., for function names and parameters prior to a "use strict" 1512 // (i.e., for function names and parameters prior to a "use strict"
1503 // directive). 1513 // directive).
1504 // It's safe to overwrite an existing violation. 1514 // It's safe to overwrite an existing violation.
1505 // It's either from a function that turned out to be non-strict, 1515 // It's either from a function that turned out to be non-strict,
1506 // or it's in the current function (and we just need to report 1516 // or it's in the current function (and we just need to report
(...skipping 19 matching lines...) Expand all
1526 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, 1536 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location,
1527 const char* eval_args_type, 1537 const char* eval_args_type,
1528 Identifier identifier, 1538 Identifier identifier,
1529 bool* ok) { 1539 bool* ok) {
1530 const char* type = eval_args_type; 1540 const char* type = eval_args_type;
1531 if (identifier.IsFutureReserved()) { 1541 if (identifier.IsFutureReserved()) {
1532 type = "reserved_word"; 1542 type = "reserved_word";
1533 } else if (identifier.IsFutureStrictReserved()) { 1543 } else if (identifier.IsFutureStrictReserved()) {
1534 type = "strict_reserved_word"; 1544 type = "strict_reserved_word";
1535 } 1545 }
1536 if (strict_mode()) { 1546 if (!is_classic_mode()) {
1537 ReportMessageAt(location, type, NULL); 1547 ReportMessageAt(location, type, NULL);
1538 *ok = false; 1548 *ok = false;
1539 return; 1549 return;
1540 } 1550 }
1541 strict_mode_violation_location_ = location; 1551 strict_mode_violation_location_ = location;
1542 strict_mode_violation_type_ = type; 1552 strict_mode_violation_type_ = type;
1543 } 1553 }
1544 1554
1545 1555
1546 PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) { 1556 PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); 1724 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u));
1715 } 1725 }
1716 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); 1726 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u));
1717 } 1727 }
1718 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); 1728 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f));
1719 1729
1720 backing_store_.AddBlock(bytes); 1730 backing_store_.AddBlock(bytes);
1721 return backing_store_.EndSequence().start(); 1731 return backing_store_.EndSequence().start();
1722 } 1732 }
1723 } } // v8::preparser 1733 } } // v8::preparser
OLDNEW
« no previous file with comments | « src/preparser.h ('k') | src/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698