From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/jsregexp.c | 14 ++++++++------ dlls/jscript/tests/api.js | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c index fa4759b972d..1cbc828ce09 100644 --- a/dlls/jscript/jsregexp.c +++ b/dlls/jscript/jsregexp.c @@ -585,7 +585,7 @@ static const builtin_info_t RegExpInst_info = { NULL };
-static HRESULT alloc_regexp(script_ctx_t *ctx, jsdisp_t *object_prototype, RegExpInstance **ret) +static HRESULT alloc_regexp(script_ctx_t *ctx, jsstr_t *str, jsdisp_t *object_prototype, RegExpInstance **ret) { RegExpInstance *regexp; HRESULT hres; @@ -604,6 +604,9 @@ static HRESULT alloc_regexp(script_ctx_t *ctx, jsdisp_t *object_prototype, RegEx return hres; }
+ regexp->str = jsstr_addref(str); + regexp->last_index_val = jsval_number(0); + *ret = regexp; return S_OK; } @@ -620,13 +623,10 @@ HRESULT create_regexp(script_ctx_t *ctx, jsstr_t *src, DWORD flags, jsdisp_t **r
TRACE("%s %lx\n", debugstr_wn(str, jsstr_length(src)), flags);
- hres = alloc_regexp(ctx, NULL, ®exp); + hres = alloc_regexp(ctx, src, NULL, ®exp); if(FAILED(hres)) return hres;
- regexp->str = jsstr_addref(src); - regexp->last_index_val = jsval_number(0); - regexp->jsregexp = regexp_new(ctx, &ctx->tmp_heap, str, jsstr_length(regexp->str), flags, FALSE); if(!regexp->jsregexp) { WARN("regexp_new failed\n"); @@ -959,10 +959,12 @@ static const builtin_info_t RegExpConstr_info = {
HRESULT create_regexp_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret) { + jsstr_t *str = jsstr_empty(); RegExpInstance *regexp; HRESULT hres;
- hres = alloc_regexp(ctx, object_prototype, ®exp); + hres = alloc_regexp(ctx, str, object_prototype, ®exp); + jsstr_release(str); if(FAILED(hres)) return hres;
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index c33791f1fb1..a3b2bbcbba5 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -335,6 +335,8 @@ ok(obj.hasOwnProperty('source'), "obj.hasOwnProperty('source') is false"); ok(!RegExp.hasOwnProperty('exec'), "RegExp.hasOwnProperty('exec') is true"); ok(!RegExp.hasOwnProperty('source'), "RegExp.hasOwnProperty('source') is true"); ok(RegExp.prototype.hasOwnProperty('source'), "RegExp.prototype.hasOwnProperty('source') is false"); +ok(RegExp.prototype.source === "", "RegExp.prototype.source = " + RegExp.prototype.source); +ok(RegExp.prototype.lastIndex === 0, "RegExp.prototype.lastIndex = " + RegExp.prototype.lastIndex);
String(); new String();
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/array.c | 2 +- dlls/jscript/dispex.c | 18 ++++++++++-------- dlls/jscript/function.c | 9 ++------- dlls/jscript/jscript.h | 4 ++-- dlls/jscript/json.c | 2 +- dlls/jscript/string.c | 2 +- 6 files changed, 17 insertions(+), 20 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index db92a6fe109..80ccfcacb73 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -631,7 +631,7 @@ static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, jsval_t v1, jsval jsval_t res; double n;
- hres = jsdisp_call_value(cmp_func, NULL, DISPATCH_METHOD, 2, args, &res); + hres = jsdisp_call_value(cmp_func, jsval_undefined(), DISPATCH_METHOD, 2, args, &res); if(FAILED(hres)) return hres;
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 699e4c87b52..87b1d245aa7 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -462,7 +462,7 @@ static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, jsval_t *r) break; case PROP_ACCESSOR: if(prop->u.accessor.getter) { - hres = jsdisp_call_value(prop->u.accessor.getter, to_disp(This), + hres = jsdisp_call_value(prop->u.accessor.getter, jsval_obj(This), DISPATCH_METHOD, 0, NULL, r); }else { *r = jsval_undefined(); @@ -529,7 +529,7 @@ static HRESULT prop_put(jsdisp_t *This, dispex_prop_t *prop, jsval_t val) TRACE("no setter\n"); return S_OK; } - return jsdisp_call_value(prop->u.accessor.setter, to_disp(This), DISPATCH_METHOD, 1, &val, NULL); + return jsdisp_call_value(prop->u.accessor.setter, jsval_obj(This), DISPATCH_METHOD, 1, &val, NULL); case PROP_IDX: if(!This->builtin_info->idx_put) { TRACE("no put_idx\n"); @@ -1602,16 +1602,18 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc case DISPATCH_METHOD: case DISPATCH_CONSTRUCT: { jsval_t *argv, buf[6], r; + IDispatch *passed_this; unsigned argc;
hres = convert_params(This->ctx, pdp, buf, &argc, &argv); if(FAILED(hres)) break;
+ passed_this = get_this(pdp); if(prop) - hres = invoke_prop_func(This, get_this(pdp), prop, wFlags, argc, argv, pvarRes ? &r : NULL, pspCaller); + hres = invoke_prop_func(This, passed_this, prop, wFlags, argc, argv, pvarRes ? &r : NULL, pspCaller); else - hres = jsdisp_call_value(This, get_this(pdp), wFlags, argc, argv, pvarRes ? &r : NULL); + hres = jsdisp_call_value(This, passed_this ? jsval_disp(passed_this) : jsval_undefined(), wFlags, argc, argv, pvarRes ? &r : NULL);
if(argv != buf) free(argv); @@ -1991,14 +1993,14 @@ HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID * return DISP_E_UNKNOWNNAME; }
-HRESULT jsdisp_call_value(jsdisp_t *jsfunc, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +HRESULT jsdisp_call_value(jsdisp_t *jsfunc, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { HRESULT hres;
assert(!(flags & ~(DISPATCH_METHOD|DISPATCH_CONSTRUCT|DISPATCH_JSCRIPT_INTERNAL_MASK)));
if(is_class(jsfunc, JSCLASS_FUNCTION)) { - hres = Function_invoke(jsfunc, jsthis, flags, argc, argv, r); + hres = Function_invoke(jsfunc, vthis, flags, argc, argv, r); }else { if(!jsfunc->builtin_info->call) { WARN("Not a function\n"); @@ -2009,7 +2011,7 @@ HRESULT jsdisp_call_value(jsdisp_t *jsfunc, IDispatch *jsthis, WORD flags, unsig return E_UNEXPECTED;
flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK; - hres = jsfunc->builtin_info->call(jsfunc->ctx, jsthis ? jsval_disp(jsthis) : jsval_null(), flags, argc, argv, r); + hres = jsfunc->builtin_info->call(jsfunc->ctx, vthis, flags, argc, argv, r); } return hres; } @@ -2202,7 +2204,7 @@ HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, IDispatch *jsthis, W
jsdisp = iface_to_jsdisp(disp); if(jsdisp && jsdisp->ctx == ctx) { - hres = jsdisp_call_value(jsdisp, jsthis, flags, argc, argv, r); + hres = jsdisp_call_value(jsdisp, jsthis ? jsval_disp(jsthis) : jsval_undefined(), flags, argc, argv, r); jsdisp_release(jsdisp); return hres; } diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index ef76766df7d..2a03fdd07ae 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -247,12 +247,11 @@ void detach_arguments_object(jsdisp_t *args_disp) jsdisp_release(frame->arguments_obj); }
-HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +HRESULT Function_invoke(jsdisp_t *func_this, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; - jsval_t vthis;
- TRACE("func %p this %p\n", func_this, jsthis); + TRACE("func %p this %s\n", func_this, debugstr_jsval(vthis));
assert(is_class(func_this, JSCLASS_FUNCTION)); function = function_from_jsdisp(func_this); @@ -262,10 +261,6 @@ HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsi return E_UNEXPECTED; }
- if(jsthis) - vthis = jsval_disp(jsthis); - else - vthis = function->dispex.ctx->version < SCRIPTLANGUAGEVERSION_ES5 ? jsval_null() : jsval_undefined(); return function->vtbl->call(function->dispex.ctx, function, vthis, flags, argc, argv, r); }
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index c46dd6ed682..48d7542e3cc 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -226,7 +226,7 @@ HRESULT init_dispex_from_constr(jsdisp_t*,script_ctx_t*,const builtin_info_t*,js HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT disp_call_name(script_ctx_t*,IDispatch*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT disp_call_value(script_ctx_t*,IDispatch*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; -HRESULT jsdisp_call_value(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; +HRESULT jsdisp_call_value(jsdisp_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT jsdisp_call(jsdisp_t*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT jsdisp_call_name(jsdisp_t*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT disp_propget(script_ctx_t*,IDispatch*,DISPID,jsval_t*) DECLSPEC_HIDDEN; @@ -255,7 +255,7 @@ HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,cons jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT create_builtin_constructor(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD, jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN; -HRESULT Function_invoke(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; +HRESULT Function_invoke(jsdisp_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT Function_value(script_ctx_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT Function_get_value(script_ctx_t*,jsdisp_t*,jsval_t*) DECLSPEC_HIDDEN; diff --git a/dlls/jscript/json.c b/dlls/jscript/json.c index 005422be426..a595a778324 100644 --- a/dlls/jscript/json.c +++ b/dlls/jscript/json.c @@ -775,7 +775,7 @@ static HRESULT stringify(stringify_ctx_t *ctx, jsdisp_t *object, const WCHAR *na } args[0] = jsval_string(name_str); args[1] = value; - hres = jsdisp_call_value(ctx->replacer, to_disp(object), DISPATCH_METHOD, ARRAY_SIZE(args), args, &v); + hres = jsdisp_call_value(ctx->replacer, jsval_obj(object), DISPATCH_METHOD, ARRAY_SIZE(args), args, &v); jsstr_release(name_str); jsval_release(value); if(FAILED(hres)) diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 254ead61eef..14bcfbdaaf3 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -702,7 +702,7 @@ static HRESULT rep_call(script_ctx_t *ctx, jsdisp_t *func, }
if(SUCCEEDED(hres)) - hres = jsdisp_call_value(func, NULL, DISPATCH_METHOD, argc, argv, &val); + hres = jsdisp_call_value(func, jsval_undefined(), DISPATCH_METHOD, argc, argv, &val);
for(i=0; i <= match->paren_count; i++) jsstr_release(get_string(argv[i]));
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/array.c | 37 +++++++++++++++++++++---------------- dlls/jscript/dispex.c | 18 ++++++++++++++---- dlls/jscript/engine.c | 10 +++++----- dlls/jscript/function.c | 3 +-- dlls/jscript/jscript.h | 2 +- dlls/jscript/json.c | 2 +- dlls/jscript/set.c | 7 +++---- 7 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index 80ccfcacb73..27d85fdb22b 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -1026,9 +1026,10 @@ static HRESULT Array_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags 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 context_this = jsval_undefined(); jsval_t value, args[3], res; BOOL boolval, ret = TRUE; + IDispatch *callback; unsigned length, i; jsdisp_t *jsthis; HRESULT hres; @@ -1053,7 +1054,7 @@ static HRESULT Array_every(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigne hres = E_NOTIMPL; goto done; } - context_obj = get_object(argv[1]); + context_this = argv[1]; }
for(i = 0; i < length; i++) { @@ -1066,7 +1067,7 @@ static HRESULT Array_every(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigne 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); + hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); jsval_release(value); if(FAILED(hres)) goto done; @@ -1092,10 +1093,11 @@ done: static HRESULT Array_filter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - IDispatch *context_obj = NULL, *callback; + jsval_t context_this = jsval_undefined(); jsval_t value, args[3], res; unsigned length, i, j = 0; jsdisp_t *jsthis, *arr; + IDispatch *callback; HRESULT hres; BOOL boolval;
@@ -1119,7 +1121,7 @@ static HRESULT Array_filter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsign hres = E_NOTIMPL; goto done; } - context_obj = get_object(argv[1]); + context_this = argv[1]; }
hres = create_array(ctx, 0, &arr); @@ -1138,7 +1140,7 @@ static HRESULT Array_filter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsign 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); + hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); if(SUCCEEDED(hres)) { hres = to_boolean(res, &boolval); jsval_release(res); @@ -1166,8 +1168,9 @@ done: static HRESULT Array_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - IDispatch *context_obj = NULL, *callback; + jsval_t context_this = jsval_undefined(); jsval_t value, args[3], res; + IDispatch *callback; jsdisp_t *jsthis; unsigned length, i; HRESULT hres; @@ -1192,7 +1195,7 @@ static HRESULT Array_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsig hres = E_NOTIMPL; goto done; } - context_obj = get_object(argv[1]); + context_this = argv[1]; }
for(i = 0; i < length; i++) { @@ -1205,7 +1208,7 @@ static HRESULT Array_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsig 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); + hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); jsval_release(value); if(FAILED(hres)) goto done; @@ -1341,9 +1344,10 @@ done:
static HRESULT Array_map(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - IDispatch *context_this = NULL, *callback; + jsval_t context_this = jsval_undefined(); jsval_t callback_args[3], mapped_value; jsdisp_t *jsthis, *array; + IDispatch *callback; UINT32 length, k; HRESULT hres;
@@ -1365,7 +1369,7 @@ static HRESULT Array_map(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned
if(argc > 1) { if(is_object_instance(argv[1])) { - context_this = get_object(argv[1]); + context_this = argv[1]; }else if(!is_undefined(argv[1])) { FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); hres = E_NOTIMPL; @@ -1407,9 +1411,9 @@ done:
static HRESULT Array_reduce(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - IDispatch *context_this = NULL, *callback; jsval_t callback_args[4], acc, new_acc; BOOL have_value = FALSE; + IDispatch *callback; jsdisp_t *jsthis; UINT32 length, k; HRESULT hres; @@ -1453,7 +1457,7 @@ static HRESULT Array_reduce(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsign callback_args[0] = acc; callback_args[2] = jsval_number(k); callback_args[3] = jsval_obj(jsthis); - hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, ARRAY_SIZE(callback_args), callback_args, &new_acc); + hres = disp_call_value(ctx, callback, jsval_undefined(), DISPATCH_METHOD, ARRAY_SIZE(callback_args), callback_args, &new_acc); jsval_release(callback_args[1]); if(FAILED(hres)) break; @@ -1479,9 +1483,10 @@ done: static HRESULT Array_some(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - IDispatch *context_obj = NULL, *callback; + jsval_t context_this = jsval_undefined(); jsval_t value, args[3], res; BOOL boolval, ret = FALSE; + IDispatch *callback; unsigned length, i; jsdisp_t *jsthis; HRESULT hres; @@ -1506,7 +1511,7 @@ static HRESULT Array_some(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned hres = E_NOTIMPL; goto done; } - context_obj = get_object(argv[1]); + context_this = argv[1]; }
for(i = 0; i < length; i++) { @@ -1519,7 +1524,7 @@ static HRESULT Array_some(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned 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); + hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); jsval_release(value); if(FAILED(hres)) goto done; diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 87b1d245aa7..4e872c93717 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -573,7 +573,7 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t TRACE("call %s %p\n", debugstr_w(prop->name), get_object(prop->u.val));
return disp_call_value(This->ctx, get_object(prop->u.val), - jsthis ? jsthis : (IDispatch*)&This->IDispatchEx_iface, + jsval_disp(jsthis ? jsthis : (IDispatch*)&This->IDispatchEx_iface), flags, argc, argv, r); } case PROP_ACCESSOR: @@ -586,7 +586,7 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t
if(is_object_instance(val)) { hres = disp_call_value(This->ctx, get_object(val), - jsthis ? jsthis : (IDispatch*)&This->IDispatchEx_iface, + jsval_disp(jsthis ? jsthis : (IDispatch*)&This->IDispatchEx_iface), flags, argc, argv, r); }else { FIXME("invoke %s\n", debugstr_jsval(val)); @@ -2189,10 +2189,11 @@ HRESULT disp_call_name(script_ctx_t *ctx, IDispatch *disp, const WCHAR *name, WO return disp_call(ctx, disp, id, flags, argc, argv, ret); }
-HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, +HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VARIANT buf[6], retv, *args = buf; + IDispatch *jsthis; jsdisp_t *jsdisp; DISPPARAMS dp; unsigned i; @@ -2204,13 +2205,22 @@ HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, IDispatch *jsthis, W
jsdisp = iface_to_jsdisp(disp); if(jsdisp && jsdisp->ctx == ctx) { - hres = jsdisp_call_value(jsdisp, jsthis ? jsval_disp(jsthis) : jsval_undefined(), flags, argc, argv, r); + hres = jsdisp_call_value(jsdisp, vthis, flags, argc, argv, r); jsdisp_release(jsdisp); return hres; } if(jsdisp) jsdisp_release(jsdisp);
+ if(is_undefined(vthis)) + jsthis = NULL; + else if(is_object_instance(vthis)) + jsthis = get_object(vthis); + else { + FIXME("Unimplemented 'this' passed to host object: %s\n", debugstr_jsval(vthis)); + return E_NOTIMPL; + } + flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK; if(r && argc && flags == DISPATCH_METHOD) flags |= DISPATCH_PROPERTYGET; diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 66374a68372..6c5fe36d29f 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -327,7 +327,7 @@ static HRESULT exprval_call(script_ctx_t *ctx, exprval_t *ref, WORD flags, unsig return E_FAIL; }
- return disp_call_value(ctx, get_object(v), NULL, flags, argc, argv, r); + return disp_call_value(ctx, get_object(v), jsval_undefined(), flags, argc, argv, r); } case EXPRVAL_IDREF: /* ECMA-262 3rd Edition 11.2.3.7 / ECMA-262 5.1 Edition 11.2.3.6 * @@ -340,7 +340,7 @@ static HRESULT exprval_call(script_ctx_t *ctx, exprval_t *ref, WORD flags, unsig FIXME("invoke %s\n", debugstr_jsval(v)); hres = E_FAIL; }else { - hres = disp_call_value(ctx, get_object(v), NULL, flags, argc, argv, r); + hres = disp_call_value(ctx, get_object(v), jsval_undefined(), flags, argc, argv, r); } jsval_release(v); return hres; @@ -351,7 +351,7 @@ static HRESULT exprval_call(script_ctx_t *ctx, exprval_t *ref, WORD flags, unsig
hres = to_object(ctx, ref->u.val, &obj); if(SUCCEEDED(hres)) { - hres = disp_call_value(ctx, obj, NULL, flags, argc, argv, r); + hres = disp_call_value(ctx, obj, jsval_undefined(), flags, argc, argv, r); IDispatch_Release(obj); } return hres; @@ -1380,7 +1380,7 @@ static HRESULT interp_new(script_ctx_t *ctx) return JS_E_INVALID_ACTION;
clear_acc(ctx); - return disp_call_value(ctx, get_object(constr), NULL, DISPATCH_CONSTRUCT | DISPATCH_JSCRIPT_CALLEREXECSSOURCE, + return disp_call_value(ctx, get_object(constr), jsval_undefined(), DISPATCH_CONSTRUCT | DISPATCH_JSCRIPT_CALLEREXECSSOURCE, argc, stack_args(ctx, argc), &ctx->acc); }
@@ -1398,7 +1398,7 @@ static HRESULT interp_call(script_ctx_t *ctx) return JS_E_INVALID_PROPERTY;
clear_acc(ctx); - return disp_call_value(ctx, get_object(obj), NULL, DISPATCH_METHOD | DISPATCH_JSCRIPT_CALLEREXECSSOURCE, + return disp_call_value(ctx, get_object(obj), jsval_undefined(), DISPATCH_METHOD | DISPATCH_JSCRIPT_CALLEREXECSSOURCE, argn, stack_args(ctx, argn), do_ret ? &ctx->acc : NULL); }
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 2a03fdd07ae..8d2b3ed9f4f 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -386,8 +386,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsi hres = function->vtbl->call(ctx, function, this_val, flags, cnt, args, r); }else { jsval_t res; - hres = disp_call_value(ctx, get_object(vthis), is_object_instance(this_val) ? get_object(this_val) : NULL, - DISPATCH_METHOD, cnt, args, &res); + hres = disp_call_value(ctx, get_object(vthis), this_val, DISPATCH_METHOD, cnt, args, &res); if(SUCCEEDED(hres)) { if(r) *r = res; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 48d7542e3cc..e1a3da04097 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -225,7 +225,7 @@ HRESULT init_dispex_from_constr(jsdisp_t*,script_ctx_t*,const builtin_info_t*,js
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT disp_call_name(script_ctx_t*,IDispatch*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; -HRESULT disp_call_value(script_ctx_t*,IDispatch*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; +HRESULT disp_call_value(script_ctx_t*,IDispatch*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT jsdisp_call_value(jsdisp_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT jsdisp_call(jsdisp_t*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; HRESULT jsdisp_call_name(jsdisp_t*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; diff --git a/dlls/jscript/json.c b/dlls/jscript/json.c index a595a778324..e36c4973ef2 100644 --- a/dlls/jscript/json.c +++ b/dlls/jscript/json.c @@ -350,7 +350,7 @@ static jsval_t transform_json_object(struct transform_json_object_ctx *proc_ctx, }
args[0] = jsval_string(name); - proc_ctx->hres = disp_call_value(proc_ctx->ctx, proc_ctx->reviver, (IDispatch*)&holder->IDispatchEx_iface, + proc_ctx->hres = disp_call_value(proc_ctx->ctx, proc_ctx->reviver, jsval_obj(holder), DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); return FAILED(proc_ctx->hres) ? jsval_undefined() : res; } diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 382185c82f4..889b744b385 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -184,7 +184,7 @@ static HRESULT set_map_entry(MapInstance *map, jsval_t key, jsval_t value, jsval static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, jsval_t *argv, jsval_t *r) { struct list *iter = list_head(&map->entries); - IDispatch *context_obj = NULL; + jsval_t context_this = jsval_undefined(); HRESULT hres;
if(!argc || !is_object_instance(argv[0])) { @@ -197,7 +197,7 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); return E_NOTIMPL; } - context_obj = get_object(argv[1]); + context_this = argv[1]; }
while(iter) { @@ -213,8 +213,7 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j args[1] = entry->key; args[2] = jsval_obj(&map->dispex); grab_map_entry(entry); - hres = disp_call_value(ctx, get_object(argv[0]), context_obj, - DISPATCH_METHOD, ARRAY_SIZE(args), args, &v); + hres = disp_call_value(ctx, get_object(argv[0]), context_this, DISPATCH_METHOD, ARRAY_SIZE(args), args, &v); iter = list_next(&map->entries, iter); release_map_entry(entry); if(FAILED(hres))
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/array.c | 43 +++++-------------------------- dlls/jscript/set.c | 7 +---- dlls/mshtml/tests/documentmode.js | 6 +++-- dlls/mshtml/tests/es5.js | 10 +++++++ 4 files changed, 21 insertions(+), 45 deletions(-)
diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index 27d85fdb22b..341505a335c 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -1048,14 +1048,8 @@ static HRESULT Array_every(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigne } 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; - } + if(argc > 1) context_this = argv[1]; - }
for(i = 0; i < length; i++) { hres = jsdisp_get_idx(jsthis, i, &value); @@ -1115,14 +1109,8 @@ static HRESULT Array_filter(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsign } 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; - } + if(argc > 1) context_this = argv[1]; - }
hres = create_array(ctx, 0, &arr); if(FAILED(hres)) @@ -1189,14 +1177,8 @@ static HRESULT Array_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsig } 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; - } + if(argc > 1) context_this = argv[1]; - }
for(i = 0; i < length; i++) { hres = jsdisp_get_idx(jsthis, i, &value); @@ -1367,15 +1349,8 @@ static HRESULT Array_map(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned } callback = get_object(argv[0]);
- if(argc > 1) { - if(is_object_instance(argv[1])) { - context_this = argv[1]; - }else if(!is_undefined(argv[1])) { - FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); - hres = E_NOTIMPL; - goto done; - } - } + if(argc > 1) + context_this = argv[1];
hres = create_array(ctx, length, &array); if(FAILED(hres)) @@ -1505,14 +1480,8 @@ static HRESULT Array_some(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned } 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; - } + if(argc > 1) context_this = argv[1]; - }
for(i = 0; i < length; i++) { hres = jsdisp_get_idx(jsthis, i, &value); diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 889b744b385..4e2c1ffb33f 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -192,13 +192,8 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j return E_FAIL; }
- if(argc > 1 && !is_undefined(argv[1])) { - if(!is_object_instance(argv[1])) { - FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); - return E_NOTIMPL; - } + if(argc > 1) context_this = argv[1]; - }
while(iter) { struct jsval_map_entry *entry = LIST_ENTRY(iter, struct jsval_map_entry, list_entry); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 33d60f7e835..3ef00f4d1a1 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1261,7 +1261,8 @@ sync_test("set_obj", function() { r++; s.clear(); ok(s.size === 0, "size = " + s.size); - }); + ok(this.valueOf() === 42, "this.valueOf() = " + this.valueOf()); + }, 42); ok(r === 1, "r = " + r); });
@@ -1415,7 +1416,8 @@ sync_test("map_obj", function() { r++; s.clear(); ok(s.size === 0, "size = " + s.size); - }); + ok(this.valueOf() === 42, "this.valueOf() = " + this.valueOf()); + }, 42); ok(r === 1, "r = " + r); });
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index e22f610e197..93ede87eeb0 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -280,6 +280,8 @@ sync_test("filter", function() { test(["a","b"], function(v) { if(v === "b") delete arr[0]; return typeof v === "string"; }); test(["b"], function(v) { if(arr[arr.length - 1] !== "c") arr.push("c"); return typeof v === "string"; }); test([true,"b",42,Math,arr[9],"c"], function(v) { return v; }, Object); + + [0].filter(function() { ok(this.valueOf() === "wine", "this.valueOf() = " + this.valueOf()); return true; }, "wine"); });
sync_test("every & some", function() { @@ -314,6 +316,9 @@ sync_test("every & some", function() { test(false, false, function(v) { return v; }); arr.push(1); test(false, true, function(v) { return v; }); + + [0].every(function() { ok(this.valueOf() === 42, "this.valueOf() = " + this.valueOf()); return true; }, 42); + [0].some(function() { ok(this.valueOf() === 137, "this.valueOf() = " + this.valueOf()); return false; }, 137); });
sync_test("forEach", function() { @@ -347,6 +352,8 @@ sync_test("forEach", function() { ok(array === a, "array != a"); ok(this === o, "this != o"); }, o); + + a.forEach(function() { ok(this.valueOf() === "foobar", "this.valueOf() = " + this.valueOf()); }, "foobar"); });
sync_test("isArray", function() { @@ -412,6 +419,9 @@ sync_test("array_map", function() { [1,2].map(function() { ok(this === window, "this != window"); }, undefined); + [1,2].map(function() { + ok(this.valueOf() === 137, "this.valueOf() = " + this.valueOf()); + }, 137); });
sync_test("array_sort", function() {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/set.c | 3 +++ dlls/mshtml/tests/documentmode.js | 7 +++++++ 2 files changed, 10 insertions(+)
diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 4e2c1ffb33f..09f3746740c 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -417,6 +417,9 @@ static HRESULT Map_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns *r = jsval_obj(&map->dispex); return S_OK;
+ case DISPATCH_METHOD: + return throw_error(ctx, JS_E_WRONG_THIS, L"Map"); + default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 3ef00f4d1a1..6da1fdae0f2 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1269,6 +1269,13 @@ sync_test("set_obj", function() { sync_test("map_obj", function() { if(!("Map" in window)) return;
+ try { + var s = Map(); + ok(false, "expected exception calling constructor as method"); + }catch(e) { + ok(e.number === 0xa13fc - 0x80000000, "calling constructor as method threw " + e.number); + } + var s = new Map, r, i; ok(Object.getPrototypeOf(s) === Map.prototype, "unexpected Map prototype");
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/set.c | 3 +++ dlls/mshtml/tests/documentmode.js | 7 +++++++ 2 files changed, 10 insertions(+)
diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 09f3746740c..535ecdc49a4 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -572,6 +572,9 @@ static HRESULT Set_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns *r = jsval_obj(&set->dispex); return S_OK;
+ case DISPATCH_METHOD: + return throw_error(ctx, JS_E_WRONG_THIS, L"Set"); + default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 6da1fdae0f2..f22ac007acc 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1169,6 +1169,13 @@ sync_test("func_scope", function() { sync_test("set_obj", function() { if(!("Set" in window)) return;
+ try { + var s = Set(); + ok(false, "expected exception calling constructor as method"); + }catch(e) { + ok(e.number === 0xa13fc - 0x80000000, "calling constructor as method threw " + e.number); + } + var s = new Set, r; ok(Object.getPrototypeOf(s) === Set.prototype, "unexpected Set prototype");
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=126646
Your paranoid android.
=== w1064v1809 (testbot log) ===
WineRunTask.pl:error: The previous 1 run(s) terminated abnormally
This merge request was approved by Jacek Caban.