[PATCH 6/8] jscript: Implement Array.prototype.every.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Fri Apr 15 08:00:26 CDT 2022
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
Tested together with Array.some since they are very similar.
dlls/jscript/array.c | 67 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c
index 309c9c4..17c2c6f 100644
--- a/dlls/jscript/array.c
+++ b/dlls/jscript/array.c
@@ -1057,6 +1057,72 @@ static HRESULT Array_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags
return hres;
}
+static HRESULT Array_every(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv,
+ jsval_t *r)
+{
+ IDispatch *context_obj = NULL, *callback;
+ jsval_t value, args[3], res;
+ BOOL boolval, ret = TRUE;
+ unsigned length, i;
+ jsdisp_t *jsthis;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ hres = get_length(ctx, vthis, &jsthis, &length);
+ if(FAILED(hres))
+ return hres;
+
+ /* FIXME: check IsCallable */
+ if(!argc || !is_object_instance(argv[0])) {
+ FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
+ hres = E_INVALIDARG;
+ goto done;
+ }
+ callback = get_object(argv[0]);
+
+ if(argc > 1 && !is_undefined(argv[1])) {
+ if(!is_object_instance(argv[1])) {
+ FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1]));
+ hres = E_NOTIMPL;
+ goto done;
+ }
+ context_obj = get_object(argv[1]);
+ }
+
+ for(i = 0; i < length; i++) {
+ hres = jsdisp_get_idx(jsthis, i, &value);
+ if(FAILED(hres)) {
+ if(hres == DISP_E_UNKNOWNNAME)
+ continue;
+ goto done;
+ }
+ args[0] = value;
+ args[1] = jsval_number(i);
+ args[2] = jsval_obj(jsthis);
+ hres = disp_call_value(ctx, callback, context_obj, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res);
+ jsval_release(value);
+ if(FAILED(hres))
+ goto done;
+
+ hres = to_boolean(res, &boolval);
+ jsval_release(res);
+ if(FAILED(hres))
+ goto done;
+ if(!boolval) {
+ ret = FALSE;
+ break;
+ }
+ }
+
+ if(r)
+ *r = jsval_bool(ret);
+ hres = S_OK;
+done:
+ jsdisp_release(jsthis);
+ return hres;
+}
+
static HRESULT Array_filter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
@@ -1473,6 +1539,7 @@ static void Array_on_put(jsdisp_t *dispex, const WCHAR *name)
static const builtin_prop_t Array_props[] = {
{L"concat", Array_concat, PROPF_METHOD|1},
+ {L"every", Array_every, PROPF_METHOD|PROPF_ES5|1},
{L"filter", Array_filter, PROPF_METHOD|PROPF_ES5|1},
{L"forEach", Array_forEach, PROPF_METHOD|PROPF_ES5|1},
{L"indexOf", Array_indexOf, PROPF_METHOD|PROPF_ES5|1},
--
2.34.1
More information about the wine-devel
mailing list