| Index: src/conversions.cc
|
| ===================================================================
|
| --- src/conversions.cc (revision 4591)
|
| +++ src/conversions.cc (working copy)
|
| @@ -31,8 +31,8 @@
|
| #include "v8.h"
|
|
|
| #include "conversions-inl.h"
|
| -#include "dtoa.h"
|
| #include "factory.h"
|
| +#include "fast-dtoa.h"
|
| #include "scanner.h"
|
|
|
| namespace v8 {
|
| @@ -766,16 +766,15 @@
|
| default: {
|
| int decimal_point;
|
| int sign;
|
| +
|
| char* decimal_rep;
|
| bool used_gay_dtoa = false;
|
| - const int kV8DtoaBufferCapacity = kBase10MaximalLength + 1;
|
| - char v8_dtoa_buffer[kV8DtoaBufferCapacity];
|
| + const int kFastDtoaBufferCapacity = kFastDtoaMaximalLength + 1;
|
| + char fast_dtoa_buffer[kFastDtoaBufferCapacity];
|
| int length;
|
| -
|
| - if (DoubleToAscii(v, DTOA_SHORTEST, 0,
|
| - Vector<char>(v8_dtoa_buffer, kV8DtoaBufferCapacity),
|
| - &sign, &length, &decimal_point)) {
|
| - decimal_rep = v8_dtoa_buffer;
|
| + if (FastDtoa(v, Vector<char>(fast_dtoa_buffer, kFastDtoaBufferCapacity),
|
| + &sign, &length, &decimal_point)) {
|
| + decimal_rep = fast_dtoa_buffer;
|
| } else {
|
| decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL);
|
| used_gay_dtoa = true;
|
| @@ -843,11 +842,7 @@
|
|
|
|
|
| char* DoubleToFixedCString(double value, int f) {
|
| - const int kMaxDigitsBeforePoint = 20;
|
| - const double kFirstNonFixed = 1e21;
|
| - const int kMaxDigitsAfterPoint = 20;
|
| ASSERT(f >= 0);
|
| - ASSERT(f <= kMaxDigitsAfterPoint);
|
|
|
| bool negative = false;
|
| double abs_value = value;
|
| @@ -856,9 +851,7 @@
|
| negative = true;
|
| }
|
|
|
| - // If abs_value has more than kMaxDigitsBeforePoint digits before the point
|
| - // use the non-fixed conversion routine.
|
| - if (abs_value >= kFirstNonFixed) {
|
| + if (abs_value >= 1e21) {
|
| char arr[100];
|
| Vector<char> buffer(arr, ARRAY_SIZE(arr));
|
| return StrDup(DoubleToCString(value, buffer));
|
| @@ -867,16 +860,8 @@
|
| // Find a sufficiently precise decimal representation of n.
|
| int decimal_point;
|
| int sign;
|
| - // Add space for the '.' and the '\0' byte.
|
| - const int kDecimalRepCapacity =
|
| - kMaxDigitsBeforePoint + kMaxDigitsAfterPoint + 2;
|
| - char decimal_rep[kDecimalRepCapacity];
|
| - int decimal_rep_length;
|
| - bool status = DoubleToAscii(value, DTOA_FIXED, f,
|
| - Vector<char>(decimal_rep, kDecimalRepCapacity),
|
| - &sign, &decimal_rep_length, &decimal_point);
|
| - USE(status);
|
| - ASSERT(status);
|
| + char* decimal_rep = dtoa(abs_value, 3, f, &decimal_point, &sign, NULL);
|
| + int decimal_rep_length = StrLength(decimal_rep);
|
|
|
| // Create a representation that is padded with zeros if needed.
|
| int zero_prefix_length = 0;
|
| @@ -899,6 +884,7 @@
|
| rep_builder.AddString(decimal_rep);
|
| rep_builder.AddPadding('0', zero_postfix_length);
|
| char* rep = rep_builder.Finalize();
|
| + freedtoa(decimal_rep);
|
|
|
| // Create the result string by appending a minus and putting in a
|
| // decimal point if needed.
|
|
|