| 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;
|
| }
|
|
|