| OLD | NEW | 
|     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 931 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   942  |   942  | 
|   943   builder.AddCharacter('e'); |   943   builder.AddCharacter('e'); | 
|   944   builder.AddCharacter(negative_exponent ? '-' : '+'); |   944   builder.AddCharacter(negative_exponent ? '-' : '+'); | 
|   945   builder.AddFormatted("%d", exponent); |   945   builder.AddFormatted("%d", exponent); | 
|   946   return builder.Finalize(); |   946   return builder.Finalize(); | 
|   947 } |   947 } | 
|   948  |   948  | 
|   949  |   949  | 
|   950  |   950  | 
|   951 char* DoubleToExponentialCString(double value, int f) { |   951 char* DoubleToExponentialCString(double value, int f) { | 
 |   952   const int kMaxDigitsAfterPoint = 20; | 
|   952   // f might be -1 to signal that f was undefined in JavaScript. |   953   // f might be -1 to signal that f was undefined in JavaScript. | 
|   953   ASSERT(f >= -1 && f <= 20); |   954   ASSERT(f >= -1 && f <= kMaxDigitsAfterPoint); | 
|   954  |   955  | 
|   955   bool negative = false; |   956   bool negative = false; | 
|   956   if (value < 0) { |   957   if (value < 0) { | 
|   957     value = -value; |   958     value = -value; | 
|   958     negative = true; |   959     negative = true; | 
|   959   } |   960   } | 
|   960  |   961  | 
|   961   // Find a sufficiently precise decimal representation of n. |   962   // Find a sufficiently precise decimal representation of n. | 
|   962   int decimal_point; |   963   int decimal_point; | 
|   963   int sign; |   964   int sign; | 
|   964   char* decimal_rep = NULL; |   965   char* decimal_rep = NULL; | 
 |   966   bool used_gay_dtoa = false; | 
 |   967   // f corresponds to the digits after the point. There is always one digit | 
 |   968   // before the point. The number of requested_digits equals hence f + 1. | 
 |   969   // And we have to add one character for the null-terminator. | 
 |   970   const int kV8DtoaBufferCapacity = kMaxDigitsAfterPoint + 1 + 1; | 
 |   971   // Make sure that the buffer is big enough, even if we fall back to the | 
 |   972   // shortest representation (which happens when f equals -1). | 
 |   973   ASSERT(kBase10MaximalLength <= kMaxDigitsAfterPoint + 1); | 
 |   974   char v8_dtoa_buffer[kV8DtoaBufferCapacity]; | 
 |   975   int decimal_rep_length; | 
 |   976  | 
|   965   if (f == -1) { |   977   if (f == -1) { | 
|   966     decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL); |   978     if (DoubleToAscii(value, DTOA_SHORTEST, 0, | 
|   967     f = StrLength(decimal_rep) - 1; |   979                       Vector<char>(v8_dtoa_buffer, kV8DtoaBufferCapacity), | 
 |   980                       &sign, &decimal_rep_length, &decimal_point)) { | 
 |   981       f = decimal_rep_length - 1; | 
 |   982       decimal_rep = v8_dtoa_buffer; | 
 |   983     } else { | 
 |   984       decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL); | 
 |   985       decimal_rep_length = StrLength(decimal_rep); | 
 |   986       f = decimal_rep_length - 1; | 
 |   987       used_gay_dtoa = true; | 
 |   988     } | 
|   968   } else { |   989   } else { | 
|   969     decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL); |   990     if (DoubleToAscii(value, DTOA_PRECISION, f + 1, | 
 |   991                       Vector<char>(v8_dtoa_buffer, kV8DtoaBufferCapacity), | 
 |   992                       &sign, &decimal_rep_length, &decimal_point)) { | 
 |   993       decimal_rep = v8_dtoa_buffer; | 
 |   994     } else { | 
 |   995       decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL); | 
 |   996       decimal_rep_length = StrLength(decimal_rep); | 
 |   997       used_gay_dtoa = true; | 
 |   998     } | 
|   970   } |   999   } | 
|   971   int decimal_rep_length = StrLength(decimal_rep); |  | 
|   972   ASSERT(decimal_rep_length > 0); |  1000   ASSERT(decimal_rep_length > 0); | 
|   973   ASSERT(decimal_rep_length <= f + 1); |  1001   ASSERT(decimal_rep_length <= f + 1); | 
|   974   USE(decimal_rep_length); |  | 
|   975  |  1002  | 
|   976   int exponent = decimal_point - 1; |  1003   int exponent = decimal_point - 1; | 
|   977   char* result = |  1004   char* result = | 
|   978       CreateExponentialRepresentation(decimal_rep, exponent, negative, f+1); |  1005       CreateExponentialRepresentation(decimal_rep, exponent, negative, f+1); | 
|   979  |  1006  | 
|   980   freedtoa(decimal_rep); |  1007   if (used_gay_dtoa) { | 
 |  1008     freedtoa(decimal_rep); | 
 |  1009   } | 
