diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-10-16 18:17:31 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-11-23 21:15:11 +0000 |
commit | c8b4e0ae14ce34f24e6900de52b781588f8988e3 (patch) | |
tree | 38d7317dbd7070de77abfc1376e4ed17bedee46d /src/qml/jsruntime | |
parent | 242067390f3bd891b162164a2d01a3a982c64fa2 (diff) |
Remove libdouble-conversion
We can use facilities in qtbase to convert doubles to strings now.
This also makes the fix to QTBUG-47070 obsolete.
Change-Id: I2f813164ff788b96281c3ffd37d8d2c65665de80
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/jsruntime.pri | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 46 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4numberobject_p.h | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 9 |
4 files changed, 37 insertions, 29 deletions
diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri index 5ffdebe328..503b40e8ae 100644 --- a/src/qml/jsruntime/jsruntime.pri +++ b/src/qml/jsruntime/jsruntime.pri @@ -112,5 +112,3 @@ valgrind { } ios: DEFINES += ENABLE_ASSEMBLER_WX_EXCLUSIVE=1 - -include(../../3rdparty/double-conversion/double-conversion.pri) diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index 4ae30a7f35..7e51d2a410 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -39,13 +39,31 @@ #include <QtCore/qmath.h> #include <QtCore/QDebug> #include <cassert> -#include <double-conversion.h> using namespace QV4; DEFINE_OBJECT_VTABLE(NumberCtor); DEFINE_OBJECT_VTABLE(NumberObject); +struct NumberLocaleHolder : public NumberLocale +{ + NumberLocaleHolder() {} +}; + +Q_GLOBAL_STATIC(NumberLocaleHolder, numberLocaleHolder) + +NumberLocale::NumberLocale() : QLocale(QLocale::C), + // -128 means shortest string that can accurately represent the number. + defaultDoublePrecision(0xffffff80) +{ + setNumberOptions(QLocale::OmitGroupSeparator | QLocale::OmitLeadingZeroInExponent); +} + +const NumberLocale *NumberLocale::instance() +{ + return numberLocaleHolder(); +} + Heap::NumberCtor::NumberCtor(QV4::ExecutionContext *scope) : Heap::FunctionObject(scope, QStringLiteral("Number")) { @@ -201,15 +219,9 @@ ReturnedValue NumberPrototype::method_toFixed(CallContext *ctx) str = QStringLiteral("NaN"); else if (qIsInf(v)) str = QString::fromLatin1(v < 0 ? "-Infinity" : "Infinity"); - else if (v < 1.e21) { - char buf[100]; - double_conversion::StringBuilder builder(buf, sizeof(buf)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToFixed(v, fdigits, &builder); - str = QString::fromLatin1(builder.Finalize()); - // At some point, the 3rd party double-conversion code should be moved to qtcore. - // When that's done, we can use: -// str = QString::number(v, 'f', int (fdigits)); - } else + else if (v < 1.e21) + str = NumberLocale::instance()->toString(v, 'f', int(fdigits)); + else return RuntimeHelpers::stringFromNumber(ctx->engine(), v)->asReturnedValue(); return scope.engine->newString(str)->asReturnedValue(); } @@ -221,7 +233,7 @@ ReturnedValue NumberPrototype::method_toExponential(CallContext *ctx) if (scope.engine->hasException) return Encode::undefined(); - int fdigits = -1; + int fdigits = NumberLocale::instance()->defaultDoublePrecision; if (ctx->argc() && !ctx->args()[0].isUndefined()) { fdigits = ctx->args()[0].toInt32(); @@ -231,11 +243,7 @@ ReturnedValue NumberPrototype::method_toExponential(CallContext *ctx) } } - char str[100]; - double_conversion::StringBuilder builder(str, sizeof(str)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(d, fdigits, &builder); - QString result = QString::fromLatin1(builder.Finalize()); - + QString result = NumberLocale::instance()->toString(d, 'e', fdigits); return scope.engine->newString(result)->asReturnedValue(); } @@ -255,10 +263,6 @@ ReturnedValue NumberPrototype::method_toPrecision(CallContext *ctx) return ctx->engine()->throwRangeError(error); } - char str[100]; - double_conversion::StringBuilder builder(str, sizeof(str)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(v->asDouble(), precision, &builder); - QString result = QString::fromLatin1(builder.Finalize()); - + QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision); return scope.engine->newString(result)->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4numberobject_p.h b/src/qml/jsruntime/qv4numberobject_p.h index cc5033531e..bd6fe3febb 100644 --- a/src/qml/jsruntime/qv4numberobject_p.h +++ b/src/qml/jsruntime/qv4numberobject_p.h @@ -60,6 +60,15 @@ struct NumberCtor : FunctionObject { } +class NumberLocale : public QLocale +{ +public: + static const NumberLocale *instance(); + const int defaultDoublePrecision; +protected: + NumberLocale(); +}; + struct NumberCtor: FunctionObject { V4_OBJECT2(NumberCtor, FunctionObject) diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index a988313f5f..2d0eac079f 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -43,6 +43,7 @@ #include "qv4dateobject_p.h" #include "qv4lookup_p.h" #include "qv4function_p.h" +#include "qv4numberobject_p.h" #include "private/qlocale_tools_p.h" #include "qv4scopedvalue_p.h" #include <private/qqmlcontextwrapper_p.h> @@ -60,8 +61,6 @@ #include <wtf/MathExtras.h> -#include "../../3rdparty/double-conversion/double-conversion.h" - #ifdef QV4_COUNT_RUNTIME_FUNCTIONS # include <QtCore/QBuffer> # include <QtCore/QDebug> @@ -226,10 +225,8 @@ void RuntimeHelpers::numberToString(QString *result, double num, int radix) } if (radix == 10) { - char str[100]; - double_conversion::StringBuilder builder(str, sizeof(str)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToShortest(num, &builder); - *result = QString::fromLatin1(builder.Finalize()); + const NumberLocale *locale = NumberLocale::instance(); + *result = locale->toString(num, 'g', locale->defaultDoublePrecision); return; } |