Jacek Caban : jscript: Fixed sort_cmp for non-string arguments.
Alexandre Julliard
julliard at winehq.org
Mon Jul 19 11:05:30 CDT 2010
Module: wine
Branch: master
Commit: adb4e83eb286c085454f3d7e83016c10ca22b2b3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=adb4e83eb286c085454f3d7e83016c10ca22b2b3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Jul 18 12:39:29 2010 +0200
jscript: Fixed sort_cmp for non-string arguments.
---
dlls/jscript/array.c | 44 +++++++++++++++++++++++---------------------
dlls/jscript/tests/api.js | 21 +++++++++++++++++++++
2 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 1268d59..5c1bf12 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -677,29 +677,31 @@ static HRESULT sort_cmp(script_ctx_t *ctx, DispatchEx *cmp_func, VARIANT *v1, VA
*cmp = V_I4(&tmp);
else
*cmp = V_R8(&tmp) > 0.0 ? 1 : -1;
- }else if(is_num_vt(V_VT(v1))) {
- if(is_num_vt(V_VT(v2))) {
- DOUBLE d = num_val(v1)-num_val(v2);
- if(d > 0.0)
- *cmp = 1;
- else if(d < -0.0)
- *cmp = -1;
- else
- *cmp = 0;
- }else {
- *cmp = -1;
- }
- }else if(is_num_vt(V_VT(v2))) {
- *cmp = 1;
- }else if(V_VT(v1) == VT_BSTR) {
- if(V_VT(v2) == VT_BSTR)
- *cmp = strcmpW(V_BSTR(v1), V_BSTR(v2));
+ }else if(V_VT(v1) == VT_EMPTY) {
+ *cmp = V_VT(v2) == VT_EMPTY ? 0 : 1;
+ }else if(V_VT(v2) == VT_EMPTY) {
+ *cmp = -1;
+ }else if(is_num_vt(V_VT(v1)) && is_num_vt(V_VT(v2))) {
+ DOUBLE d = num_val(v1)-num_val(v2);
+ if(d > 0.0)
+ *cmp = 1;
else
- *cmp = -1;
- }else if(V_VT(v2) == VT_BSTR) {
- *cmp = 1;
+ *cmp = d < -0.0 ? -1 : 0;
}else {
- *cmp = 0;
+ BSTR x, y;
+
+ hres = to_string(ctx, v1, ei, &x);
+ if(FAILED(hres))
+ return hres;
+
+ hres = to_string(ctx, v2, ei, &y);
+ if(SUCCEEDED(hres)) {
+ *cmp = strcmpW(x, y);
+ SysFreeString(y);
+ }
+ SysFreeString(x);
+ if(FAILED(hres))
+ return hres;
}
return S_OK;
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 2ccad3d..e05e5bb 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -704,6 +704,27 @@ tmp = arr.sort();
ok(arr === tmp, "tmp !== arr");
ok(arr[0]===1 && arr[1]==="aa" && arr[2]===undefined, "arr is sorted incorectly");
+tmp = [["bb","aa"],["ab","aa"]].sort().toString();
+ok(tmp === "ab,aa,bb,aa", "sort() = " + tmp);
+
+tmp = [["bb","aa"],"ab"].sort().toString();
+ok(tmp === "ab,bb,aa", "sort() = " + tmp);
+
+tmp = [["bb","aa"],"cc"].sort().toString();
+ok(tmp === "bb,aa,cc", "sort() = " + tmp);
+
+tmp = [2,"1"].sort().toString();
+ok(tmp === "1,2", "sort() = " + tmp);
+
+tmp = ["2",1].sort().toString();
+ok(tmp === "1,2", "sort() = " + tmp);
+
+tmp = [,,0,"z"].sort().toString();
+ok(tmp === "0,z,,", "sort() = " + tmp);
+
+tmp = ["a,b",["a","a"],["a","c"]].sort().toString();
+ok(tmp === "a,a,a,b,a,c", "sort() = " + tmp);
+
arr = ["1", "2", "3"];
arr.length = 1;
ok(arr.length === 1, "arr.length = " + arr.length);
More information about the wine-cvs
mailing list