Jacek Caban : jscript: Support undefined separator in String.split implementation.
Alexandre Julliard
julliard at winehq.org
Fri Nov 30 14:34:41 CST 2018
Module: wine
Branch: master
Commit: 1fc9b2e93435ec336ba1f921ed2614de224cdbe3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1fc9b2e93435ec336ba1f921ed2614de224cdbe3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Nov 30 16:20:35 2018 +0100
jscript: Support undefined separator in String.split implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/string.c | 25 +++++++++++++++++++-----
dlls/jscript/tests/api.js | 22 ++++++++++++++++++++++
dlls/mshtml/tests/es5.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 89 insertions(+), 6 deletions(-)
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index 7a6133d..79d7884 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -1140,17 +1140,32 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(argc != 1 && argc != 2) {
- FIXME("unsupported argc %u\n", argc);
- return E_NOTIMPL;
- }
-
hres = get_string_flat_val(ctx, jsthis, &jsstr, &str);
if(FAILED(hres))
return hres;
length = jsstr_length(jsstr);
+ if(!argc || (is_undefined(argv[0]) && ctx->version >= SCRIPTLANGUAGEVERSION_ES5)) {
+ if(!r)
+ return S_OK;
+
+ hres = create_array(ctx, 0, &array);
+ if(FAILED(hres))
+ return hres;
+
+ /* NOTE: according to spec, we should respect limit argument here (if provided).
+ * We have a test showing that it's broken in native IE. */
+ hres = jsdisp_propput_idx(array, 0, jsval_string(jsstr));
+ if(FAILED(hres)) {
+ jsdisp_release(array);
+ return hres;
+ }
+
+ *r = jsval_obj(array);
+ return S_OK;
+ }
+
if(argc > 1 && !is_undefined(argv[1])) {
hres = to_uint32(ctx, argv[1], &limit);
if(FAILED(hres)) {
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index f9178a9..ff6a6b7 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -618,6 +618,28 @@ ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
ok(r[2] === "3", "r[1] = " + r[1]);
+r = "1,2,3".split(undefined);
+ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ok(r.length === 1, "r.length = " + r.length);
+ok(r[0] === "1,2,3", "r[0] = " + r[0]);
+
+r = "1,undefined2undefined,3".split(undefined);
+ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ok(r.length === 3, "r.length = " + r.length);
+ok(r[0] === "1,", "r[0] = " + r[0]);
+ok(r[1] === "2", "r[1] = " + r[1]);
+ok(r[2] === ",3", "r[2] = " + r[2]);
+
+r = "1,undefined2undefined,3".split();
+ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ok(r.length === 1, "r.length = " + r.length);
+ok(r[0] === "1,undefined2undefined,3", "r[0] = " + r[0]);
+
+r = "".split();
+ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ok(r.length === 1, "r.length = " + r.length);
+ok(r[0] === "", "r[0] = " + r[0]);
+
tmp = "abcd".indexOf("bc",0);
ok(tmp === 1, "indexOf = " + tmp);
tmp = "abcd".indexOf("bc",1);
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index e4b9557..6097f4c 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -460,6 +460,51 @@ function test_global_properties() {
next_test();
}
+function test_string_split() {
+ var r;
+
+ /* IE9 got this wrong*/
+ if("1undefined2".split(undefined).length != 1) {
+ win_skip("detected broken String.prototype.split implementation");
+ next_test();
+ return;
+ }
+
+ r = "1,2,3".split(undefined);
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 1, "r.length = " + r.length);
+ ok(r[0] === "1,2,3", "r[0] = " + r[0]);
+
+ r = "1,undefined2undefined,3".split(undefined);
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 1, "r.length = " + r.length);
+ ok(r[0] === "1,undefined2undefined,3", "r[0] = " + r[0]);
+
+ r = "1,undefined2undefined,3".split();
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 1, "r.length = " + r.length);
+ ok(r[0] === "1,undefined2undefined,3", "r[0] = " + r[0]);
+
+ /* note: spec violation, limit is ignored */
+ r = "1,undefined2undefined,3".split(undefined, 0);
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 1, "r.length = " + r.length);
+ ok(r[0] === "1,undefined2undefined,3", "r[0] = " + r[0]);
+
+ r = "1,undefined2null,3".split(null);
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 2, "r.length = " + r.length);
+ ok(r[0] === "1,undefined2", "r[0] = " + r[0]);
+ ok(r[1] === ",3", "r[1] = " + r[1]);
+
+ r = "".split();
+ ok(typeof(r) === "object", "typeof(r) = " + typeof(r));
+ ok(r.length === 1, "r.length = " + r.length);
+ ok(r[0] === "", "r[0] = " + r[0]);
+
+ next_test();
+}
+
var tests = [
test_date_now,
test_toISOString,
@@ -469,5 +514,6 @@ var tests = [
test_getOwnPropertyDescriptor,
test_defineProperty,
test_string_trim,
- test_global_properties
+ test_global_properties,
+ test_string_split
];
More information about the wine-cvs
mailing list