Jacek Caban : jscript: Support ES5 Array.prototype.sort arguments handling.

Alexandre Julliard julliard at winehq.org
Wed Jun 3 16:40:57 CDT 2020


Module: wine
Branch: master
Commit: 6682290d17bffca101a8150a4427dcec9371852a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6682290d17bffca101a8150a4427dcec9371852a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jun  3 16:03:27 2020 +0200

jscript: Support ES5 Array.prototype.sort arguments handling.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/array.c      | 33 ++++++++++++++++-----------------
 dlls/jscript/tests/api.js | 13 +++++++++++++
 dlls/mshtml/tests/es5.js  | 20 ++++++++++++++++++++
 3 files changed, 49 insertions(+), 17 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 55b7dd5d71..9d1014ec0b 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -685,23 +685,22 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne
     if(FAILED(hres))
         return hres;
 
-    if(argc > 1) {
-        WARN("invalid arg_cnt %d\n", argc);
-        return E_FAIL;
-    }
-
-    if(argc == 1) {
-        if(!is_object_instance(argv[0])) {
-            WARN("arg is not dispatch\n");
-            return E_FAIL;
-        }
-
-        cmp_func = iface_to_jsdisp(get_object(argv[0]));
-        if(!cmp_func || !is_class(cmp_func, JSCLASS_FUNCTION)) {
-            WARN("cmp_func is not a function\n");
-            if(cmp_func)
-                jsdisp_release(cmp_func);
-            return E_FAIL;
+    if(argc >= 1) {
+        if(is_object_instance(argv[0])) {
+            if(argc > 1 && ctx->version < SCRIPTLANGUAGEVERSION_ES5) {
+                WARN("invalid arg_cnt %d\n", argc);
+                return JS_E_JSCRIPT_EXPECTED;
+            }
+            cmp_func = iface_to_jsdisp(get_object(argv[0]));
+            if(!cmp_func || !is_class(cmp_func, JSCLASS_FUNCTION)) {
+                WARN("cmp_func is not a function\n");
+                if(cmp_func)
+                    jsdisp_release(cmp_func);
+                return JS_E_JSCRIPT_EXPECTED;
+            }
+        }else if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5 ? !is_undefined(argv[0]) : !is_null(argv[0])) {
+            WARN("invalid arg %s\n", debugstr_jsval(argv[0]));
+            return JS_E_JSCRIPT_EXPECTED;
         }
     }
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index df6ff785d0..74cf0ae357 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -1039,6 +1039,19 @@ tmp = [5,3,"2.5",2,true,false,-1];
 for(var i=0; i < arr.length; i++)
     ok(arr[i] === tmp[i], "arr[" + i + "] = " + arr[i] + " expected " + tmp[i]);
 
+tmp = [3,1,2].sort(function(x,y) { return y-x; }).join();
+ok(tmp === "3,2,1", "reverse sorted [3,1,2] = " + tmp);
+
+tmp = [3,1,2].sort(null).join();
+ok(tmp === "1,2,3", "null sorted [3,1,2] = " + tmp);
+
+try {
+    tmp = [3,1,2].sort(function(x,y) { return y-x; }, 1, 2, 3);
+    ok(false, "expected sort(undefined) exception");
+} catch(e) {
+    ok(e.name === "TypeError", "got exception " + e.name);
+}
+
 arr = [5,false,2,0,"abc",3,"a",-1];
 tmp = arr.sort();
 ok(tmp === arr, "tmp !== arr");
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index a24f61fcd5..533c35e861 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -188,6 +188,25 @@ function test_array_map() {
     next_test();
 }
 
+function test_array_sort() {
+    var r;
+
+    r = [3,1,2].sort(function(x,y) { return y-x; }, 1, 2, 3, true, undefined ).join();
+    ok(r === "3,2,1", "reverse sorted [3,1,2] = " + r);
+
+    r = [3,1,2].sort(undefined).join();
+    ok(r === "1,2,3", "null sorted [3,1,2] = " + r);
+
+    try {
+        r = [3,1,2].sort(null);
+        ok(false, "expected sort(null) exception");
+    }catch(e) {
+        ok(e.name === "TypeError", "got exception " + e.name);
+    }
+
+    next_test();
+}
+
 function test_identifier_keywords() {
     var o = {
         if: 1,
@@ -883,6 +902,7 @@ var tests = [
     test_array_forEach,
     test_isArray,
     test_array_map,
+    test_array_sort,
     test_identifier_keywords,
     test_getOwnPropertyDescriptor,
     test_defineProperty,




More information about the wine-cvs mailing list