aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-09-07 22:40:51 +0200
committerLars Knoll <lars.knoll@qt.io>2018-09-08 09:56:09 +0000
commit45f9eaae461bcf6aad79c3957334990771b5caf4 (patch)
tree9087ce3283be7552175ff3dac48cb1a68482c522
parent63407a01ebf67c7383aea385ac6b4ccb734d96a1 (diff)
Fix test failures in Number
Change-Id: I0743e9d7fdda0be7a8bb4f9fe3b8e195722c1c90 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/qv4numberobject.cpp42
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations9
2 files changed, 28 insertions, 23 deletions
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp
index d552948e95..c444ce1929 100644
--- a/src/qml/jsruntime/qv4numberobject.cpp
+++ b/src/qml/jsruntime/qv4numberobject.cpp
@@ -150,7 +150,7 @@ inline double thisNumber(ExecutionEngine *engine, const Value *thisObject)
ReturnedValue NumberPrototype::method_isFinite(const FunctionObject *, const Value *, const Value *argv, int argc)
{
- if (!argc)
+ if (!argc || !argv[0].isNumber())
return Encode(false);
double v = argv[0].toNumber();
@@ -193,7 +193,7 @@ ReturnedValue NumberPrototype::method_isSafeInteger(const FunctionObject *, cons
ReturnedValue NumberPrototype::method_isNaN(const FunctionObject *, const Value *, const Value *argv, int argc)
{
- if (!argc)
+ if (!argc || !argv[0].isNumber())
return Encode(false);
double v = argv[0].toNumber();
@@ -282,7 +282,7 @@ ReturnedValue NumberPrototype::method_toFixed(const FunctionObject *b, const Val
if (std::isnan(fdigits))
fdigits = 0;
- if (fdigits < 0 || fdigits > 20)
+ if (fdigits < 0 || fdigits > 100)
return v4->throwRangeError(*thisObject);
QString str;
@@ -305,16 +305,21 @@ ReturnedValue NumberPrototype::method_toExponential(const FunctionObject *b, con
if (v4->hasException)
return QV4::Encode::undefined();
+ bool defaultDigits = !argc || argv[0].isUndefined();
+ int fdigits = !defaultDigits ? argv[0].toInteger() : NumberLocale::instance()->defaultDoublePrecision;
+ if (v4->hasException)
+ return QV4::Encode::undefined();
- int fdigits = NumberLocale::instance()->defaultDoublePrecision;
+ if (std::isnan(d))
+ return Encode(v4->newString(QLatin1String("NaN")));
- if (argc && !argv[0].isUndefined()) {
- fdigits = argv[0].toInt32();
- if (fdigits < 0 || fdigits > 20) {
- Scope scope(v4);
- ScopedString error(scope, v4->newString(QStringLiteral("Number.prototype.toExponential: fractionDigits out of range")));
- return v4->throwRangeError(error);
- }
+ if (qIsInf(d))
+ return Encode(v4->newString(QLatin1String(d < 0 ? "-Infinity" : "Infinity")));
+
+ if (!defaultDigits && (fdigits < 0 || fdigits > 100)) {
+ Scope scope(v4);
+ ScopedString error(scope, v4->newString(QStringLiteral("Number.prototype.toExponential: fractionDigits out of range")));
+ return v4->throwRangeError(error);
}
QString result = NumberLocale::instance()->toString(d, 'e', fdigits);
@@ -327,17 +332,26 @@ ReturnedValue NumberPrototype::method_toPrecision(const FunctionObject *b, const
ScopedValue v(scope, thisNumberValue(scope.engine, thisObject));
if (scope.engine->hasException)
return QV4::Encode::undefined();
-
+ double d = v->asDouble();
if (!argc || argv[0].isUndefined())
return Encode(v->toString(scope.engine));
int precision = argv[0].toInt32();
- if (precision < 1 || precision > 21) {
+ if (scope.engine->hasException)
+ return QV4::Encode::undefined();
+
+ if (std::isnan(d))
+ return Encode(scope.engine->newString(QLatin1String("NaN")));
+
+ if (qIsInf(d))
+ return Encode(scope.engine->newString(QLatin1String(d < 0 ? "-Infinity" : "Infinity")));
+
+ if (precision < 1 || precision > 100) {
ScopedString error(scope, scope.engine->newString(QStringLiteral("Number.prototype.toPrecision: precision out of range")));
return scope.engine->throwRangeError(error);
}
- QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision);
+ QString result = NumberLocale::instance()->toString(d, 'g', precision);
return Encode(scope.engine->newString(result));
}
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index 72ec8acdb2..d1740e5147 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -195,16 +195,7 @@ built-ins/JSON/stringify/value-proxy.js fails
built-ins/Map/proto-from-ctor-realm.js fails
built-ins/Map/prototype/forEach/iterates-values-deleted-then-readded.js fails
built-ins/Math/round/S15.8.2.15_A7.js fails
-built-ins/Number/isFinite/arg-is-not-number.js fails
-built-ins/Number/isNaN/arg-is-not-number.js fails
built-ins/Number/proto-from-ctor-realm.js fails
-built-ins/Number/prototype/toExponential/infinity.js fails
-built-ins/Number/prototype/toExponential/nan.js fails
-built-ins/Number/prototype/toExponential/range.js fails
-built-ins/Number/prototype/toFixed/range.js fails
-built-ins/Number/prototype/toPrecision/infinity.js fails
-built-ins/Number/prototype/toPrecision/nan.js fails
-built-ins/Number/prototype/toPrecision/range.js fails
built-ins/Number/prototype/toPrecision/return-values.js fails
built-ins/Number/string-binary-literal.js fails
built-ins/Number/string-hex-literal-invalid.js fails