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