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