Jacek Caban : jscript: Added support for indexed string access.

Alexandre Julliard julliard at winehq.org
Fri Nov 30 13:48:21 CST 2012


Module: wine
Branch: master
Commit: 0e5933f70a5f8ab127cce5ac6cbc4b23ebd84af8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0e5933f70a5f8ab127cce5ac6cbc4b23ebd84af8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 30 13:03:07 2012 +0100

jscript: Added support for indexed string access.

---

 dlls/jscript/string.c      |   33 ++++++++++++++++++++++++++++++++-
 dlls/jscript/tests/api.js  |    3 +++
 dlls/jscript/tests/lang.js |   14 ++++++++++++++
 3 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index c7aaf64..ce5d702 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -1396,6 +1396,35 @@ static void String_destructor(jsdisp_t *dispex)
     heap_free(This);
 }
 
+static unsigned String_idx_length(jsdisp_t *jsdisp)
+{
+    StringInstance *string = (StringInstance*)jsdisp;
+
+    /*
+     * NOTE: For invoke version < 2, indexed array is not implemented at all.
+     * Newer jscript.dll versions implement it on string type, not class,
+     * which is not how it should work according to spec. IE9 implements it
+     * properly, but it uses its own JavaScript engine inside MSHTML. We
+     * implement it here, but in the way IE9 and spec work.
+     */
+    return string->dispex.ctx->version < 2 ? 0 : jsstr_length(string->str);
+}
+
+static HRESULT String_idx_get(jsdisp_t *jsdisp, unsigned idx, jsval_t *r)
+{
+    StringInstance *string = (StringInstance*)jsdisp;
+    jsstr_t *ret;
+
+    TRACE("%p[%u] = %s\n", string, idx, debugstr_wn(string->str->str+idx, 1));
+
+    ret = jsstr_alloc_len(string->str->str+idx, 1);
+    if(!ret)
+        return E_OUTOFMEMORY;
+
+    *r = jsval_string(ret);
+    return S_OK;
+}
+
 static const builtin_prop_t String_props[] = {
     {anchorW,                String_anchor,                PROPF_METHOD|1},
     {bigW,                   String_big,                   PROPF_METHOD},
@@ -1451,7 +1480,9 @@ static const builtin_info_t StringInst_info = {
     sizeof(StringInst_props)/sizeof(*StringInst_props),
     StringInst_props,
     String_destructor,
-    NULL
+    NULL,
+    String_idx_length,
+    String_idx_get
 };
 
 /* ECMA-262 3rd Edition    15.5.3.2 */
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index ce2f153..5f5d009 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -1785,6 +1785,9 @@ function callTest(argc) {
     ok(arguments.length === argc+1, "arguments.length = " + arguments.length + " expected " + (argc+1));
     for(var i=1; i <= argc; i++)
         ok(arguments[i] === i, "arguments[i] = " + arguments[i]);
+    var a = arguments;
+    for(var i=1; i <= argc; i++)
+        ok(a[i] === i, "a[i] = " + a[i]);
 }
 
 callTest.call(tmp, 1, 1);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index 92292a4..5d1bbfa 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1199,6 +1199,20 @@ try {
 }catch(e) {}
 ok(!("prop" in obj), "prop in obj");
 
+if(invokeVersion >= 2) {
+    ok("test"[0] === "t", '"test"[0] = ' + test[0]);
+    ok("test"[5] === undefined, '"test"[0] = ' + test[0]);
+
+    tmp = "test";
+    ok(tmp[1] === "e", "tmp[1] = " + tmp[1]);
+    tmp[1] = "x";
+    ok(tmp[1] === "e", "tmp[1] = " + tmp[1]);
+    ok(tmp["1"] === "e", "tmp['1'] = " + tmp["1"]);
+    ok(tmp["0x1"] === undefined, "tmp['0x1'] = " + tmp["0x1"]);
+}else {
+    ok("test"[0] === undefined, '"test"[0] = ' + test[0]);
+}
+
 ok(isNaN(NaN) === true, "isNaN(NaN) !== true");
 ok(isNaN(0.5) === false, "isNaN(0.5) !== false");
 ok(isNaN(Infinity) === false, "isNaN(Infinity) !== false");




More information about the wine-cvs mailing list