Jacek Caban : jscript: Support context argument in Array.prototype.forEach.

Alexandre Julliard julliard at winehq.org
Wed Jun 3 16:40:57 CDT 2020


Module: wine
Branch: master
Commit: f207ded345e5f6a5b834833c1f0de32c451196ba
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f207ded345e5f6a5b834833c1f0de32c451196ba

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jun  3 16:03:47 2020 +0200

jscript: Support context argument in Array.prototype.forEach.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/array.c     | 11 ++++++++---
 dlls/mshtml/tests/es5.js |  6 ++++++
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 9d1014ec0b..f8ae12a7d8 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -949,6 +949,7 @@ static HRESULT Array_toLocaleString(script_ctx_t *ctx, vdisp_t *vthis, WORD flag
 static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
         jsval_t *r)
 {
+    IDispatch *context_obj = NULL, *callback;
     jsval_t value, args[3], res;
     jsdisp_t *jsthis;
     unsigned length, i;
@@ -965,10 +966,14 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
         FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
         return E_INVALIDARG;
     }
+    callback = get_object(argv[0]);
 
     if(argc > 1 && !is_undefined(argv[1])) {
-        FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1]));
-        return E_NOTIMPL;
+        if(!is_object_instance(argv[1]) || !get_object(argv[1])) {
+            FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1]));
+            return E_NOTIMPL;
+        }
+        context_obj = get_object(argv[1]);
     }
 
     for(i = 0; i < length; i++) {
@@ -981,7 +986,7 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
         args[0] = value;
         args[1] = jsval_number(i);
         args[2] = jsval_obj(jsthis);
-        hres = disp_call_value(ctx, get_object(argv[0]), NULL, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res);
+        hres = disp_call_value(ctx, callback, context_obj, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res);
         jsval_release(value);
         if(FAILED(hres))
             return hres;
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 533c35e861..2a8549ba1d 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -116,6 +116,12 @@ function test_array_forEach() {
         ok(this === window, "this != window");
     }, undefined);
 
+    var o = new Object(), a = [1,2];
+    a.forEach(function(value, index, array) {
+        ok(array === a, "array != a");
+        ok(this === o, "this != o");
+    }, o);
+
     next_test();
 }
 




More information about the wine-cvs mailing list