diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-08-16 20:40:03 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-17 09:26:40 +0200 |
commit | 0da208381f98ffd22790716a144aa5f22a5fd07e (patch) | |
tree | 0f9598c0a466cf243b78f6255b0c4be77aec3288 /src/qml/jsruntime/qv4numberobject.cpp | |
parent | 3cfc7e0c026faf70eff8e180a2df3a01b34491c0 (diff) |
Never convert the this object when calling a builtin function
When calling builtin methods, the this object should should be
passed unmodified to the method. This failed so far because some
of our buitin methods where implemented slightly wrong.
Change-Id: I725f4dc952b4af6101645cf702e01b5410406a92
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4numberobject.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index 266fa792dc..6d3b6220cc 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -96,17 +96,19 @@ void NumberPrototype::init(ExecutionContext *ctx, const Value &ctor) defineDefaultProperty(ctx, QStringLiteral("toPrecision"), method_toPrecision); } +inline Value thisNumberValue(ExecutionContext *ctx) +{ + if (ctx->thisObject.isNumber()) + return ctx->thisObject; + NumberObject *n = ctx->thisObject.asNumberObject(); + if (!n) + ctx->throwTypeError(); + return n->value; +} + Value NumberPrototype::method_toString(SimpleCallContext *ctx) { - double num; - if (ctx->thisObject.isNumber()) { - num = ctx->thisObject.asDouble(); - } else { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); - num = thisObject->value.asDouble(); - } + double num = thisNumberValue(ctx).asDouble(); Value arg = ctx->argument(0); if (!arg.isUndefined()) { @@ -160,28 +162,20 @@ Value NumberPrototype::method_toString(SimpleCallContext *ctx) Value NumberPrototype::method_toLocaleString(SimpleCallContext *ctx) { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); + Value v = thisNumberValue(ctx); - String *str = thisObject->value.toString(ctx); + String *str = v.toString(ctx); return Value::fromString(str); } Value NumberPrototype::method_valueOf(SimpleCallContext *ctx) { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); - - return thisObject->value; + return thisNumberValue(ctx); } Value NumberPrototype::method_toFixed(SimpleCallContext *ctx) { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); + double v = thisNumberValue(ctx).asDouble(); double fdigits = 0; @@ -194,7 +188,6 @@ Value NumberPrototype::method_toFixed(SimpleCallContext *ctx) if (fdigits < 0 || fdigits > 20) ctx->throwRangeError(ctx->thisObject); - double v = thisObject->value.asDouble(); QString str; if (std::isnan(v)) str = QString::fromLatin1("NaN"); @@ -209,9 +202,7 @@ Value NumberPrototype::method_toFixed(SimpleCallContext *ctx) Value NumberPrototype::method_toExponential(SimpleCallContext *ctx) { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); + double d = thisNumberValue(ctx).asDouble(); Value fraction = ctx->argument(0); int fdigits = -1; @@ -226,7 +217,7 @@ Value NumberPrototype::method_toExponential(SimpleCallContext *ctx) char str[100]; double_conversion::StringBuilder builder(str, sizeof(str)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(thisObject->value.asDouble(), fdigits, &builder); + double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(d, fdigits, &builder); QString result = QString::fromLatin1(builder.Finalize()); return Value::fromString(ctx, result); @@ -234,13 +225,11 @@ Value NumberPrototype::method_toExponential(SimpleCallContext *ctx) Value NumberPrototype::method_toPrecision(SimpleCallContext *ctx) { - NumberObject *thisObject = ctx->thisObject.asNumberObject(); - if (!thisObject) - ctx->throwTypeError(); + Value v = thisNumberValue(ctx); Value prec = ctx->argument(0); if (prec.isUndefined()) - return __qmljs_to_string(thisObject->value, ctx); + return __qmljs_to_string(v, ctx); double precision = prec.toInt32(); if (precision < 1 || precision > 21) { @@ -250,7 +239,7 @@ Value NumberPrototype::method_toPrecision(SimpleCallContext *ctx) char str[100]; double_conversion::StringBuilder builder(str, sizeof(str)); - double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(thisObject->value.asDouble(), precision, &builder); + double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(v.asDouble(), precision, &builder); QString result = QString::fromLatin1(builder.Finalize()); return Value::fromString(ctx, result); |