Home | History | Annotate | Download | only in src
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <cmath>
      6 
      7 #include "src/base/logging.h"
      8 #include "src/utils.h"
      9 
     10 #include "src/dtoa.h"
     11 
     12 #include "src/bignum-dtoa.h"
     13 #include "src/double.h"
     14 #include "src/fast-dtoa.h"
     15 #include "src/fixed-dtoa.h"
     16 
     17 namespace v8 {
     18 namespace internal {
     19 
     20 static BignumDtoaMode DtoaToBignumDtoaMode(DtoaMode dtoa_mode) {
     21   switch (dtoa_mode) {
     22     case DTOA_SHORTEST:  return BIGNUM_DTOA_SHORTEST;
     23     case DTOA_FIXED:     return BIGNUM_DTOA_FIXED;
     24     case DTOA_PRECISION: return BIGNUM_DTOA_PRECISION;
     25     default:
     26       UNREACHABLE();
     27       return BIGNUM_DTOA_SHORTEST;  // To silence compiler.
     28   }
     29 }
     30 
     31 
     32 void DoubleToAscii(double v, DtoaMode mode, int requested_digits,
     33                    Vector<char> buffer, int* sign, int* length, int* point) {
     34   DCHECK(!Double(v).IsSpecial());
     35   DCHECK(mode == DTOA_SHORTEST || requested_digits >= 0);
     36 
     37   if (Double(v).Sign() < 0) {
     38     *sign = 1;
     39     v = -v;
     40   } else {
     41     *sign = 0;
     42   }
     43 
     44   if (v == 0) {
     45     buffer[0] = '0';
     46     buffer[1] = '\0';
     47     *length = 1;
     48     *point = 1;
     49     return;
     50   }
     51 
     52   if (mode == DTOA_PRECISION && requested_digits == 0) {
     53     buffer[0] = '\0';
     54     *length = 0;
     55     return;
     56   }
     57 
     58   bool fast_worked;
     59   switch (mode) {
     60     case DTOA_SHORTEST:
     61       fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, length, point);
     62       break;
     63     case DTOA_FIXED:
     64       fast_worked = FastFixedDtoa(v, requested_digits, buffer, length, point);
     65       break;
     66     case DTOA_PRECISION:
     67       fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
     68                              buffer, length, point);
     69       break;
     70     default:
     71       UNREACHABLE();
     72       fast_worked = false;
     73   }
     74   if (fast_worked) return;
     75 
     76   // If the fast dtoa didn't succeed use the slower bignum version.
     77   BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
     78   BignumDtoa(v, bignum_mode, requested_digits, buffer, length, point);
     79   buffer[*length] = '\0';
     80 }
     81 
     82 }  // namespace internal
     83 }  // namespace v8
     84