Index: runtime/vm/double_conversion.cc |
diff --git a/runtime/vm/double_conversion.cc b/runtime/vm/double_conversion.cc |
index 41cec22002d9df43d1da768f9391c86c30901a9e..2b00d975e0daa5bc99034a3f51e7e2d0ee2ae43d 100644 |
--- a/runtime/vm/double_conversion.cc |
+++ b/runtime/vm/double_conversion.cc |
@@ -16,24 +16,26 @@ static const char kDoubleToStringCommonExponentChar = 'e'; |
static const char* kDoubleToStringCommonInfinitySymbol = "Infinity"; |
static const char* kDoubleToStringCommonNaNSymbol = "NaN"; |
-bool DoubleToString(double d, String& result) { |
+bool DoubleToCString(double d, char* buffer, int buffer_size, |
+ int* result_length) { |
static const int kDecimalLow = -6; |
static const int kDecimalHigh = 21; |
- static const int kConversionFlags = |
- double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN | |
- double_conversion::DoubleToStringConverter::EMIT_TRAILING_DECIMAL_POINT | |
- double_conversion::DoubleToStringConverter::EMIT_TRAILING_ZERO_AFTER_POINT; |
- const int kBufferSize = 128; |
+ |
// The output contains the sign, at most kDecimalHigh - 1 digits, |
// the decimal point followed by a 0 plus the \0. |
- ASSERT(kBufferSize >= 1 + (kDecimalHigh - 1) + 1 + 1 + 1); |
+ ASSERT(buffer_size >= 1 + (kDecimalHigh - 1) + 1 + 1 + 1); |
// Or it contains the sign, a 0, the decimal point, kDecimalLow '0's, |
// 17 digits (the precision needed for doubles), plus the \0. |
- ASSERT(kBufferSize >= 1 + 1 + 1 + kDecimalLow + 17 + 1); |
+ ASSERT(buffer_size >= 1 + 1 + 1 + kDecimalLow + 17 + 1); |
// Alternatively it contains a sign, at most 17 digits (precision needed for |
// any double), the decimal point, the exponent character, the exponent's |
// sign, at most three exponent digits, plus the \0. |
- ASSERT(kBufferSize >= 1 + 17 + 1 + 1 + 1 + 3 + 1); |
+ ASSERT(buffer_size >= 1 + 17 + 1 + 1 + 1 + 3 + 1); |
+ |
+ static const int kConversionFlags = |
+ double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN | |
+ double_conversion::DoubleToStringConverter::EMIT_TRAILING_DECIMAL_POINT | |
+ double_conversion::DoubleToStringConverter::EMIT_TRAILING_ZERO_AFTER_POINT; |
const double_conversion::DoubleToStringConverter converter( |
kConversionFlags, |
@@ -44,8 +46,23 @@ bool DoubleToString(double d, String& result) { |
kDecimalHigh, |
0, 0); // Last two values are ignored in shortest mode. |
- UNIMPLEMENTED(); |
- return false; |
+ double_conversion::StringBuilder builder(buffer, buffer_size); |
+ bool status = converter.ToShortest(d, &builder); |
+ if (!status) return false; |
+ *result_length = builder.position() + 1; // Include trailing \0 character. |
+ char* result = builder.Finalize(); |
+ ASSERT(result == buffer); |
+ return true; |
+} |
+ |
+bool DoubleToString(double d, String& result) { |
floitsch
2012/01/25 00:27:10
linter complains that result should be either "con
|
+ const int kBufferSize = 128; |
+ char buffer[kBufferSize]; |
+ int length; |
+ bool status = DoubleToCString(d, buffer, kBufferSize, &length); |
+ if (!status) return false; |
+ result ^= String::New(reinterpret_cast<uint8_t*>(buffer), length); |
+ return true; |
} |
bool DoubleToStringAsFixed(double d, int fraction_digits, String& result) { |
@@ -57,7 +74,7 @@ bool DoubleToStringAsFixed(double d, int fraction_digits, String& result) { |
static const double kUpperBoundary = 1e21; |
// TODO(floitsch): remove the UNIQUE_ZERO flag when the test is updated. |
static const int kConversionFlags = |
- double_conversion::DoubleToStringConverter::UNIQUE_ZERO; |
+ double_conversion::DoubleToStringConverter::NO_FLAGS; |
const int kBufferSize = 128; |
// The output contains the sign, at most kMaxDigitsBeforePoint digits, |
// the decimal point followed by at most fraction_digits digits plus the \0. |
@@ -91,7 +108,7 @@ bool DoubleToStringAsFixed(double d, int fraction_digits, String& result) { |
bool DoubleToStringAsExponential(double d, |
int fraction_digits, |
String& result) { |
- static const int kMinFractionDigits = 0; |
+ static const int kMinFractionDigits = -1; // -1 represents shortest mode. |
static const int kMaxFractionDigits = 20; |
static const int kConversionFlags = |
double_conversion::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN; |
@@ -101,8 +118,8 @@ bool DoubleToStringAsExponential(double d, |
// exponent-sign and three exponent digits plus \0. |
ASSERT(kBufferSize >= 1 + 1 + kMaxFractionDigits + 1 + 1 + 3 + 1); |
- if (!(kMinFractionDigits <= fraction_digits && |
- fraction_digits <= kMaxFractionDigits)) { |
+ if (fraction_digits < kMinFractionDigits || |
+ fraction_digits > kMaxFractionDigits) { |
return false; |
} |
@@ -113,8 +130,13 @@ bool DoubleToStringAsExponential(double d, |
kDoubleToStringCommonExponentChar, |
0, 0, 0, 0); // Last four values are ignored in exponential mode. |
- UNIMPLEMENTED(); |
- return false; |
+ char buffer[kBufferSize]; |
+ double_conversion::StringBuilder builder(buffer, kBufferSize); |
+ bool status = converter.ToExponential(d, fraction_digits, &builder); |
+ if (!status) return false; |
+ int length = builder.position(); |
+ result ^= String::New(reinterpret_cast<uint8_t*>(builder.Finalize()), length); |
+ return true; |
} |
@@ -144,8 +166,13 @@ bool DoubleToStringAsPrecision(double d, int precision, String& result) { |
kMaxLeadingPaddingZeroes, |
kMaxTrailingPaddingZeroes); |
- UNIMPLEMENTED(); |
- return false; |
+ char buffer[kBufferSize]; |
+ double_conversion::StringBuilder builder(buffer, kBufferSize); |
+ bool status = converter.ToPrecision(d, precision, &builder); |
+ if (!status) return false; |
+ int length = builder.position(); |
+ result ^= String::New(reinterpret_cast<uint8_t*>(builder.Finalize()), length); |
+ return true; |
} |
} // namespace dart |