|   981  |  1010  | 
|   982   return result; |  1011   return result; | 
|   983 } |  1012 } | 
|   984  |  1013  | 
|   985  |  1014  | 
|   986 char* DoubleToPrecisionCString(double value, int p) { |  1015 char* DoubleToPrecisionCString(double value, int p) { | 
|   987   ASSERT(p >= 1 && p <= 21); |  1016   const int kMinimalDigits = 1; | 
 |  1017   const int kMaximalDigits = 21; | 
 |  1018   ASSERT(p >= kMinimalDigits && p <= kMaximalDigits); | 
 |  1019   USE(kMinimalDigits); | 
|   988  |  1020  | 
|   989   bool negative = false; |  1021   bool negative = false; | 
|   990   if (value < 0) { |  1022   if (value < 0) { | 
|   991     value = -value; |  1023     value = -value; | 
|   992     negative = true; |  1024     negative = true; | 
|   993   } |  1025   } | 
|   994  |  1026  | 
|   995   // Find a sufficiently precise decimal representation of n. |  1027   // Find a sufficiently precise decimal representation of n. | 
|   996   int decimal_point; |  1028   int decimal_point; | 
|   997   int sign; |  1029   int sign; | 
|   998   char* decimal_rep = dtoa(value, 2, p, &decimal_point, &sign, NULL); |  1030   char* decimal_rep = NULL; | 
|   999   int decimal_rep_length = StrLength(decimal_rep); |  1031   bool used_gay_dtoa = false; | 
 |  1032   // Add one for the terminating null character. | 
 |  1033   const int kV8DtoaBufferCapacity = kMaximalDigits + 1; | 
 |  1034   char v8_dtoa_buffer[kV8DtoaBufferCapacity]; | 
 |  1035   int decimal_rep_length; | 
 |  1036  | 
 |  1037   if (DoubleToAscii(value, DTOA_PRECISION, p, | 
 |  1038                     Vector<char>(v8_dtoa_buffer, kV8DtoaBufferCapacity), | 
 |  1039                     &sign, &decimal_rep_length, &decimal_point)) { | 
 |  1040     decimal_rep = v8_dtoa_buffer; | 
 |  1041   } else { | 
 |  1042     decimal_rep = dtoa(value, 2, p, &decimal_point, &sign, NULL); | 
 |  1043     decimal_rep_length = StrLength(decimal_rep); | 
 |  1044     used_gay_dtoa = true; | 
 |  1045   } | 
|  1000   ASSERT(decimal_rep_length <= p); |  1046   ASSERT(decimal_rep_length <= p); | 
|  1001  |  1047  | 
|  1002   int exponent = decimal_point - 1; |  1048   int exponent = decimal_point - 1; | 
|  1003  |  1049  | 
|  1004   char* result = NULL; |  1050   char* result = NULL; | 
|  1005  |  1051  | 
|  1006   if (exponent < -6 || exponent >= p) { |  1052   if (exponent < -6 || exponent >= p) { | 
|  1007     result = |  1053     result = | 
|  1008         CreateExponentialRepresentation(decimal_rep, exponent, negative, p); |  1054         CreateExponentialRepresentation(decimal_rep, exponent, negative, p); | 
|  1009   } else { |  1055   } else { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
|  1033           const int len = StrLength(decimal_rep + decimal_point); |  1079           const int len = StrLength(decimal_rep + decimal_point); | 
|  1034           const int n = Min(len, p - (builder.position() - extra)); |  1080           const int n = Min(len, p - (builder.position() - extra)); | 
|  1035           builder.AddSubstring(decimal_rep + decimal_point, n); |  1081           builder.AddSubstring(decimal_rep + decimal_point, n); | 
|  1036         } |  1082         } | 
|  1037         builder.AddPadding('0', extra + (p - builder.position())); |  1083         builder.AddPadding('0', extra + (p - builder.position())); | 
|  1038       } |  1084       } | 
|  1039     } |  1085     } | 
|  1040     result = builder.Finalize(); |  1086     result = builder.Finalize(); | 
|  1041   } |  1087   } | 
|  1042  |  1088  | 
|  1043   freedtoa(decimal_rep); |  1089   if (used_gay_dtoa) { | 
 |  1090     freedtoa(decimal_rep); | 
 |  1091   } | 
|  1044   return result; |  1092   return result; | 
|  1045 } |  1093 } | 
|  1046  |  1094  | 
|  1047  |  1095  | 
|  1048 char* DoubleToRadixCString(double value, int radix) { |  1096 char* DoubleToRadixCString(double value, int radix) { | 
|  1049   ASSERT(radix >= 2 && radix <= 36); |  1097   ASSERT(radix >= 2 && radix <= 36); | 
|  1050  |  1098  | 
|  1051   // Character array used for conversion. |  1099   // Character array used for conversion. | 
|  1052   static const char chars[] = "0123456789abcdefghijklmnopqrstuvwxyz"; |  1100   static const char chars[] = "0123456789abcdefghijklmnopqrstuvwxyz"; | 
|  1053  |  1101  | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1110   // Allocate result and fill in the parts. |  1158   // Allocate result and fill in the parts. | 
|  1111   StringBuilder builder(result_size + 1); |  1159   StringBuilder builder(result_size + 1); | 
|  1112   builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size); |  1160   builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size); | 
|  1113   if (decimal_pos > 0) builder.AddCharacter('.'); |  1161   if (decimal_pos > 0) builder.AddCharacter('.'); | 
|  1114   builder.AddSubstring(decimal_buffer, decimal_pos); |  1162   builder.AddSubstring(decimal_buffer, decimal_pos); | 
|  1115   return builder.Finalize(); |  1163   return builder.Finalize(); | 
|  1116 } |  1164 } | 
|  1117  |  1165  | 
|  1118  |  1166  | 
|  1119 } }  // namespace v8::internal |  1167 } }  // namespace v8::internal | 
| OLD | NEW |