Changeset 91686 in webkit for trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp
- Timestamp:
- Jul 25, 2011, 11:41:40 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/LiteralParser.cpp
r89219 r91686 237 237 } 238 238 if (*m_ptr == '\'') { 239 if (mode == StrictJSON) 239 if (mode == StrictJSON) { 240 m_lexErrorMessage = "Single quotes (\') are not allowed in JSON"; 240 241 return TokError; 242 } 241 243 return lexString<mode, '\''>(token); 242 244 } 243 245 } 246 m_lexErrorMessage = String::format("Unrecognized token '%c'", *m_ptr).impl(); 244 247 return TokError; 245 248 } … … 275 278 builder.append(runStart, m_ptr - runStart); 276 279 ++m_ptr; 277 if (m_ptr >= m_end) 280 if (m_ptr >= m_end) { 281 m_lexErrorMessage = "Unterminated string"; 278 282 return TokError; 283 } 279 284 switch (*m_ptr) { 280 285 case '"': … … 312 317 313 318 case 'u': 314 if ((m_end - m_ptr) < 5) // uNNNN == 5 characters 319 if ((m_end - m_ptr) < 5) { 320 m_lexErrorMessage = "\\u must be followed by 4 hex digits"; 315 321 return TokError; 322 } // uNNNN == 5 characters 316 323 for (int i = 1; i < 5; i++) { 317 if (!isASCIIHexDigit(m_ptr[i])) 324 if (!isASCIIHexDigit(m_ptr[i])) { 325 m_lexErrorMessage = String::format("\"\\%s\" is not a valid unicode escape", UString(m_ptr, 5).ascii().data()).impl(); 318 326 return TokError; 327 } 319 328 } 320 329 builder.append(JSC::Lexer::convertUnicode(m_ptr[1], m_ptr[2], m_ptr[3], m_ptr[4])); … … 328 337 break; 329 338 } 339 m_lexErrorMessage = String::format("Invalid escape character %c", *m_ptr).impl(); 330 340 return TokError; 331 341 } … … 333 343 } while ((mode != NonStrictJSON) && m_ptr != runStart && (m_ptr < m_end) && *m_ptr != terminator); 334 344 335 if (m_ptr >= m_end || *m_ptr != terminator) 345 if (m_ptr >= m_end || *m_ptr != terminator) { 346 m_lexErrorMessage = "Unterminated string"; 336 347 return TokError; 348 } 337 349 338 350 if (builder.isEmpty()) { … … 377 389 while (m_ptr < m_end && isASCIIDigit(*m_ptr)) 378 390 ++m_ptr; 379 } else 391 } else { 392 m_lexErrorMessage = "Invalid number"; 380 393 return TokError; 394 } 381 395 382 396 // ('.' [0-9]+)? … … 384 398 ++m_ptr; 385 399 // [0-9]+ 386 if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) 400 if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) { 401 m_lexErrorMessage = "Invalid digits after decimal point"; 387 402 return TokError; 403 } 388 404 389 405 ++m_ptr; … … 417 433 418 434 // [0-9]+ 419 if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) 435 if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) { 436 m_lexErrorMessage = "Exponent symbols should be followed by an optional '+' or '-' and then by at least one number"; 420 437 return TokError; 438 } 421 439 422 440 ++m_ptr; … … 459 477 TokenType lastToken = m_lexer.currentToken().type; 460 478 if (m_lexer.next() == TokRBracket) { 461 if (lastToken == TokComma) 462 return JSValue(); 479 if (lastToken == TokComma) { 480 m_parseErrorMessage = "Unexpected comma at the end of array expression"; 481 return JSValue(); 482 } 463 483 m_lexer.next(); 464 484 lastValue = objectStack.last(); … … 476 496 goto doParseArrayStartExpression; 477 497 478 if (m_lexer.currentToken().type != TokRBracket) 498 if (m_lexer.currentToken().type != TokRBracket) { 499 m_parseErrorMessage = "Expected ']'"; 479 500 return JSValue(); 501 } 480 502 481 503 m_lexer.next(); … … 494 516 495 517 // Check for colon 496 if (m_lexer.next() != TokColon) 497 return JSValue(); 518 if (m_lexer.next() != TokColon) { 519 m_parseErrorMessage = "Expected ':' before value in object property definition"; 520 return JSValue(); 521 } 498 522 499 523 m_lexer.next(); … … 502 526 goto startParseExpression; 503 527 } 504 if (type != TokRBrace) 528 if (type != TokRBrace) { 529 m_parseErrorMessage = "Expected '}'"; 505 530 return JSValue(); 531 } 506 532 m_lexer.next(); 507 533 lastValue = objectStack.last(); … … 512 538 case DoParseObjectStartExpression: { 513 539 TokenType type = m_lexer.next(); 514 if (type != TokString && (m_mode == StrictJSON || type != TokIdentifier)) 540 if (type != TokString && (m_mode == StrictJSON || type != TokIdentifier)) { 541 m_parseErrorMessage = "Property name must be a string literal"; 515 542 return JSValue(); 543 } 516 544 Lexer::LiteralParserToken identifierToken = m_lexer.currentToken(); 517 545 518 546 // Check for colon 519 if (m_lexer.next() != TokColon) 547 if (m_lexer.next() != TokColon) { 548 m_parseErrorMessage = "Expected ':'"; 520 549 return JSValue(); 550 } 521 551 522 552 m_lexer.next(); … … 531 561 if (m_lexer.currentToken().type == TokComma) 532 562 goto doParseObjectStartExpression; 533 if (m_lexer.currentToken().type != TokRBrace) 563 if (m_lexer.currentToken().type != TokRBrace) { 564 m_parseErrorMessage = "Expected '}'"; 534 565 return JSValue(); 566 } 535 567 m_lexer.next(); 536 568 lastValue = objectStack.last(); … … 571 603 lastValue = jsBoolean(false); 572 604 break; 573 605 case TokRBracket: 606 m_parseErrorMessage = "Unexpected token ']'"; 607 return JSValue(); 608 case TokRBrace: 609 m_parseErrorMessage = "Unexpected token '}'"; 610 return JSValue(); 611 case TokIdentifier: 612 m_parseErrorMessage = String::format("Unexpected identifier \"%s\"", UString(m_lexer.currentToken().stringToken).ascii().data()).impl(); 613 return JSValue(); 614 case TokColon: 615 m_parseErrorMessage = "Unexpected token ':'"; 616 return JSValue(); 617 case TokLParen: 618 m_parseErrorMessage = "Unexpected token '('"; 619 return JSValue(); 620 case TokRParen: 621 m_parseErrorMessage = "Unexpected token ')'"; 622 return JSValue(); 623 case TokComma: 624 m_parseErrorMessage = "Unexpected token ','"; 625 return JSValue(); 626 case TokDot: 627 m_parseErrorMessage = "Unexpected token '.'"; 628 return JSValue(); 629 case TokAssign: 630 m_parseErrorMessage = "Unexpected token '='"; 631 return JSValue(); 632 case TokSemi: 633 m_parseErrorMessage = "Unexpected token ';'"; 634 return JSValue(); 635 case TokEnd: 636 m_parseErrorMessage = "Unexpected EOF"; 637 return JSValue(); 638 case TokError: 574 639 default: 575 640 // Error 641 m_parseErrorMessage = "Could not parse value expression"; 576 642 return JSValue(); 577 643 } … … 590 656 goto startParseExpression; 591 657 } 658 case TokRBracket: 659 m_parseErrorMessage = "Unexpected token ']'"; 660 return JSValue(); 661 case TokLBrace: 662 m_parseErrorMessage = "Unexpected token '{'"; 663 return JSValue(); 664 case TokRBrace: 665 m_parseErrorMessage = "Unexpected token '}'"; 666 return JSValue(); 667 case TokIdentifier: 668 m_parseErrorMessage = String::format("Unexpected identifier \"%s\"", UString(m_lexer.currentToken().stringToken).ascii().data()).impl(); 669 return JSValue(); 670 case TokColon: 671 m_parseErrorMessage = "Unexpected token ':'"; 672 return JSValue(); 673 case TokRParen: 674 m_parseErrorMessage = "Unexpected token ')'"; 675 return JSValue(); 676 case TokComma: 677 m_parseErrorMessage = "Unexpected token ','"; 678 return JSValue(); 679 case TokTrue: 680 m_parseErrorMessage = "Unexpected token 'true'"; 681 return JSValue(); 682 case TokFalse: 683 m_parseErrorMessage = "Unexpected token 'false'"; 684 return JSValue(); 685 case TokNull: 686 m_parseErrorMessage = "Unexpected token 'null'"; 687 return JSValue(); 688 case TokEnd: 689 m_parseErrorMessage = "Unexpected EOF"; 690 return JSValue(); 691 case TokDot: 692 m_parseErrorMessage = "Unexpected token '.'"; 693 return JSValue(); 694 case TokAssign: 695 m_parseErrorMessage = "Unexpected token '='"; 696 return JSValue(); 697 case TokSemi: 698 m_parseErrorMessage = "Unexpected token ';'"; 699 return JSValue(); 700 case TokError: 592 701 default: 702 m_parseErrorMessage = "Could not parse statement"; 593 703 return JSValue(); 594 704 } … … 600 710 if (m_lexer.next() == TokEnd) 601 711 return lastValue; 712 m_parseErrorMessage = "Unexpected content at end of JSON literal"; 602 713 return JSValue(); 603 714 }
Note:
See TracChangeset
for help on using the changeset viewer.