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

Side by Side Diff: src/conversions.cc

Issue 4135014: Fix assumptions in DoubleToFixed. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 10 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 | « no previous file | no next file » | 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 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 do { 809 do {
810 buffer[--i] = '0' + (n % 10); 810 buffer[--i] = '0' + (n % 10);
811 n /= 10; 811 n /= 10;
812 } while (n); 812 } while (n);
813 if (negative) buffer[--i] = '-'; 813 if (negative) buffer[--i] = '-';
814 return buffer.start() + i; 814 return buffer.start() + i;
815 } 815 }
816 816
817 817
818 char* DoubleToFixedCString(double value, int f) { 818 char* DoubleToFixedCString(double value, int f) {
819 const int kMaxDigitsBeforePoint = 20; 819 const int kMaxDigitsBeforePoint = 21;
820 const double kFirstNonFixed = 1e21; 820 const double kFirstNonFixed = 1e21;
821 const int kMaxDigitsAfterPoint = 20; 821 const int kMaxDigitsAfterPoint = 20;
822 ASSERT(f >= 0); 822 ASSERT(f >= 0);
823 ASSERT(f <= kMaxDigitsAfterPoint); 823 ASSERT(f <= kMaxDigitsAfterPoint);
824 824
825 bool negative = false; 825 bool negative = false;
826 double abs_value = value; 826 double abs_value = value;
827 if (value < 0) { 827 if (value < 0) {
828 abs_value = -value; 828 abs_value = -value;
829 negative = true; 829 negative = true;
830 } 830 }
831 831
832 // If abs_value has more than kMaxDigitsBeforePoint digits before the point 832 // If abs_value has more than kMaxDigitsBeforePoint digits before the point
833 // use the non-fixed conversion routine. 833 // use the non-fixed conversion routine.
834 if (abs_value >= kFirstNonFixed) { 834 if (abs_value >= kFirstNonFixed) {
835 char arr[100]; 835 char arr[100];
836 Vector<char> buffer(arr, ARRAY_SIZE(arr)); 836 Vector<char> buffer(arr, ARRAY_SIZE(arr));
837 return StrDup(DoubleToCString(value, buffer)); 837 return StrDup(DoubleToCString(value, buffer));
838 } 838 }
839 839
840 // Find a sufficiently precise decimal representation of n. 840 // Find a sufficiently precise decimal representation of n.
841 int decimal_point; 841 int decimal_point;
842 int sign; 842 int sign;
843 // Add space for the '.' and the '\0' byte. 843 // Add space for the '\0' byte.
844 const int kDecimalRepCapacity = 844 const int kDecimalRepCapacity =
845 kMaxDigitsBeforePoint + kMaxDigitsAfterPoint + 2; 845 kMaxDigitsBeforePoint + kMaxDigitsAfterPoint + 1;
846 char decimal_rep[kDecimalRepCapacity]; 846 char decimal_rep[kDecimalRepCapacity];
847 int decimal_rep_length; 847 int decimal_rep_length;
848 bool status = DoubleToAscii(value, DTOA_FIXED, f, 848 bool status = DoubleToAscii(value, DTOA_FIXED, f,
849 Vector<char>(decimal_rep, kDecimalRepCapacity), 849 Vector<char>(decimal_rep, kDecimalRepCapacity),
850 &sign, &decimal_rep_length, &decimal_point); 850 &sign, &decimal_rep_length, &decimal_point);
851 USE(status); 851 USE(status);
852 ASSERT(status); 852 ASSERT(status);
853 853
854 // Create a representation that is padded with zeros if needed. 854 // Create a representation that is padded with zeros if needed.
855 int zero_prefix_length = 0; 855 int zero_prefix_length = 0;
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 // Allocate result and fill in the parts. 1131 // Allocate result and fill in the parts.
1132 StringBuilder builder(result_size + 1); 1132 StringBuilder builder(result_size + 1);
1133 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size); 1133 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size);
1134 if (decimal_pos > 0) builder.AddCharacter('.'); 1134 if (decimal_pos > 0) builder.AddCharacter('.');
1135 builder.AddSubstring(decimal_buffer, decimal_pos); 1135 builder.AddSubstring(decimal_buffer, decimal_pos);
1136 return builder.Finalize(); 1136 return builder.Finalize();
1137 } 1137 }
1138 1138
1139 1139
1140 } } // namespace v8::internal 1140 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698