Index: src/conversions.cc |
=================================================================== |
--- src/conversions.cc (revision 3886) |
+++ src/conversions.cc (working copy) |
@@ -25,12 +25,14 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+#include <math.h> |
#include <stdarg.h> |
#include "v8.h" |
#include "conversions-inl.h" |
#include "factory.h" |
+#include "grisu3.h" |
#include "scanner.h" |
namespace v8 { |
@@ -382,8 +384,17 @@ |
int decimal_point; |
int sign; |
- char* decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL); |
- int length = StrLength(decimal_rep); |
+ char* decimal_rep; |
+ bool used_dtoa = false; |
+ char grisu_buffer[kGrisu3MaximalLength + 1]; |
+ int length; |
+ if (grisu3(v, grisu_buffer, &sign, &length, &decimal_point)) { |
+ decimal_rep = &grisu_buffer[0]; |
+ } else { |
+ decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL); |
+ used_dtoa = true; |
+ length = StrLength(decimal_rep); |
+ } |
if (sign) builder.AddCharacter('-'); |
@@ -418,7 +429,7 @@ |
builder.AddFormatted("%d", exponent); |
} |
- freedtoa(decimal_rep); |
+ if (used_dtoa) freedtoa(decimal_rep); |
} |
} |
return builder.Finalize(); |
@@ -552,9 +563,18 @@ |
int decimal_point; |
int sign; |
char* decimal_rep = NULL; |
+ bool used_dtoa = true; |
+ char grisu_buffer[kGrisu3MaximalLength + 1]; |
if (f == -1) { |
- decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL); |
- f = StrLength(decimal_rep) - 1; |
+ int length; |
+ if (grisu3(value, grisu_buffer, &sign, &length, &decimal_point)) { |
+ used_dtoa = false; |
+ decimal_rep = &grisu_buffer[0]; |
+ f = length - 1; |
+ } else { |
+ decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL); |
+ f = StrLength(decimal_rep) - 1; |
+ } |
} else { |
decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL); |
} |
@@ -567,7 +587,7 @@ |
char* result = |
CreateExponentialRepresentation(decimal_rep, exponent, negative, f+1); |
- freedtoa(decimal_rep); |
+ if (used_dtoa) freedtoa(decimal_rep); |
return result; |
} |