⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conversions.cc.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
extern "C" void freedtoa(char* s);const char* DoubleToCString(double v, Vector<char> buffer) {  StringBuilder builder(buffer.start(), buffer.length());  switch (fpclassify(v)) {    case FP_NAN:      builder.AddString("NaN");      break;    case FP_INFINITE:      if (v < 0.0) {        builder.AddString("-Infinity");      } else {        builder.AddString("Infinity");      }      break;    case FP_ZERO:      builder.AddCharacter('0');      break;    default: {      int decimal_point;      int sign;      char* decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL);      int length = strlen(decimal_rep);      if (sign) builder.AddCharacter('-');      if (length <= decimal_point && decimal_point <= 21) {        // ECMA-262 section 9.8.1 step 6.        builder.AddString(decimal_rep);        builder.AddPadding('0', decimal_point - length);      } else if (0 < decimal_point && decimal_point <= 21) {        // ECMA-262 section 9.8.1 step 7.        builder.AddSubstring(decimal_rep, decimal_point);        builder.AddCharacter('.');        builder.AddString(decimal_rep + decimal_point);      } else if (decimal_point <= 0 && decimal_point > -6) {        // ECMA-262 section 9.8.1 step 8.        builder.AddString("0.");        builder.AddPadding('0', -decimal_point);        builder.AddString(decimal_rep);      } else {        // ECMA-262 section 9.8.1 step 9 and 10 combined.        builder.AddCharacter(decimal_rep[0]);        if (length != 1) {          builder.AddCharacter('.');          builder.AddString(decimal_rep + 1);        }        builder.AddCharacter('e');        builder.AddCharacter((decimal_point >= 0) ? '+' : '-');        int exponent = decimal_point - 1;        if (exponent < 0) exponent = -exponent;        builder.AddFormatted("%d", exponent);      }      freedtoa(decimal_rep);    }  }  return builder.Finalize();}const char* IntToCString(int n, Vector<char> buffer) {  bool negative = false;  if (n < 0) {    // We must not negate the most negative int.    if (n == kMinInt) return DoubleToCString(n, buffer);    negative = true;    n = -n;  }  // Build the string backwards from the least significant digit.  int i = buffer.length();  buffer[--i] = '\0';  do {    buffer[--i] = '0' + (n % 10);    n /= 10;  } while (n);  if (negative) buffer[--i] = '-';  return buffer.start() + i;}char* DoubleToFixedCString(double value, int f) {  ASSERT(f >= 0);  bool negative = false;  double abs_value = value;  if (value < 0) {    abs_value = -value;    negative = true;  }  if (abs_value >= 1e21) {    char arr[100];    Vector<char> buffer(arr, ARRAY_SIZE(arr));    return StrDup(DoubleToCString(value, buffer));  }  // Find a sufficiently precise decimal representation of n.  int decimal_point;  int sign;  char* decimal_rep = dtoa(abs_value, 3, f, &decimal_point, &sign, NULL);  int decimal_rep_length = strlen(decimal_rep);  // Create a representation that is padded with zeros if needed.  int zero_prefix_length = 0;  int zero_postfix_length = 0;  if (decimal_point <= 0) {    zero_prefix_length = -decimal_point + 1;    decimal_point = 1;  }  if (zero_prefix_length + decimal_rep_length < decimal_point + f) {    zero_postfix_length = decimal_point + f - decimal_rep_length -                          zero_prefix_length;  }  unsigned rep_length =      zero_prefix_length + decimal_rep_length + zero_postfix_length;  StringBuilder rep_builder(rep_length + 1);  rep_builder.AddPadding('0', zero_prefix_length);  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.  unsigned result_size = decimal_point + f + 2;  StringBuilder builder(result_size + 1);  if (negative) builder.AddCharacter('-');  builder.AddSubstring(rep, decimal_point);  if (f > 0) {    builder.AddCharacter('.');    builder.AddSubstring(rep + decimal_point, f);  }  DeleteArray(rep);  return builder.Finalize();}static char* CreateExponentialRepresentation(char* decimal_rep,                                             int exponent,                                             bool negative,                                             int significant_digits) {  bool negative_exponent = false;  if (exponent < 0) {    negative_exponent = true;    exponent = -exponent;  }  // Leave room in the result for appending a minus, for a period, the  // letter 'e', a minus or a plus depending on the exponent, and a  // three digit exponent.  unsigned result_size = significant_digits + 7;  StringBuilder builder(result_size + 1);  if (negative) builder.AddCharacter('-');  builder.AddCharacter(decimal_rep[0]);  if (significant_digits != 1) {    builder.AddCharacter('.');    builder.AddString(decimal_rep + 1);    builder.AddPadding('0', significant_digits - strlen(decimal_rep));  }  builder.AddCharacter('e');  builder.AddCharacter(negative_exponent ? '-' : '+');  builder.AddFormatted("%d", exponent);  return builder.Finalize();}char* DoubleToExponentialCString(double value, int f) {  // f might be -1 to signal that f was undefined in JavaScript.  ASSERT(f >= -1 && f <= 20);  bool negative = false;  if (value < 0) {    value = -value;    negative = true;  }  // Find a sufficiently precise decimal representation of n.  int decimal_point;  int sign;  char* decimal_rep = NULL;  if (f == -1) {    decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL);    f = strlen(decimal_rep) - 1;  } else {    decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL);  }  int decimal_rep_length = strlen(decimal_rep);  ASSERT(decimal_rep_length > 0);  ASSERT(decimal_rep_length <= f + 1);  USE(decimal_rep_length);  int exponent = decimal_point - 1;  char* result =      CreateExponentialRepresentation(decimal_rep, exponent, negative, f+1);  freedtoa(decimal_rep);  return result;}char* DoubleToPrecisionCString(double value, int p) {  ASSERT(p >= 1 && p <= 21);  bool negative = false;  if (value < 0) {    value = -value;    negative = true;  }  // Find a sufficiently precise decimal representation of n.  int decimal_point;  int sign;  char* decimal_rep = dtoa(value, 2, p, &decimal_point, &sign, NULL);  int decimal_rep_length = strlen(decimal_rep);  ASSERT(decimal_rep_length <= p);  int exponent = decimal_point - 1;  char* result = NULL;  if (exponent < -6 || exponent >= p) {    result =        CreateExponentialRepresentation(decimal_rep, exponent, negative, p);  } else {    // Use fixed notation.    //    // Leave room in the result for appending a minus, a period and in    // the case where decimal_point is not positive for a zero in    // front of the period.    unsigned result_size = (decimal_point <= 0)        ? -decimal_point + p + 3        : p + 2;    StringBuilder builder(result_size + 1);    if (negative) builder.AddCharacter('-');    if (decimal_point <= 0) {      builder.AddString("0.");      builder.AddPadding('0', -decimal_point);      builder.AddString(decimal_rep);      builder.AddPadding('0', p - decimal_rep_length);    } else {      const int m = Min(decimal_rep_length, decimal_point);      builder.AddSubstring(decimal_rep, m);      builder.AddPadding('0', decimal_point - decimal_rep_length);      if (decimal_point < p) {        builder.AddCharacter('.');        const int extra = negative ? 2 : 1;        if (decimal_rep_length > decimal_point) {          const int len = strlen(decimal_rep + decimal_point);          const int n = Min(len, p - (builder.position() - extra));          builder.AddSubstring(decimal_rep + decimal_point, n);        }        builder.AddPadding('0', extra + (p - builder.position()));      }    }    result = builder.Finalize();  }  freedtoa(decimal_rep);  return result;}char* DoubleToRadixCString(double value, int radix) {  ASSERT(radix >= 2 && radix <= 36);  // Character array used for conversion.  static const char chars[] = "0123456789abcdefghijklmnopqrstuvwxyz";  // Buffer for the integer part of the result. 1024 chars is enough  // for max integer value in radix 2.  We need room for a sign too.  static const int kBufferSize = 1100;  char integer_buffer[kBufferSize];  integer_buffer[kBufferSize - 1] = '\0';  // Buffer for the decimal part of the result.  We only generate up  // to kBufferSize - 1 chars for the decimal part.  char decimal_buffer[kBufferSize];  decimal_buffer[kBufferSize - 1] = '\0';  // Make sure the value is positive.  bool is_negative = value < 0.0;  if (is_negative) value = -value;  // Get the integer part and the decimal part.  double integer_part = floor(value);  double decimal_part = value - integer_part;  // Convert the integer part starting from the back.  Always generate  // at least one digit.  int integer_pos = kBufferSize - 2;  do {    integer_buffer[integer_pos--] =        chars[static_cast<int>(fmod(integer_part, radix))];    integer_part /= radix;  } while (integer_part >= 1.0);  // Sanity check.  ASSERT(integer_pos > 0);  // Add sign if needed.  if (is_negative) integer_buffer[integer_pos--] = '-';  // Convert the decimal part.  Repeatedly multiply by the radix to  // generate the next char.  Never generate more than kBufferSize - 1  // chars.  //  // TODO(1093998): We will often generate a full decimal_buffer of  // chars because hitting zero will often not happen.  The right  // solution would be to continue until the string representation can  // be read back and yield the original value.  To implement this  // efficiently, we probably have to modify dtoa.  int decimal_pos = 0;  while ((decimal_part > 0.0) && (decimal_pos < kBufferSize - 1)) {    decimal_part *= radix;    decimal_buffer[decimal_pos++] =        chars[static_cast<int>(floor(decimal_part))];    decimal_part -= floor(decimal_part);  }  decimal_buffer[decimal_pos] = '\0';  // Compute the result size.  int integer_part_size = kBufferSize - 2 - integer_pos;  // Make room for zero termination.  unsigned result_size = integer_part_size + decimal_pos;  // If the number has a decimal part, leave room for the period.  if (decimal_pos > 0) result_size++;  // Allocate result and fill in the parts.  StringBuilder builder(result_size + 1);  builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size);  if (decimal_pos > 0) builder.AddCharacter('.');  builder.AddSubstring(decimal_buffer, decimal_pos);  return builder.Finalize();}} }  // namespace v8::internal

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -