Module: wine Branch: master Commit: 6682290d17bffca101a8150a4427dcec9371852a URL: https://source.winehq.org/git/wine.git/?a=commit;h=6682290d17bffca101a8150a4...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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,