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

Side by Side Diff: src/conversions-inl.h

Issue 10818003: Interpret negative hexadecimal literals as NaN. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: addressed commented issues Created 8 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/str-to-num.js » ('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 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 char buffer[kBufferSize]; // NOLINT: size is known at compile time. 452 char buffer[kBufferSize]; // NOLINT: size is known at compile time.
453 int buffer_pos = 0; 453 int buffer_pos = 0;
454 454
455 // Exponent will be adjusted if insignificant digits of the integer part 455 // Exponent will be adjusted if insignificant digits of the integer part
456 // or insignificant leading zeros of the fractional part are dropped. 456 // or insignificant leading zeros of the fractional part are dropped.
457 int exponent = 0; 457 int exponent = 0;
458 int significant_digits = 0; 458 int significant_digits = 0;
459 int insignificant_digits = 0; 459 int insignificant_digits = 0;
460 bool nonzero_digit_dropped = false; 460 bool nonzero_digit_dropped = false;
461 461
462 bool negative = false; 462 enum Sign {
463 NONE,
464 NEGATIVE,
465 POSITIVE
466 };
467
468 Sign sign = NONE;
463 469
464 if (*current == '+') { 470 if (*current == '+') {
465 // Ignore leading sign. 471 // Ignore leading sign.
466 ++current; 472 ++current;
467 if (current == end) return JunkStringValue(); 473 if (current == end) return JunkStringValue();
474 sign = POSITIVE;
468 } else if (*current == '-') { 475 } else if (*current == '-') {
469 ++current; 476 ++current;
470 if (current == end) return JunkStringValue(); 477 if (current == end) return JunkStringValue();
471 negative = true; 478 sign = NEGATIVE;
472 } 479 }
473 480
474 static const char kInfinitySymbol[] = "Infinity"; 481 static const char kInfinitySymbol[] = "Infinity";
475 if (*current == kInfinitySymbol[0]) { 482 if (*current == kInfinitySymbol[0]) {
476 if (!SubStringEquals(&current, end, kInfinitySymbol)) { 483 if (!SubStringEquals(&current, end, kInfinitySymbol)) {
477 return JunkStringValue(); 484 return JunkStringValue();
478 } 485 }
479 486
480 if (!allow_trailing_junk && 487 if (!allow_trailing_junk &&
481 AdvanceToNonspace(unicode_cache, &current, end)) { 488 AdvanceToNonspace(unicode_cache, &current, end)) {
482 return JunkStringValue(); 489 return JunkStringValue();
483 } 490 }
484 491
485 ASSERT(buffer_pos == 0); 492 ASSERT(buffer_pos == 0);
486 return negative ? -V8_INFINITY : V8_INFINITY; 493 return (sign == NEGATIVE) ? -V8_INFINITY : V8_INFINITY;
487 } 494 }
488 495
489 bool leading_zero = false; 496 bool leading_zero = false;
490 if (*current == '0') { 497 if (*current == '0') {
491 ++current; 498 ++current;
492 if (current == end) return SignedZero(negative); 499 if (current == end) return SignedZero(sign == NEGATIVE);
493 500
494 leading_zero = true; 501 leading_zero = true;
495 502
496 // It could be hexadecimal value. 503 // It could be hexadecimal value.
497 if ((flags & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { 504 if ((flags & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
498 ++current; 505 ++current;
499 if (current == end || !isDigit(*current, 16)) { 506 if (current == end || !isDigit(*current, 16) || sign != NONE) {
500 return JunkStringValue(); // "0x". 507 return JunkStringValue(); // "0x".
501 } 508 }
502 509
503 return InternalStringToIntDouble<4>(unicode_cache, 510 return InternalStringToIntDouble<4>(unicode_cache,
504 current, 511 current,
505 end, 512 end,
506 negative, 513 false,
507 allow_trailing_junk); 514 allow_trailing_junk);
508 } 515 }
509 516
510 // Ignore leading zeros in the integer part. 517 // Ignore leading zeros in the integer part.
511 while (*current == '0') { 518 while (*current == '0') {
512 ++current; 519 ++current;
513 if (current == end) return SignedZero(negative); 520 if (current == end) return SignedZero(sign == NEGATIVE);
514 } 521 }
515 } 522 }
516 523
517 bool octal = leading_zero && (flags & ALLOW_OCTALS) != 0; 524 bool octal = leading_zero && (flags & ALLOW_OCTALS) != 0;
518 525
519 // Copy significant digits of the integer part (if any) to the buffer. 526 // Copy significant digits of the integer part (if any) to the buffer.
520 while (*current >= '0' && *current <= '9') { 527 while (*current >= '0' && *current <= '9') {
521 if (significant_digits < kMaxSignificantDigits) { 528 if (significant_digits < kMaxSignificantDigits) {
522 ASSERT(buffer_pos < kBufferSize); 529 ASSERT(buffer_pos < kBufferSize);
523 buffer[buffer_pos++] = static_cast<char>(*current); 530 buffer[buffer_pos++] = static_cast<char>(*current);
(...skipping 24 matching lines...) Expand all
548 goto parsing_done; 555 goto parsing_done;
549 } 556 }
550 } 557 }
551 558
552 if (significant_digits == 0) { 559 if (significant_digits == 0) {
553 // octal = false; 560 // octal = false;
554 // Integer part consists of 0 or is absent. Significant digits start after 561 // Integer part consists of 0 or is absent. Significant digits start after
555 // leading zeros (if any). 562 // leading zeros (if any).
556 while (*current == '0') { 563 while (*current == '0') {
557 ++current; 564 ++current;
558 if (current == end) return SignedZero(negative); 565 if (current == end) return SignedZero(sign == NEGATIVE);
559 exponent--; // Move this 0 into the exponent. 566 exponent--; // Move this 0 into the exponent.
560 } 567 }
561 } 568 }
562 569
563 // There is a fractional part. We don't emit a '.', but adjust the exponent 570 // There is a fractional part. We don't emit a '.', but adjust the exponent
564 // instead. 571 // instead.
565 while (*current >= '0' && *current <= '9') { 572 while (*current >= '0' && *current <= '9') {
566 if (significant_digits < kMaxSignificantDigits) { 573 if (significant_digits < kMaxSignificantDigits) {
567 ASSERT(buffer_pos < kBufferSize); 574 ASSERT(buffer_pos < kBufferSize);
568 buffer[buffer_pos++] = static_cast<char>(*current); 575 buffer[buffer_pos++] = static_cast<char>(*current);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 return JunkStringValue(); 647 return JunkStringValue();
641 } 648 }
642 649
643 parsing_done: 650 parsing_done:
644 exponent += insignificant_digits; 651 exponent += insignificant_digits;
645 652
646 if (octal) { 653 if (octal) {
647 return InternalStringToIntDouble<3>(unicode_cache, 654 return InternalStringToIntDouble<3>(unicode_cache,
648 buffer, 655 buffer,
649 buffer + buffer_pos, 656 buffer + buffer_pos,
650 negative, 657 sign == NEGATIVE,
651 allow_trailing_junk); 658 allow_trailing_junk);
652 } 659 }
653 660
654 if (nonzero_digit_dropped) { 661 if (nonzero_digit_dropped) {
655 buffer[buffer_pos++] = '1'; 662 buffer[buffer_pos++] = '1';
656 exponent--; 663 exponent--;
657 } 664 }
658 665
659 ASSERT(buffer_pos < kBufferSize); 666 ASSERT(buffer_pos < kBufferSize);
660 buffer[buffer_pos] = '\0'; 667 buffer[buffer_pos] = '\0';
661 668
662 double converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent); 669 double converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent);
663 return negative ? -converted : converted; 670 return (sign == NEGATIVE) ? -converted : converted;
664 } 671 }
665 672
666 } } // namespace v8::internal 673 } } // namespace v8::internal
667 674
668 #endif // V8_CONVERSIONS_INL_H_ 675 #endif // V8_CONVERSIONS_INL_H_
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/str-to-num.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698