Clean up toUInt16 and fix a small typo in toUInt32
authorLars Knoll <lars.knoll@digia.com>
Wed, 17 Oct 2012 20:52:46 +0000 (22:52 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Wed, 17 Oct 2012 20:56:18 +0000 (22:56 +0200)
Change-Id: I49e57cb8eed83237d8b2477297e429cd38d07c19
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
qmljs_runtime.cpp
qmljs_runtime.h

index f86f889..3c9ca10 100644 (file)
@@ -137,7 +137,7 @@ unsigned int Value::toUInt32(double number)
 {
     const double D32 = 4294967296.0;
     if ((number >= 0 && number < D32))
-        return static_cast<int>(number);
+        return static_cast<uint>(number);
 
     if (!std::isfinite(number))
         return +0;
index 643165c..c821010 100644 (file)
@@ -777,15 +777,23 @@ inline unsigned __qmljs_to_uint32(Value value, Context *ctx)
 
 inline unsigned short __qmljs_to_uint16(Value value, Context *ctx)
 {
+    if (value.isInteger())
+        return (ushort)(uint)value.integerValue();
+
     double number = __qmljs_to_number(value, ctx);
-    if (! number || qIsNaN(number) || std::isinf(number))
+
+    double D16 = 65536.0;
+    if ((number >= 0 && number < D16))
+        return static_cast<ushort>(number);
+
+    if (!std::isfinite(number))
         return +0;
 
-    double sign = (number < 0) ? -1.0 : 1.0;
-    double abs_n = ::fabs(number);
+    double d = ::floor(::fabs(number));
+    if (std::signbit(number))
+        d = -d;
 
-    double D16 = 65536.0;
-    number = ::fmod(sign * ::floor(abs_n), D16);
+    number = ::fmod(d , D16);
 
     if (number < 0)
         number += D16;