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

Side by Side Diff: src/conversions.cc

Issue 1217007: Fix conform test. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 9 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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 leading_zero = true; 288 leading_zero = true;
289 ++current; 289 ++current;
290 if (current == end) return 0; 290 if (current == end) return 0;
291 } 291 }
292 292
293 int begin_pos = buffer_pos; 293 int begin_pos = buffer_pos;
294 while ((*current >= '0' && *current <= '9') 294 while ((*current >= '0' && *current <= '9')
295 || (*current >= 'a' && *current <= 'f') 295 || (*current >= 'a' && *current <= 'f')
296 || (*current >= 'A' && *current <= 'F')) { 296 || (*current >= 'A' && *current <= 'F')) {
297 if (significant_digits <= max_significant_digits) { 297 if (significant_digits <= max_significant_digits) {
298 buffer[buffer_pos++] = *current; 298 buffer[buffer_pos++] = static_cast<char>(*current);
299 significant_digits++; 299 significant_digits++;
300 } else { 300 } else {
301 insignificant_digits++; 301 insignificant_digits++;
302 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; 302 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
303 } 303 }
304 ++current; 304 ++current;
305 if (current == end) break; 305 if (current == end) break;
306 } 306 }
307 307
308 if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) { 308 if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 if (current == end) return signed_zero; 418 if (current == end) return signed_zero;
419 } 419 }
420 } 420 }
421 421
422 bool octal = leading_zero && (flags & ALLOW_OCTALS) != 0; 422 bool octal = leading_zero && (flags & ALLOW_OCTALS) != 0;
423 423
424 // Copy significant digits of the integer part (if any) to the buffer. 424 // Copy significant digits of the integer part (if any) to the buffer.
425 while (*current >= '0' && *current <= '9') { 425 while (*current >= '0' && *current <= '9') {
426 if (significant_digits < max_significant_digits) { 426 if (significant_digits < max_significant_digits) {
427 ASSERT(buffer_pos < buffer_size); 427 ASSERT(buffer_pos < buffer_size);
428 buffer[buffer_pos++] = *current; 428 buffer[buffer_pos++] = static_cast<char>(*current);
429 significant_digits++; 429 significant_digits++;
430 // Will later check if it's an octal in the buffer. 430 // Will later check if it's an octal in the buffer.
431 } else { 431 } else {
432 insignificant_digits++; // Move the digit into the exponential part. 432 insignificant_digits++; // Move the digit into the exponential part.
433 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; 433 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
434 } 434 }
435 octal = octal && *current < '8'; 435 octal = octal && *current < '8';
436 ++current; 436 ++current;
437 if (current == end) goto parsing_done; 437 if (current == end) goto parsing_done;
438 } 438 }
439 439
440 if (*current == '.') { 440 if (*current == '.') {
441 ASSERT(buffer_pos < buffer_size); 441 ASSERT(buffer_pos < buffer_size);
442 buffer[buffer_pos++] = '.';
443 ++current; 442 ++current;
444 if (current == end) { 443 if (current == end) {
445 if (significant_digits == 0 && !leading_zero) { 444 if (significant_digits == 0 && !leading_zero) {
446 return JUNK_STRING_VALUE; 445 return JUNK_STRING_VALUE;
447 } else { 446 } else {
448 goto parsing_done; 447 goto parsing_done;
449 } 448 }
450 } 449 }
450 buffer[buffer_pos++] = '.';
451 451
452 if (significant_digits == 0) { 452 if (significant_digits == 0) {
453 octal = false; 453 octal = false;
454 // Integer part consists of 0 or is absent. Significant digits start after 454 // Integer part consists of 0 or is absent. Significant digits start after
455 // leading zeros (if any). 455 // leading zeros (if any).
456 while (*current == '0') { 456 while (*current == '0') {
457 ++current; 457 ++current;
458 if (current == end) return signed_zero; 458 if (current == end) return signed_zero;
459 exponent--; // Move this 0 into the exponent. 459 exponent--; // Move this 0 into the exponent.
460 } 460 }
461 } 461 }
462 462
463 // There is the fractional part. 463 // There is the fractional part.
464 while (*current >= '0' && *current <= '9') { 464 while (*current >= '0' && *current <= '9') {
465 if (significant_digits < max_significant_digits) { 465 if (significant_digits < max_significant_digits) {
466 ASSERT(buffer_pos < buffer_size); 466 ASSERT(buffer_pos < buffer_size);
467 buffer[buffer_pos++] = *current; 467 buffer[buffer_pos++] = static_cast<char>(*current);
468 significant_digits++; 468 significant_digits++;
469 } else { 469 } else {
470 // Ignore insignificant digits in the fractional part. 470 // Ignore insignificant digits in the fractional part.
471 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; 471 nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
472 } 472 }
473 ++current; 473 ++current;
474 if (current == end) goto parsing_done; 474 if (current == end) goto parsing_done;
475 } 475 }
476 } 476 }
477 477
(...skipping 11 matching lines...) Expand all
489 ++current; 489 ++current;
490 if (current == end) { 490 if (current == end) {
491 if (allow_trailing_junk) { 491 if (allow_trailing_junk) {
492 goto parsing_done; 492 goto parsing_done;
493 } else { 493 } else {
494 return JUNK_STRING_VALUE; 494 return JUNK_STRING_VALUE;
495 } 495 }
496 } 496 }
497 char sign = '+'; 497 char sign = '+';
498 if (*current == '+' || *current == '-') { 498 if (*current == '+' || *current == '-') {
499 sign = *current; 499 sign = static_cast<char>(*current);
500 ++current; 500 ++current;
501 if (current == end) { 501 if (current == end) {
502 if (allow_trailing_junk) { 502 if (allow_trailing_junk) {
503 goto parsing_done; 503 goto parsing_done;
504 } else { 504 } else {
505 return JUNK_STRING_VALUE; 505 return JUNK_STRING_VALUE;
506 } 506 }
507 } 507 }
508 } 508 }
509 509
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 // Allocate result and fill in the parts. 972 // Allocate result and fill in the parts.
973 StringBuilder builder(result_size + 1); 973 StringBuilder builder(result_size + 1);
974 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size); 974 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size);
975 if (decimal_pos > 0) builder.AddCharacter('.'); 975 if (decimal_pos > 0) builder.AddCharacter('.');
976 builder.AddSubstring(decimal_buffer, decimal_pos); 976 builder.AddSubstring(decimal_buffer, decimal_pos);
977 return builder.Finalize(); 977 return builder.Finalize();
978 } 978 }
979 979
980 980
981 } } // namespace v8::internal 981 } } // namespace v8::internal
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