Home | History | Annotate | Download | only in src
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #include <math.h>
     29 
     30 #include "../include/v8stdint.h"
     31 #include "checks.h"
     32 #include "utils.h"
     33 
     34 #include "dtoa.h"
     35 
     36 #include "bignum-dtoa.h"
     37 #include "double.h"
     38 #include "fast-dtoa.h"
     39 #include "fixed-dtoa.h"
     40 
     41 namespace v8 {
     42 namespace internal {
     43 
     44 static BignumDtoaMode DtoaToBignumDtoaMode(DtoaMode dtoa_mode) {
     45   switch (dtoa_mode) {
     46     case DTOA_SHORTEST:  return BIGNUM_DTOA_SHORTEST;
     47     case DTOA_FIXED:     return BIGNUM_DTOA_FIXED;
     48     case DTOA_PRECISION: return BIGNUM_DTOA_PRECISION;
     49     default:
     50       UNREACHABLE();
     51       return BIGNUM_DTOA_SHORTEST;  // To silence compiler.
     52   }
     53 }
     54 
     55 
     56 void DoubleToAscii(double v, DtoaMode mode, int requested_digits,
     57                    Vector<char> buffer, int* sign, int* length, int* point) {
     58   ASSERT(!Double(v).IsSpecial());
     59   ASSERT(mode == DTOA_SHORTEST || requested_digits >= 0);
     60 
     61   if (Double(v).Sign() < 0) {
     62     *sign = 1;
     63     v = -v;
     64   } else {
     65     *sign = 0;
     66   }
     67 
     68   if (v == 0) {
     69     buffer[0] = '0';
     70     buffer[1] = '\0';
     71     *length = 1;
     72     *point = 1;
     73     return;
     74   }
     75 
     76   if (mode == DTOA_PRECISION && requested_digits == 0) {
     77     buffer[0] = '\0';
     78     *length = 0;
     79     return;
     80   }
     81 
     82   bool fast_worked;
     83   switch (mode) {
     84     case DTOA_SHORTEST:
     85       fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, length, point);
     86       break;
     87     case DTOA_FIXED:
     88       fast_worked = FastFixedDtoa(v, requested_digits, buffer, length, point);
     89       break;
     90     case DTOA_PRECISION:
     91       fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
     92                              buffer, length, point);
     93       break;
     94     default:
     95       UNREACHABLE();
     96       fast_worked = false;
     97   }
     98   if (fast_worked) return;
     99 
    100   // If the fast dtoa didn't succeed use the slower bignum version.
    101   BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
    102   BignumDtoa(v, bignum_mode, requested_digits, buffer, length, point);
    103   buffer[*length] = '\0';
    104 }
    105 
    106 } }  // namespace v8::internal
    107