Implement Number.prototype.clz()
authordbatyai.u-szeged@partner.samsung.com <dbatyai.u-szeged@partner.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2014 11:27:13 +0000 (11:27 +0000)
committerdbatyai.u-szeged@partner.samsung.com <dbatyai.u-szeged@partner.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2014 11:27:13 +0000 (11:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=129479

Reviewed by Oliver Hunt.

Source/JavaScriptCore:

Implemented Number.prototype.clz() as specified in the ES6 standard.

* runtime/NumberPrototype.cpp:
(JSC::numberProtoFuncClz):

LayoutTests:

Added/updated tests to account for Number.prototype.clz().

* js/number-clz.html: Added.
* js/number-clz-expected.txt: Added.
* js/Object-getOwnPropertyNames-expected.txt:
* js/script-tests/number-clz.js: Added.
* js/script-tests/Object-getOwnPropertyNames.js:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@165047 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/Object-getOwnPropertyNames-expected.txt
LayoutTests/js/number-clz-expected.txt [new file with mode: 0644]
LayoutTests/js/number-clz.html [new file with mode: 0644]
LayoutTests/js/script-tests/Object-getOwnPropertyNames.js
LayoutTests/js/script-tests/number-clz.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/NumberPrototype.cpp

index af8afea..0371d1f 100644 (file)
@@ -1,3 +1,18 @@
+2014-03-04  Dániel Bátyai  <dbatyai.u-szeged@partner.samsung.com>
+
+        Implement Number.prototype.clz()
+        https://bugs.webkit.org/show_bug.cgi?id=129479
+
+        Reviewed by Oliver Hunt.
+
+        Added/updated tests to account for Number.prototype.clz().
+
+        * js/number-clz.html: Added.
+        * js/number-clz-expected.txt: Added.
+        * js/Object-getOwnPropertyNames-expected.txt:
+        * js/script-tests/number-clz.js: Added.
+        * js/script-tests/Object-getOwnPropertyNames.js:
+
 2014-03-04  Ryosuke Niwa  <rniwa@webkit.org>
 
         REGRESSION(r164856): Use after free in WebCore::QualifiedName::operator== / WebCore::StyledElement::attributeChanged
index ed13584..764a921 100644 (file)
@@ -51,7 +51,7 @@ PASS getSortedOwnPropertyNames(String.prototype) is ['anchor', 'big', 'blink', '
 PASS getSortedOwnPropertyNames(Boolean) is ['length', 'name', 'prototype']
 PASS getSortedOwnPropertyNames(Boolean.prototype) is ['constructor', 'toString', 'valueOf']
 PASS getSortedOwnPropertyNames(Number) is ['MAX_VALUE', 'MIN_VALUE', 'NEGATIVE_INFINITY', 'NaN', 'POSITIVE_INFINITY', 'length', 'name', 'prototype']
-PASS getSortedOwnPropertyNames(Number.prototype) is ['constructor', 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision', 'toString', 'valueOf']
+PASS getSortedOwnPropertyNames(Number.prototype) is ['clz', 'constructor', 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision', 'toString', 'valueOf']
 PASS getSortedOwnPropertyNames(Date) is ['UTC', 'length', 'name', 'now', 'parse', 'prototype']
 PASS getSortedOwnPropertyNames(Date.prototype) is ['constructor', 'getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'toDateString', 'toGMTString', 'toISOString', 'toJSON', 'toLocaleDateString', 'toLocaleString', 'toLocaleTimeString', 'toString', 'toTimeString', 'toUTCString', 'valueOf']
 PASS getSortedOwnPropertyNames(RegExp) is ['$&', "$'", '$*', '$+', '$1', '$2', '$3', '$4', '$5', '$6', '$7', '$8', '$9', '$_', '$`', 'input', 'lastMatch', 'lastParen', 'leftContext', 'length', 'multiline', 'name', 'prototype', 'rightContext']
diff --git a/LayoutTests/js/number-clz-expected.txt b/LayoutTests/js/number-clz-expected.txt
new file mode 100644 (file)
index 0000000..41e74bf
--- /dev/null
@@ -0,0 +1,15 @@
+PASS Number(Infinity).clz() is Infinity
+PASS Number(-Infinity).clz() is -Infinity
+PASS Number(NaN).clz() is NaN
+PASS Number(0).clz() is 32
+PASS Number(1).clz() is 31
+PASS Number(2147483648).clz() is 0
+PASS Number(2147483647).clz() is 1
+PASS Number(1073741824).clz() is 1
+PASS Number(1073741823).clz() is 2
+PASS Number(32768).clz() is 16
+PASS Number(32767).clz() is 17
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/js/number-clz.html b/LayoutTests/js/number-clz.html
new file mode 100644 (file)
index 0000000..e3abc08
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/number-clz.js"></script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
index f6f725f..99c4e39 100644 (file)
@@ -59,7 +59,7 @@ var expectedPropertyNamesSet = {
     "Boolean": "['length', 'name', 'prototype']",
     "Boolean.prototype": "['constructor', 'toString', 'valueOf']",
     "Number": "['MAX_VALUE', 'MIN_VALUE', 'NEGATIVE_INFINITY', 'NaN', 'POSITIVE_INFINITY', 'length', 'name', 'prototype']",
-    "Number.prototype": "['constructor', 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision', 'toString', 'valueOf']",
+    "Number.prototype": "['clz', 'constructor', 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision', 'toString', 'valueOf']",
     "Date": "['UTC', 'length', 'name', 'now', 'parse', 'prototype']",
     "Date.prototype": "['constructor', 'getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'toDateString', 'toGMTString', 'toISOString', 'toJSON', 'toLocaleDateString', 'toLocaleString', 'toLocaleTimeString', 'toString', 'toTimeString', 'toUTCString', 'valueOf']",
     "RegExp": "['$&', \"$'\", '$*', '$+', '$1', '$2', '$3', '$4', '$5', '$6', '$7', '$8', '$9', '$_', '$`', 'input', 'lastMatch', 'lastParen', 'leftContext', 'length', 'multiline', 'name', 'prototype', 'rightContext']",
diff --git a/LayoutTests/js/script-tests/number-clz.js b/LayoutTests/js/script-tests/number-clz.js
new file mode 100644 (file)
index 0000000..69b267f
--- /dev/null
@@ -0,0 +1,11 @@
+shouldBe("Number(Infinity).clz()","Infinity");
+shouldBe("Number(-Infinity).clz()","-Infinity");
+shouldBe("Number(NaN).clz()","NaN");
+shouldBe("Number(0).clz()","32");
+shouldBe("Number(1).clz()","31");
+shouldBe("Number(2147483648).clz()","0");
+shouldBe("Number(2147483647).clz()","1");
+shouldBe("Number(1073741824).clz()","1");
+shouldBe("Number(1073741823).clz()","2");
+shouldBe("Number(32768).clz()","16");
+shouldBe("Number(32767).clz()","17");
index c74ee79..386af87 100644 (file)
@@ -1,3 +1,15 @@
+2014-03-04  Dániel Bátyai  <dbatyai.u-szeged@partner.samsung.com>
+
+        Implement Number.prototype.clz()
+        https://bugs.webkit.org/show_bug.cgi?id=129479
+
+        Reviewed by Oliver Hunt.
+
+        Implemented Number.prototype.clz() as specified in the ES6 standard.
+
+        * runtime/NumberPrototype.cpp:
+        (JSC::numberProtoFuncClz):
+
 2014-03-03  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Avoid too early deref caused by RemoteInspectorXPCConnection::close
index 6482241..4ba34c1 100644 (file)
@@ -48,6 +48,7 @@ static EncodedJSValue JSC_HOST_CALL numberProtoFuncValueOf(ExecState*);
 static EncodedJSValue JSC_HOST_CALL numberProtoFuncToFixed(ExecState*);
 static EncodedJSValue JSC_HOST_CALL numberProtoFuncToExponential(ExecState*);
 static EncodedJSValue JSC_HOST_CALL numberProtoFuncToPrecision(ExecState*);
+static EncodedJSValue JSC_HOST_CALL numberProtoFuncClz(ExecState*);
 
 }
 
@@ -65,6 +66,7 @@ const ClassInfo NumberPrototype::s_info = { "Number", &NumberObject::s_info, 0,
   toFixed           numberProtoFuncToFixed          DontEnum|Function 1
   toExponential     numberProtoFuncToExponential    DontEnum|Function 1
   toPrecision       numberProtoFuncToPrecision      DontEnum|Function 1
+  clz               numberProtoFuncClz              DontEnum|Function 1
 @end
 */
 
@@ -450,6 +452,41 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToPrecision(ExecState* exec)
     return JSValue::encode(jsString(exec, String(numberToFixedPrecisionString(x, significantFigures, buffer))));
 }
 
+#if !COMPILER(GCC) && !COMPILER(CLANG)
+static inline int clz(uint32_t number)
+{
+    int zeroCount = 0;
+    for (int i = 31; i >= 0; i--) {
+        if (!(number >> i))
+            zeroCount++;
+        else
+            break;
+    }
+    return zeroCount;
+}
+#endif
+
+EncodedJSValue JSC_HOST_CALL numberProtoFuncClz(ExecState* exec)
+{
+    double x;
+    if (!toThisNumber(exec->hostThisValue(), x))
+        return throwVMTypeError(exec);
+
+    if (!std::isfinite(x))
+        return JSValue::encode(JSValue(x));
+
+    uint32_t number = toUInt32(x);
+#if COMPILER(GCC) || COMPILER(CLANG)
+    int zeroCount = 32;
+    if (number)
+        zeroCount = __builtin_clz(number);
+
+    return JSValue::encode(JSValue(zeroCount));
+#else
+    return JSValue::encode(JSValue(clz(number)));
+#endif
+}
+
 static inline int32_t extractRadixFromArgs(ExecState* exec)
 {
     JSValue radixValue = exec->argument(0);