Native just ignores the named and extra arguments completely.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 14 ++-- dlls/mshtml/tests/script.c | 137 +++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 9f56a56..b7bc751 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -738,12 +738,17 @@ static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei) { - DISPPARAMS params = {dp->rgvarg+dp->cNamedArgs, NULL, dp->cArgs-dp->cNamedArgs, 0}; + DISPPARAMS params = {dp->rgvarg, NULL, dp->cArgs, 0}; ITypeInfo *ti; IUnknown *unk; UINT argerr=0; HRESULT hres;
+ if(params.cArgs > func->argc) { + params.rgvarg += params.cArgs - func->argc; + params.cArgs = func->argc; + } + hres = get_typeinfo(func->tid, &ti); if(FAILED(hres)) { ERR("Could not get type info: %08x\n", hres); @@ -1170,12 +1175,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP IUnknown *iface; HRESULT hres;
- if(dp->cNamedArgs) { - FIXME("Named arguments not supported\n"); - return E_NOTIMPL; - } - - if(dp->cArgs > func->argc || dp->cArgs + func->default_value_cnt < func->argc) { + if(dp->cArgs + func->default_value_cnt < func->argc) { FIXME("Invalid argument count (expected %u, got %u)\n", func->argc, dp->cArgs); return E_INVALIDARG; } diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index a57468a..b667810 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -2170,6 +2170,142 @@ static void test_default_arg_conv(IHTMLWindow2 *window) IDispatchEx_Release(dispex); }
+static void test_named_args(IHTMLWindow2 *window) +{ + DISPID named_args[] = { 0, 2, 1, 1337, 0xdeadbeef, DISPID_THIS }; + IHTMLDocument2 *doc; + IDispatchEx *dispex; + IHTMLElement *elem; + VARIANT args[4]; + DISPPARAMS dp; + HRESULT hres; + VARIANT var; + DISPID id; + BSTR bstr; + + hres = IHTMLWindow2_get_document(window, &doc); + ok(hres == S_OK, "get_document failed: %08x\n", hres); + + bstr = SysAllocString(L"div"); + hres = IHTMLDocument2_createElement(doc, bstr, &elem); + IHTMLDocument2_Release(doc); + SysFreeString(bstr); + ok(hres == S_OK, "createElement failed: %08x\n", hres); + + hres = IHTMLElement_QueryInterface(elem, &IID_IDispatchEx, (void**)&dispex); + ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); + + bstr = SysAllocString(L"setAttribute"); + hres = IDispatchEx_GetDispID(dispex, bstr, fdexNameCaseSensitive, &id); + SysFreeString(bstr); + + dp.cArgs = 2; + dp.cNamedArgs = 3; + dp.rgvarg = args; + dp.rgdispidNamedArgs = named_args; + V_VT(&args[0]) = VT_BSTR; + V_BSTR(&args[0]) = SysAllocString(L"testattr"); + V_VT(&args[1]) = VT_I4; + V_I4(&args[1]) = 0; + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == S_OK, "InvokeEx returned: %08x\n", hres); + + hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[0]), 0, &var); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_NULL, "V_VT(var)=%d\n", V_VT(&var)); + + bstr = SysAllocString(L"0"); + hres = IHTMLElement_getAttribute(elem, bstr, 0, &var); + SysFreeString(bstr); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!lstrcmpW(V_BSTR(&var), L"testattr"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + dp.cArgs = 3; + V_VT(&args[2]) = VT_BSTR; + V_BSTR(&args[2]) = SysAllocString(L"testval"); + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + VariantClear(&args[2]); + ok(hres == DISP_E_TYPEMISMATCH, "InvokeEx returned: %08x\n", hres); + + V_VT(&args[2]) = VT_I4; + V_I4(&args[2]) = 0; + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == DISP_E_TYPEMISMATCH, "InvokeEx returned: %08x\n", hres); + + args[2] = args[0]; + V_VT(&args[1]) = VT_BSTR; + V_BSTR(&args[1]) = SysAllocString(L"testval"); + V_VT(&args[0]) = VT_I4; + V_I4(&args[0]) = 0; + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + VariantClear(&args[1]); + + hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[2]), 0, &var); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!lstrcmpW(V_BSTR(&var), L"testval"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + dp.cArgs = 2; + dp.cNamedArgs = 1; + args[1] = args[2]; + V_VT(&args[0]) = VT_BSTR; + V_BSTR(&args[0]) = SysAllocString(L"newValue"); + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + VariantClear(&args[0]); + + hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[1]), 0, &var); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!lstrcmpW(V_BSTR(&var), L"newValue"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + dp.cArgs = 4; + dp.cNamedArgs = ARRAY_SIZE(named_args); + args[3] = args[1]; + V_VT(&args[2]) = VT_BSTR; + V_BSTR(&args[2]) = SysAllocString(L"foobar"); + V_VT(&args[1]) = VT_I4; + V_I4(&args[1]) = 1; + V_VT(&args[0]) = VT_BSTR; + V_BSTR(&args[0]) = SysAllocString(L"extra"); + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + VariantClear(&args[2]); + VariantClear(&args[0]); + + hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[3]), 0, &var); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!lstrcmpW(V_BSTR(&var), L"foobar"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var))); + VariantClear(&var); + + dp.cArgs = 4; + dp.cNamedArgs = 1; + named_args[0] = DISPID_THIS; + V_VT(&args[0]) = VT_DISPATCH; + V_DISPATCH(&args[0]) = (IDispatch*)&funcDisp; + V_VT(&args[2]) = VT_BSTR; + V_BSTR(&args[2]) = SysAllocString(L"withThis"); + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, NULL, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + VariantClear(&args[2]); + + hres = IHTMLElement_getAttribute(elem, V_BSTR(&args[3]), 0, &var); + ok(hres == S_OK, "getAttribute failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!lstrcmpW(V_BSTR(&var), L"withThis"), "V_BSTR(&var) = %s\n", debugstr_w(V_BSTR(&var))); + VariantClear(&args[3]); + VariantClear(&var); + + IHTMLElement_Release(elem); + IDispatchEx_Release(dispex); +} + static void test_ui(void) { IActiveScriptSiteUIControl *ui_control; @@ -2381,6 +2517,7 @@ static void test_script_run(void)
test_arg_conv(window); test_default_arg_conv(window); + test_named_args(window); IHTMLWindow2_Release(window);
tmp = SysAllocString(L"test");
And move typeinfo_invoke as a fallback into it if we have no call_vtbl_off.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
It's made non-static because it will be used in next patch, and this avoids a pointless temporary forward-declaration.
dlls/mshtml/dispex.c | 17 +++++++++-------- dlls/mshtml/mshtml_private.h | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index b7bc751..3ab8202 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -49,7 +49,7 @@ typedef struct { VARIANT default_value; } func_arg_info_t;
-typedef struct { +struct func_info_t { DISPID id; BSTR name; tid_t tid; @@ -63,7 +63,7 @@ typedef struct { VARTYPE prop_vt; VARTYPE *arg_types; func_arg_info_t *arg_info; -} func_info_t; +};
struct dispex_data_t { dispex_static_data_t *desc; @@ -842,7 +842,7 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR case DISPATCH_METHOD: if(!This->obj) return E_UNEXPECTED; - hres = typeinfo_invoke(This->obj, This->info, flags, params, res, ei); + hres = invoke_builtin_function(This->obj, This->info, flags, params, res, ei, caller); break; case DISPATCH_PROPERTYGET: { unsigned name_len; @@ -1168,13 +1168,17 @@ static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS * return hres; }
-static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISPPARAMS *dp, VARIANT *res, IServiceProvider *caller) +HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, + EXCEPINFO *ei, IServiceProvider *caller) { VARIANT arg_buf[MAX_ARGS], *arg_ptrs[MAX_ARGS], *arg, retv, ret_ref, vhres; unsigned i, nconv = 0; IUnknown *iface; HRESULT hres;
+ if(!func->call_vtbl_off) + return typeinfo_invoke(This, func, flags, dp, res, ei); + if(dp->cArgs + func->default_value_cnt < func->argc) { FIXME("Invalid argument count (expected %u, got %u)\n", func->argc, dp->cArgs); return E_INVALIDARG; @@ -1296,10 +1300,7 @@ static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags, } }
- if(func->call_vtbl_off) - hres = invoke_builtin_function(This, func, dp, res, caller); - else - hres = typeinfo_invoke(This, func, flags, dp, res, ei); + hres = invoke_builtin_function(This, func, flags, dp, res, ei, caller); break; case DISPATCH_PROPERTYGET: { func_obj_entry_t *entry; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 6978ed7..03ccc7e 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -312,6 +312,7 @@ extern const compat_mode_info_t compat_mode_info[COMPAT_MODE_CNT] DECLSPEC_HIDDE
typedef struct dispex_data_t dispex_data_t; typedef struct dispex_dynamic_data_t dispex_dynamic_data_t; +typedef struct func_info_t func_info_t;
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000 #define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff @@ -387,6 +388,7 @@ BOOL dispex_query_interface(DispatchEx*,REFIID,void**) DECLSPEC_HIDDEN; HRESULT change_type(VARIANT*,VARIANT*,VARTYPE,IServiceProvider*) DECLSPEC_HIDDEN; HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**) DECLSPEC_HIDDEN; HRESULT get_dispids(tid_t,DWORD*,DISPID**) DECLSPEC_HIDDEN; +HRESULT invoke_builtin_function(DispatchEx*,func_info_t*,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*) DECLSPEC_HIDDEN; HRESULT remove_attribute(DispatchEx*,DISPID,VARIANT_BOOL*) DECLSPEC_HIDDEN; HRESULT dispex_get_dynid(DispatchEx*,const WCHAR*,DISPID*) DECLSPEC_HIDDEN; void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
And let the hooks forward using invoke_builtin_function as well.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 14 ++++++++++---- dlls/mshtml/htmlelem.c | 5 ++--- dlls/mshtml/htmlevent.c | 10 ++++------ dlls/mshtml/mshtml_private.h | 4 ++-- dlls/mshtml/tests/documentmode.js | 14 +++++++++++++- dlls/mshtml/xmlhttprequest.c | 5 ++--- 6 files changed, 33 insertions(+), 19 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 3ab8202..465748a 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1176,6 +1176,12 @@ HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, WORD flags, IUnknown *iface; HRESULT hres;
+ if(func->hook) { + hres = func->hook(This, func, flags, dp, res, ei, caller); + if(hres != S_FALSE) + return hres; + } + if(!func->call_vtbl_off) return typeinfo_invoke(This, func, flags, dp, res, ei);
@@ -1365,15 +1371,15 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD if(FAILED(hres)) return hres;
+ if(func->func_disp_idx != -1) + return function_invoke(This, func, flags, dp, res, ei, caller); + if(func->hook) { - hres = func->hook(This, lcid, flags, dp, res, ei, caller); + hres = func->hook(This, func, flags, dp, res, ei, caller); if(hres != S_FALSE) return hres; }
- if(func->func_disp_idx != -1) - return function_invoke(This, func, flags, dp, res, ei, caller); - switch(flags) { case DISPATCH_PROPERTYPUT: if(res) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index a205728..99d6249 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6643,7 +6643,7 @@ static IHTMLEventObj *HTMLElement_set_current_event(DispatchEx *dispex, IHTMLEve return default_set_current_event(This->node.doc->window, event); }
-static HRESULT IHTMLElement6_setAttribute_hook(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +static HRESULT IHTMLElement6_setAttribute_hook(DispatchEx *dispex, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { VARIANT args[2]; @@ -6667,8 +6667,7 @@ static HRESULT IHTMLElement6_setAttribute_hook(DispatchEx *dispex, LCID lcid, WO return hres; args[1] = dp->rgvarg[dp->cArgs - 1];
- hres = IDispatchEx_InvokeEx(&dispex->IDispatchEx_iface, DISPID_IHTMLELEMENT6_IE9_SETATTRIBUTE, - lcid, flags, &new_dp, res, ei, caller); + hres = invoke_builtin_function(dispex, func, flags, &new_dp, res, ei, caller); VariantClear(&args[0]); return hres; } diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 3f545bb..c88e8fd 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -3314,7 +3314,7 @@ static HRESULT WINAPI EventTarget_dispatchEvent(IEventTarget *iface, IDOMEvent * return dispatch_event_object(This, event, DISPATCH_STANDARD, result); }
-static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, LCID lcid, WORD flags, +static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { /* If only two arguments were given, implicitly set capture to false */ @@ -3328,14 +3328,13 @@ static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, LCID lcid,
TRACE("implicit capture\n");
- return IDispatchEx_InvokeEx(&dispex->IDispatchEx_iface, DISPID_IEVENTTARGET_ADDEVENTLISTENER, - lcid, flags, &new_dp, res, ei, caller); + return invoke_builtin_function(dispex, func, flags, &new_dp, res, ei, caller); }
return S_FALSE; /* fallback to default */ }
-static HRESULT IEventTarget_removeEventListener_hook(DispatchEx *dispex, LCID lcid, WORD flags, +static HRESULT IEventTarget_removeEventListener_hook(DispatchEx *dispex, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { /* If only two arguments were given, implicitly set capture to false */ @@ -3349,8 +3348,7 @@ static HRESULT IEventTarget_removeEventListener_hook(DispatchEx *dispex, LCID lc
TRACE("implicit capture\n");
- return IDispatchEx_InvokeEx(&dispex->IDispatchEx_iface, DISPID_IEVENTTARGET_REMOVEEVENTLISTENER, - lcid, flags, &new_dp, res, ei, caller); + return invoke_builtin_function(dispex, func, flags, &new_dp, res, ei, caller); }
return S_FALSE; /* fallback to default */ diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 03ccc7e..26ea22e 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -338,8 +338,8 @@ typedef struct { dispex_data_t *delayed_init_info; } dispex_static_data_t;
-typedef HRESULT (*dispex_hook_invoke_t)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*, - EXCEPINFO*,IServiceProvider*); +typedef HRESULT (*dispex_hook_invoke_t)(DispatchEx*,func_info_t*,WORD,DISPPARAMS*, + VARIANT*,EXCEPINFO*,IServiceProvider*);
typedef struct { DISPID dispid; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 6555e8b..2af5fae 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1166,6 +1166,18 @@ sync_test("elem_attr", function() { r = elem.removeAttribute("testattr"); ok(r === (v < 9 ? true : undefined), "testattr removeAttribute with custom valueOf returned " + r); ok(elem.testattr === (v < 9 ? undefined : arr), "removed testattr with custom valueOf = " + elem.testattr); + + var func = elem.setAttribute; + try { + func("testattr", arr); + todo_wine_if(v >= 9). + ok(v < 9, "expected exception setting testattr via func"); + }catch(ex) { + ok(v >= 9, "did not expect exception setting testattr via func"); + elem.setAttribute("testattr", arr); + } + r = elem.getAttribute("testattr"); + ok(r === (v < 8 ? arr : (v < 10 ? "arrval" : "42")), "testattr after setAttribute (as func) = " + r); delete arr.valueOf; delete arr.toString;
@@ -1177,7 +1189,7 @@ sync_test("elem_attr", function() { ok(r === (v < 9 ? true : undefined), "id removeAttribute returned " + r); ok(elem.id === "", "removed id = " + elem.id);
- var func = function() { }; + func = function() { }; elem.onclick = func; ok(elem.onclick === func, "onclick = " + elem.onclick); r = elem.getAttribute("onclick"); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 56e18d0..f608558 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -475,7 +475,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) return S_OK; }
-static HRESULT HTMLXMLHttpRequest_open_hook(DispatchEx *dispex, LCID lcid, WORD flags, +static HRESULT HTMLXMLHttpRequest_open_hook(DispatchEx *dispex, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { /* If only two arguments were given, implicitly set async to false */ @@ -491,8 +491,7 @@ static HRESULT HTMLXMLHttpRequest_open_hook(DispatchEx *dispex, LCID lcid, WORD
TRACE("implicit async\n");
- return IDispatchEx_InvokeEx(&dispex->IDispatchEx_iface, DISPID_IHTMLXMLHTTPREQUEST_OPEN, - lcid, flags, &new_dp, res, ei, caller); + return invoke_builtin_function(dispex, func, flags, &new_dp, res, ei, caller); }
return S_FALSE; /* fallback to default */
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=103464
Your paranoid android.
=== w8adm (32 bit report) ===
mshtml: htmldoc.c:3084: Test failed: Incorrect error code: -2146697211 htmldoc.c:3089: Test failed: Page address: L"http://test.winehq.org/tests/winehq_snapshot/" htmldoc.c:5861: Test failed: expected OnChanged_1012 htmldoc.c:5862: Test failed: expected Exec_HTTPEQUIV htmldoc.c:5864: Test failed: expected Exec_SETTITLE htmldoc.c:5905: Test failed: expected FireNavigateComplete2
=== w1064_tsign (32 bit report) ===
mshtml: htmldoc.c:2541: Test failed: unexpected call UpdateUI htmldoc.c:2853: Test failed: unexpected call Exec_UPDATECOMMANDS
=== w7u_el (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1638808748111 expected 1638808748174"
And get rid of vdisp_t since it's no longer needed.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
I decided to not use a flag for to_string, because it really only affects Object and Array. Every other case is special (for example Number, Bool) because it returns a different error, so having it generic makes this impossible. I followed the spec closely.
Also, I still do the checks in Object_toString, because that's what the spec says and special cases, and it's changed from version ES3 to ES5 in that function only. to_object would also fail on such values.
dlls/jscript/activex.c | 2 +- dlls/jscript/array.c | 244 +++++++++++++++++++++++--------------- dlls/jscript/bool.c | 44 ++++--- dlls/jscript/date.c | 199 +++++++++++++++---------------- dlls/jscript/dispex.c | 17 +-- dlls/jscript/enumerator.c | 28 ++--- dlls/jscript/error.c | 28 +++-- dlls/jscript/function.c | 51 ++++---- dlls/jscript/global.c | 34 +++--- dlls/jscript/jscript.h | 75 +----------- dlls/jscript/json.c | 4 +- dlls/jscript/jsregexp.c | 32 +++-- dlls/jscript/math.c | 36 +++--- dlls/jscript/number.c | 69 ++++++----- dlls/jscript/object.c | 182 +++++++++++++++++++--------- dlls/jscript/set.c | 81 ++++++++----- dlls/jscript/string.c | 180 ++++++++++++++-------------- dlls/jscript/vbarray.c | 24 ++-- 18 files changed, 693 insertions(+), 637 deletions(-)
diff --git a/dlls/jscript/activex.c b/dlls/jscript/activex.c index 80a89b5..c84f269 100644 --- a/dlls/jscript/activex.c +++ b/dlls/jscript/activex.c @@ -138,7 +138,7 @@ static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid) return obj; }
-static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT ActiveXObject_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t * progid_str; diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index 5f61f99..8746db2 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -37,14 +37,10 @@ static inline ArrayInstance *array_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, ArrayInstance, dispex); }
-static inline ArrayInstance *array_from_vdisp(vdisp_t *vdisp) +static inline ArrayInstance *array_this(jsval_t vthis) { - return array_from_jsdisp(vdisp->u.jsdisp); -} - -static inline ArrayInstance *array_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_ARRAY) ? array_from_vdisp(jsthis) : NULL; + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_ARRAY)) ? array_from_jsdisp(jsdisp) : NULL; }
unsigned array_get_length(jsdisp_t *array) @@ -53,33 +49,40 @@ unsigned array_get_length(jsdisp_t *array) return array_from_jsdisp(array)->length; }
-static HRESULT get_length(script_ctx_t *ctx, vdisp_t *vdisp, jsdisp_t **jsthis, DWORD *ret) +static HRESULT get_length(script_ctx_t *ctx, jsval_t vthis, jsdisp_t **jsthis, DWORD *ret) { - ArrayInstance *array; + jsdisp_t *jsdisp; + IDispatch *disp; jsval_t val; HRESULT hres;
- array = array_this(vdisp); - if(array) { - *jsthis = &array->dispex; - *ret = array->length; - return S_OK; - } + hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres;
- if(!is_jsdisp(vdisp)) + jsdisp = iface_to_jsdisp(disp); + IDispatch_Release(disp); + if(!jsdisp) return JS_E_JSCRIPT_EXPECTED; + *jsthis = jsdisp;
- hres = jsdisp_propget_name(vdisp->u.jsdisp, L"length", &val); + if(is_class(jsdisp, JSCLASS_ARRAY)) { + *ret = array_from_jsdisp(jsdisp)->length; + return S_OK; + } + + hres = jsdisp_propget_name(jsdisp, L"length", &val); if(FAILED(hres)) - return hres; + goto fail;
hres = to_uint32(ctx, val, ret); jsval_release(val); - if(FAILED(hres)) + if(SUCCEEDED(hres)) return hres;
- *jsthis = vdisp->u.jsdisp; - return S_OK; +fail: + jsdisp_release(jsdisp); + return hres; }
static HRESULT set_length(jsdisp_t *obj, DWORD length) @@ -183,20 +186,25 @@ static HRESULT concat_obj(jsdisp_t *array, IDispatch *obj, DWORD *len) return jsdisp_propput_idx(array, (*len)++, jsval_disp(obj)); }
-static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_concat(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + IDispatch *jsthis; jsdisp_t *ret; DWORD len = 0; HRESULT hres;
TRACE("\n");
- hres = create_array(ctx, 0, &ret); + hres = to_object(ctx, vthis, &jsthis); if(FAILED(hres)) return hres;
- hres = concat_obj(ret, jsthis->u.disp, &len); + hres = create_array(ctx, 0, &ret); + if(FAILED(hres)) + goto done; + + hres = concat_obj(ret, jsthis, &len); if(SUCCEEDED(hres)) { DWORD i;
@@ -211,12 +219,14 @@ static HRESULT Array_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
if(FAILED(hres)) - return hres; + goto done;
if(r) *r = jsval_obj(ret); else jsdisp_release(ret); +done: + IDispatch_Release(jsthis); return S_OK; }
@@ -310,7 +320,7 @@ static HRESULT array_join(script_ctx_t *ctx, jsdisp_t *array, DWORD length, cons }
/* ECMA-262 3rd Edition 15.4.4.5 */ -static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_join(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -329,7 +339,7 @@ static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne
hres = to_flat_string(ctx, argv[0], &sep_str, &sep); if(FAILED(hres)) - return hres; + goto done;
hres = array_join(ctx, jsthis, length, sep, jsstr_length(sep_str), r);
@@ -338,10 +348,12 @@ static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne hres = array_join(ctx, jsthis, length, L",", 1, r); }
+done: + jsdisp_release(jsthis); return hres; }
-static HRESULT Array_pop(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_pop(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -358,11 +370,11 @@ static HRESULT Array_pop(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned if(!length) { hres = set_length(jsthis, 0); if(FAILED(hres)) - return hres; + goto done;
if(r) *r = jsval_undefined(); - return S_OK; + goto done; }
length--; @@ -373,25 +385,27 @@ static HRESULT Array_pop(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned val = jsval_undefined(); hres = S_OK; }else - return hres; + goto done;
if(SUCCEEDED(hres)) hres = set_length(jsthis, length);
if(FAILED(hres)) { jsval_release(val); - return hres; + goto done; }
if(r) *r = val; else jsval_release(val); +done: + jsdisp_release(jsthis); return hres; }
/* ECMA-262 3rd Edition 15.4.4.7 */ -static HRESULT Array_push(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_push(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -408,19 +422,21 @@ static HRESULT Array_push(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne for(i=0; i < argc; i++) { hres = jsdisp_propput_idx(jsthis, length+i, argv[i]); if(FAILED(hres)) - return hres; + goto done; }
hres = set_length(jsthis, length+argc); if(FAILED(hres)) - return hres; + goto done;
if(r) *r = jsval_number(length+argc); - return S_OK; +done: + jsdisp_release(jsthis); + return hres; }
-static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_reverse(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -439,12 +455,13 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
hres1 = jsdisp_get_idx(jsthis, k, &v1); if(FAILED(hres1) && hres1!=DISP_E_UNKNOWNNAME) - return hres1; + goto done;
hres2 = jsdisp_get_idx(jsthis, l, &v2); if(FAILED(hres2) && hres2!=DISP_E_UNKNOWNNAME) { jsval_release(v1); - return hres2; + hres1 = hres2; + goto done; }
if(hres1 == DISP_E_UNKNOWNNAME) @@ -455,7 +472,7 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi if(FAILED(hres1)) { jsval_release(v1); jsval_release(v2); - return hres1; + goto done; }
if(hres2 == DISP_E_UNKNOWNNAME) @@ -465,17 +482,20 @@ static HRESULT Array_reverse(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
if(FAILED(hres2)) { jsval_release(v2); - return hres2; + hres1 = hres2; + goto done; } }
if(r) *r = jsval_obj(jsdisp_addref(jsthis)); - return S_OK; +done: + jsdisp_release(jsthis); + return hres1; }
/* ECMA-262 3rd Edition 15.4.4.9 */ -static HRESULT Array_shift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_shift(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -492,11 +512,11 @@ static HRESULT Array_shift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign if(!length) { hres = set_length(jsthis, 0); if(FAILED(hres)) - return hres; + goto done;
if(r) *r = jsval_undefined(); - return S_OK; + goto done; }
hres = jsdisp_get_idx(jsthis, 0, &ret); @@ -520,17 +540,19 @@ static HRESULT Array_shift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign }
if(FAILED(hres)) - return hres; + goto done;
if(r) *r = ret; else jsval_release(ret); +done: + jsdisp_release(jsthis); return hres; }
/* ECMA-262 3rd Edition 15.4.4.10 */ -static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Array_slice(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *arr, *jsthis; DOUBLE range; @@ -546,7 +568,7 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign if(argc) { hres = to_number(ctx, argv[0], &range); if(FAILED(hres)) - return hres; + goto done;
range = floor(range); if(-range>length || isnan(range)) start = 0; @@ -559,7 +581,7 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign if(argc > 1) { hres = to_number(ctx, argv[1], &range); if(FAILED(hres)) - return hres; + goto done;
range = floor(range); if(-range>length) end = 0; @@ -571,7 +593,7 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign
hres = create_array(ctx, (end>start)?end-start:0, &arr); if(FAILED(hres)) - return hres; + goto done;
for(idx=start; idx<end; idx++) { jsval_t v; @@ -587,7 +609,7 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign
if(FAILED(hres)) { jsdisp_release(arr); - return hres; + goto done; } }
@@ -595,8 +617,11 @@ static HRESULT Array_slice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsign *r = jsval_obj(arr); else jsdisp_release(arr); + hres = S_OK;
- return S_OK; +done: + jsdisp_release(jsthis); + return hres; }
static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, jsval_t v1, jsval_t v2, INT *cmp) @@ -651,7 +676,7 @@ static HRESULT sort_cmp(script_ctx_t *ctx, jsdisp_t *cmp_func, jsval_t v1, jsval }
/* ECMA-262 3rd Edition 15.4.4.11 */ -static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_sort(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis, *cmp_func = NULL; @@ -670,18 +695,21 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne if(is_object_instance(argv[0])) { if(argc > 1 && ctx->version < SCRIPTLANGUAGEVERSION_ES5) { WARN("invalid arg_cnt %d\n", argc); - return JS_E_JSCRIPT_EXPECTED; + hres = JS_E_JSCRIPT_EXPECTED; + goto done; } cmp_func = iface_to_jsdisp(get_object(argv[0])); if(!cmp_func || !is_class(cmp_func, JSCLASS_FUNCTION)) { WARN("cmp_func is not a function\n"); if(cmp_func) jsdisp_release(cmp_func); - return JS_E_JSCRIPT_EXPECTED; + hres = JS_E_JSCRIPT_EXPECTED; + goto done; } }else if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5 ? !is_undefined(argv[0]) : !is_null(argv[0])) { WARN("invalid arg %s\n", debugstr_jsval(argv[0])); - return JS_E_JSCRIPT_EXPECTED; + hres = JS_E_JSCRIPT_EXPECTED; + goto done; } }
@@ -690,7 +718,7 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne jsdisp_release(cmp_func); if(r) *r = jsval_obj(jsdisp_addref(jsthis)); - return S_OK; + goto done; }
vtab = heap_alloc_zero(length * sizeof(*vtab)); @@ -789,15 +817,17 @@ static HRESULT Array_sort(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne jsdisp_release(cmp_func);
if(FAILED(hres)) - return hres; + goto done;
if(r) *r = jsval_obj(jsdisp_addref(jsthis)); - return S_OK; +done: + jsdisp_release(jsthis); + return hres; }
/* ECMA-262 3rd Edition 15.4.4.12 */ -static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_splice(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DWORD length, start=0, delete_cnt=0, i, add_args = 0; @@ -816,7 +846,7 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig if(argc) { hres = to_integer(ctx, argv[0], &d); if(FAILED(hres)) - return hres; + goto done;
if(is_int32(d)) { if((n = d) >= 0) @@ -831,7 +861,7 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig if(argc >= 2) { hres = to_integer(ctx, argv[1], &d); if(FAILED(hres)) - return hres; + goto done;
if(is_int32(d)) { if((n = d) > 0) @@ -846,7 +876,7 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig if(r) { hres = create_array(ctx, 0, &ret_array); if(FAILED(hres)) - return hres; + goto done;
for(i=0; SUCCEEDED(hres) && i < delete_cnt; i++) { hres = jsdisp_get_idx(jsthis, start+i, &val); @@ -896,37 +926,39 @@ static HRESULT Array_splice(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig if(FAILED(hres)) { if(ret_array) jsdisp_release(ret_array); - return hres; + goto done; }
if(r) *r = jsval_obj(ret_array); - return S_OK; +done: + jsdisp_release(jsthis); + return hres; }
/* ECMA-262 3rd Edition 15.4.4.2 */ -static HRESULT Array_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { ArrayInstance *array;
TRACE("\n");
- array = array_this(jsthis); + array = array_this(vthis); if(!array) return JS_E_ARRAY_EXPECTED;
return array_join(ctx, &array->dispex, array->length, L",", 1, r); }
-static HRESULT Array_toLocaleString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); return E_NOTIMPL; }
-static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +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; @@ -944,14 +976,16 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi /* Fixme check IsCallable */ if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) { FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined())); - return E_INVALIDARG; + hres = E_INVALIDARG; + goto done; } callback = get_object(argv[0]);
if(argc > 1 && !is_undefined(argv[1])) { if(!is_object_instance(argv[1]) || !get_object(argv[1])) { FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); - return E_NOTIMPL; + hres = E_NOTIMPL; + goto done; } context_obj = get_object(argv[1]); } @@ -961,7 +995,7 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi if(hres == DISP_E_UNKNOWNNAME) continue; if(FAILED(hres)) - return hres; + goto done;
args[0] = value; args[1] = jsval_number(i); @@ -969,15 +1003,18 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi hres = disp_call_value(ctx, callback, context_obj, DISPATCH_METHOD, ARRAY_SIZE(args), args, &res); jsval_release(value); if(FAILED(hres)) - return hres; + goto done; jsval_release(res); }
if(r) *r = jsval_undefined(); - return S_OK; + hres = S_OK; +done: + jsdisp_release(jsthis); + return hres; }
-static HRESULT Array_indexOf(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_indexOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -993,7 +1030,7 @@ static HRESULT Array_indexOf(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi return hres; if(!length) { if(r) *r = jsval_number(-1); - return S_OK; + goto done; }
search = argc ? argv[0] : jsval_undefined(); @@ -1003,7 +1040,7 @@ static HRESULT Array_indexOf(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
hres = to_integer(ctx, argv[1], &from_arg); if(FAILED(hres)) - return hres; + goto done;
if(from_arg >= 0) from = min(from_arg, length); @@ -1016,23 +1053,26 @@ static HRESULT Array_indexOf(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi if(hres == DISP_E_UNKNOWNNAME) continue; if(FAILED(hres)) - return hres; + goto done;
hres = jsval_strict_equal(value, search, &eq); jsval_release(value); if(FAILED(hres)) - return hres; + goto done; if(eq) { if(r) *r = jsval_number(i); - return S_OK; + goto done; } }
if(r) *r = jsval_number(-1); - return S_OK; + hres = S_OK; +done: + jsdisp_release(jsthis); + return hres; }
-static HRESULT Array_map(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +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 callback_args[3], mapped_value; @@ -1051,7 +1091,8 @@ static HRESULT Array_map(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned /* FIXME: check IsCallable */ if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) { FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined())); - return E_INVALIDARG; + hres = E_INVALIDARG; + goto done; } callback = get_object(argv[0]);
@@ -1060,13 +1101,14 @@ static HRESULT Array_map(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned context_this = get_object(argv[1]); }else if(!is_undefined(argv[1])) { FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1])); - return E_NOTIMPL; + hres = E_NOTIMPL; + goto done; } }
hres = create_array(ctx, length, &array); if(FAILED(hres)) - return hres; + goto done;
for(k = 0; k < length; k++) { hres = jsdisp_get_idx(jsthis, k, &callback_args[0]); @@ -1091,10 +1133,12 @@ static HRESULT Array_map(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned *r = jsval_obj(array); else jsdisp_release(array); +done: + jsdisp_release(jsthis); return hres; }
-static HRESULT Array_reduce(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +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; @@ -1114,7 +1158,8 @@ static HRESULT Array_reduce(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig /* Fixme check IsCallable */ if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) { FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined())); - return E_INVALIDARG; + hres = E_INVALIDARG; + goto done; } callback = get_object(argv[0]);
@@ -1122,7 +1167,7 @@ static HRESULT Array_reduce(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig have_value = TRUE; hres = jsval_copy(argv[1], &acc); if(FAILED(hres)) - return hres; + goto done; }
for(k = 0; k < length; k++) { @@ -1159,11 +1204,13 @@ static HRESULT Array_reduce(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsig *r = acc; else if(have_value) jsval_release(acc); +done: + jsdisp_release(jsthis); return hres; }
/* ECMA-262 3rd Edition 15.4.4.13 */ -static HRESULT Array_unshift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Array_unshift(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *jsthis; @@ -1191,35 +1238,38 @@ static HRESULT Array_unshift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi if(SUCCEEDED(hres)) { hres = jsdisp_propget(jsthis, id, &val); if(FAILED(hres)) - return hres; + goto done;
hres = jsdisp_propput_idx(jsthis, i+argc, val); jsval_release(val); }else if(hres == DISP_E_UNKNOWNNAME) { - hres = IDispatchEx_DeleteMemberByDispID(vthis->u.dispex, id); + hres = IDispatchEx_DeleteMemberByDispID(&jsthis->IDispatchEx_iface, id); } }
if(FAILED(hres)) - return hres; + goto done; }
for(i=0; i<argc; i++) { hres = jsdisp_propput_idx(jsthis, i, argv[i]); if(FAILED(hres)) - return hres; + goto done; }
if(argc) { length += argc; hres = set_length(jsthis, length); if(FAILED(hres)) - return hres; + goto done; }
if(r) *r = ctx->version < 2 ? jsval_undefined() : jsval_number(length); - return S_OK; + hres = S_OK; +done: + jsdisp_release(jsthis); + return hres; }
static void Array_destructor(jsdisp_t *dispex) @@ -1291,7 +1341,7 @@ static const builtin_info_t ArrayInst_info = { };
/* ECMA-262 5.1 Edition 15.4.3.2 */ -static HRESULT ArrayConstr_isArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT ArrayConstr_isArray(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj;
@@ -1308,7 +1358,7 @@ static HRESULT ArrayConstr_isArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags return S_OK; }
-static HRESULT ArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT ArrayConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c index 184d8d0..a230855 100644 --- a/dlls/jscript/bool.c +++ b/dlls/jscript/bool.c @@ -36,14 +36,16 @@ static inline BoolInstance *bool_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, BoolInstance, dispex); }
-static inline BoolInstance *bool_from_vdisp(vdisp_t *vdisp) +static inline HRESULT boolval_this(jsval_t vthis, BOOL *ret) { - return bool_from_jsdisp(vdisp->u.jsdisp); -} - -static inline BoolInstance *bool_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_BOOLEAN) ? bool_from_vdisp(jsthis) : NULL; + jsdisp_t *jsdisp; + if(is_bool(vthis)) + *ret = get_bool(vthis); + else if(is_object_instance(vthis) && (jsdisp = to_jsdisp(get_object(vthis))) && is_class(jsdisp, JSCLASS_BOOLEAN)) + *ret = bool_from_jsdisp(jsdisp)->val; + else + return JS_E_BOOLEAN_EXPECTED; + return S_OK; }
BOOL bool_obj_value(jsdisp_t *obj) @@ -53,19 +55,21 @@ BOOL bool_obj_value(jsdisp_t *obj) }
/* ECMA-262 3rd Edition 15.6.4.2 */ -static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Bool_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - BoolInstance *bool; + BOOL boolval; + HRESULT hres;
TRACE("\n");
- if(!(bool = bool_this(jsthis))) - return JS_E_BOOLEAN_EXPECTED; + hres = boolval_this(vthis, &boolval); + if(FAILED(hres)) + return hres;
if(r) { jsstr_t *val;
- val = jsstr_alloc(bool->val ? L"true" : L"false"); + val = jsstr_alloc(boolval ? L"true" : L"false"); if(!val) return E_OUTOFMEMORY;
@@ -76,21 +80,23 @@ static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.6.4.3 */ -static HRESULT Bool_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Bool_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - BoolInstance *bool; + BOOL boolval; + HRESULT hres;
TRACE("\n");
- if(!(bool = bool_this(jsthis))) - return JS_E_BOOLEAN_EXPECTED; + hres = boolval_this(vthis, &boolval); + if(FAILED(hres)) + return hres;
if(r) - *r = jsval_bool(bool->val); + *r = jsval_bool(boolval); return S_OK; }
-static HRESULT Bool_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Bool_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -129,7 +135,7 @@ static const builtin_info_t BoolInst_info = { NULL };
-static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT BoolConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { BOOL value = FALSE; diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index b130c83..e482c4a 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -49,9 +49,10 @@ static inline DateInstance *date_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, DateInstance, dispex); }
-static inline DateInstance *date_this(vdisp_t *jsthis) +static inline DateInstance *date_this(jsval_t vthis) { - return is_vclass(jsthis, JSCLASS_DATE) ? date_from_jsdisp(jsthis->u.jsdisp) : NULL; + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_DATE)) ? date_from_jsdisp(jsdisp) : NULL; }
/*ECMA-262 3rd Edition 15.9.1.2 */ @@ -513,20 +514,20 @@ static HRESULT dateobj_to_string(DateInstance *date, jsval_t *r) return date_to_string(time, TRUE, offset, r); }
-static HRESULT Date_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Date_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
return dateobj_to_string(date, r); }
/* ECMA-262 3rd Edition 15.9.1.5 */ -static HRESULT Date_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { SYSTEMTIME st; @@ -536,7 +537,7 @@ static HRESULT Date_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(isnan(date->time)) { @@ -569,7 +570,7 @@ static HRESULT Date_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag return S_OK; }
-static HRESULT Date_toISOString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toISOString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -578,7 +579,7 @@ static HRESULT Date_toISOString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
year = year_from_time(date->time); @@ -611,14 +612,14 @@ static HRESULT Date_toISOString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return S_OK; }
-static HRESULT Date_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -626,7 +627,7 @@ static HRESULT Date_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi return S_OK; }
-static inline HRESULT create_utc_string(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r) +static inline HRESULT create_utc_string(script_ctx_t *ctx, jsval_t vthis, jsval_t *r) { static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, @@ -646,7 +647,7 @@ static inline HRESULT create_utc_string(script_ctx_t *ctx, vdisp_t *jsthis, jsva int year, day; DWORD lcid_en;
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(isnan(date->time)) { @@ -687,18 +688,18 @@ static inline HRESULT create_utc_string(script_ctx_t *ctx, vdisp_t *jsthis, jsva }
/* ECMA-262 3rd Edition 15.9.5.42 */ -static HRESULT Date_toUTCString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toUTCString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return create_utc_string(ctx, jsthis, r); + return create_utc_string(ctx, vthis, r); }
-static HRESULT Date_toGMTString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toGMTString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return create_utc_string(ctx, jsthis, r); + return create_utc_string(ctx, vthis, r); }
/* ECMA-262 3rd Edition 15.9.5.3 */ @@ -758,19 +759,19 @@ static HRESULT dateobj_to_date_string(DateInstance *date, jsval_t *r) return S_OK; }
-static HRESULT Date_toDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toDateString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
return dateobj_to_date_string(date, r); }
/* ECMA-262 3rd Edition 15.9.5.4 */ -static HRESULT Date_toTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toTimeString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -782,7 +783,7 @@ static HRESULT Date_toTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(isnan(date->time)) { @@ -821,7 +822,7 @@ static HRESULT Date_toTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.6 */ -static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { SYSTEMTIME st; @@ -831,7 +832,7 @@ static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(isnan(date->time)) { @@ -860,7 +861,7 @@ static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, vdisp_t *jsthis, WORD }
/* ECMA-262 3rd Edition 15.9.5.7 */ -static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { SYSTEMTIME st; @@ -870,7 +871,7 @@ static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(isnan(date->time)) { @@ -882,7 +883,7 @@ static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD st = create_systemtime(local_time(date->time, date));
if(st.wYear<1601 || st.wYear>9999) - return Date_toTimeString(ctx, jsthis, flags, argc, argv, r); + return Date_toTimeString(ctx, vthis, flags, argc, argv, r);
if(r) { WCHAR *ptr; @@ -899,14 +900,14 @@ static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, vdisp_t *jsthis, WORD }
/* ECMA-262 3rd Edition 15.9.5.9 */ -static HRESULT Date_getTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getTime(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -915,14 +916,14 @@ static HRESULT Date_getTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
/* ECMA-262 3rd Edition 15.9.5.10 */ -static HRESULT Date_getFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) { @@ -934,14 +935,14 @@ static HRESULT Date_getFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.11 */ -static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -950,13 +951,13 @@ static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag }
/* ECMA-262 3rd Edition 15.9.5.12 */ -static HRESULT Date_getMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Date_getMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -965,14 +966,14 @@ static HRESULT Date_getMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.9.5.13 */ -static HRESULT Date_getUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -981,13 +982,13 @@ static HRESULT Date_getUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.14 */ -static HRESULT Date_getDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Date_getDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -996,14 +997,14 @@ static HRESULT Date_getDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
/* ECMA-262 3rd Edition 15.9.5.15 */ -static HRESULT Date_getUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1012,14 +1013,14 @@ static HRESULT Date_getUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.16 */ -static HRESULT Date_getDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getDay(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1028,14 +1029,14 @@ static HRESULT Date_getDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig }
/* ECMA-262 3rd Edition 15.9.5.17 */ -static HRESULT Date_getUTCDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCDay(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1044,14 +1045,14 @@ static HRESULT Date_getUTCDay(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un }
/* ECMA-262 3rd Edition 15.9.5.18 */ -static HRESULT Date_getHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1060,14 +1061,14 @@ static HRESULT Date_getHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.9.5.19 */ -static HRESULT Date_getUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1076,14 +1077,14 @@ static HRESULT Date_getUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.20 */ -static HRESULT Date_getMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1092,14 +1093,14 @@ static HRESULT Date_getMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.21 */ -static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1108,13 +1109,13 @@ static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags }
/* ECMA-262 3rd Edition 15.9.5.22 */ -static HRESULT Date_getSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Date_getSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1123,14 +1124,14 @@ static HRESULT Date_getSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.23 */ -static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1139,14 +1140,14 @@ static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags }
/* ECMA-262 3rd Edition 15.9.5.24 */ -static HRESULT Date_getMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1155,14 +1156,14 @@ static HRESULT Date_getMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla }
/* ECMA-262 3rd Edition 15.9.5.25 */ -static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1171,14 +1172,14 @@ static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD }
/* ECMA-262 3rd Edition 15.9.5.26 */ -static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date;
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(r) @@ -1187,7 +1188,7 @@ static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, vdisp_t *jsthis, WORD f }
/* ECMA-262 3rd Edition 15.9.5.27 */ -static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setTime(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double n; @@ -1196,7 +1197,7 @@ static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1214,7 +1215,7 @@ static HRESULT Date_setTime(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
/* ECMA-262 3rd Edition 15.9.5.28 */ -static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1223,7 +1224,7 @@ static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1244,7 +1245,7 @@ static HRESULT Date_setMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla }
/* ECMA-262 3rd Edition 15.9.5.29 */ -static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1253,7 +1254,7 @@ static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1274,7 +1275,7 @@ static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD }
/* ECMA-262 3rd Edition 15.9.5.30 */ -static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1283,7 +1284,7 @@ static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1313,7 +1314,7 @@ static HRESULT Date_setSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.31 */ -static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1322,7 +1323,7 @@ static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1352,7 +1353,7 @@ static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags }
/* ECMA-262 3rd Edition 15.9.5.33 */ -static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1361,7 +1362,7 @@ static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1399,7 +1400,7 @@ static HRESULT Date_setMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.34 */ -static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1408,7 +1409,7 @@ static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1446,7 +1447,7 @@ static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags }
/* ECMA-262 3rd Edition 15.9.5.35 */ -static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1455,7 +1456,7 @@ static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1500,7 +1501,7 @@ static HRESULT Date_setHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.9.5.36 */ -static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1509,7 +1510,7 @@ static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1554,7 +1555,7 @@ static HRESULT Date_setUTCHours(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.36 */ -static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1563,7 +1564,7 @@ static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1583,7 +1584,7 @@ static HRESULT Date_setDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
/* ECMA-262 3rd Edition 15.9.5.37 */ -static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1592,7 +1593,7 @@ static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1612,7 +1613,7 @@ static HRESULT Date_setUTCDate(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.9.5.38 */ -static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1621,7 +1622,7 @@ static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1651,7 +1652,7 @@ static HRESULT Date_setMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.9.5.39 */ -static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1660,7 +1661,7 @@ static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1690,7 +1691,7 @@ static HRESULT Date_setUTCMonth(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.40 */ -static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1699,7 +1700,7 @@ static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1736,7 +1737,7 @@ static HRESULT Date_setFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.9.5.41 */ -static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1745,7 +1746,7 @@ static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -1782,7 +1783,7 @@ static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag }
/* ECMA-262 3rd Edition B2.4 */ -static HRESULT Date_getYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_getYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1790,7 +1791,7 @@ static HRESULT Date_getYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
t = local_time(date->time, date); @@ -1807,7 +1808,7 @@ static HRESULT Date_getYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi }
/* ECMA-262 3rd Edition B2.5 */ -static HRESULT Date_setYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Date_setYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; @@ -1816,7 +1817,7 @@ static HRESULT Date_setYear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- if(!(date = date_this(jsthis))) + if(!(date = date_this(vthis))) return JS_E_DATE_EXPECTED;
if(!argc) @@ -2223,7 +2224,7 @@ static inline HRESULT date_parse(jsstr_t *input_str, double *ret) { return S_OK; }
-static HRESULT DateConstr_parse(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT DateConstr_parse(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *parse_str; @@ -2321,7 +2322,7 @@ static HRESULT date_utc(script_ctx_t *ctx, unsigned argc, jsval_t *argv, double return S_OK; }
-static HRESULT DateConstr_UTC(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT DateConstr_UTC(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double n; @@ -2336,7 +2337,7 @@ static HRESULT DateConstr_UTC(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un }
/* ECMA-262 5.1 Edition 15.9.4.4 */ -static HRESULT DateConstr_now(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT DateConstr_now(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n");
@@ -2344,7 +2345,7 @@ static HRESULT DateConstr_now(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return S_OK; }
-static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT DateConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DateInstance *date; diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 5e09553..3a1d380 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -550,7 +550,7 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t
switch(prop->type) { case PROP_BUILTIN: { - vdisp_t vthis; + jsval_t vthis;
if(flags == DISPATCH_CONSTRUCT && (prop->flags & PROPF_METHOD)) { WARN("%s is not a constructor\n", debugstr_w(prop->name)); @@ -560,13 +560,10 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t if(This->builtin_info->class != JSCLASS_FUNCTION && prop->u.p->invoke != JSGlobal_eval) flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK; if(jsthis) - set_disp(&vthis, jsthis); + vthis = jsval_disp(jsthis); else - set_jsdisp(&vthis, This); - hres = prop->u.p->invoke(This->ctx, &vthis, flags, argc, argv, r); - vdisp_release(&vthis); - - return hres; + vthis = jsval_obj(This); + return prop->u.p->invoke(This->ctx, vthis, flags, argc, argv, r); } case PROP_PROTREF: return invoke_prop_func(This->prototype, jsthis ? jsthis : (IDispatch *)&This->IDispatchEx_iface, @@ -1979,17 +1976,13 @@ HRESULT jsdisp_call_value(jsdisp_t *jsfunc, IDispatch *jsthis, WORD flags, unsig if(is_class(jsfunc, JSCLASS_FUNCTION)) { hres = Function_invoke(jsfunc, jsthis, flags, argc, argv, r); }else { - vdisp_t vdisp; - if(!jsfunc->builtin_info->call) { WARN("Not a function\n"); return JS_E_FUNCTION_EXPECTED; }
- set_disp(&vdisp, jsthis); flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK; - hres = jsfunc->builtin_info->call(jsfunc->ctx, &vdisp, flags, argc, argv, r); - vdisp_release(&vdisp); + hres = jsfunc->builtin_info->call(jsfunc->ctx, jsval_disp(jsthis), flags, argc, argv, r); } return hres; } diff --git a/dlls/jscript/enumerator.c b/dlls/jscript/enumerator.c index 038b474..0fc6750 100644 --- a/dlls/jscript/enumerator.c +++ b/dlls/jscript/enumerator.c @@ -38,14 +38,10 @@ static inline EnumeratorInstance *enumerator_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, EnumeratorInstance, dispex); }
-static inline EnumeratorInstance *enumerator_from_vdisp(vdisp_t *vdisp) +static inline EnumeratorInstance *enumerator_this(jsval_t vthis) { - return enumerator_from_jsdisp(vdisp->u.jsdisp); -} - -static inline EnumeratorInstance *enumerator_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_ENUMERATOR) ? enumerator_from_vdisp(jsthis) : NULL; + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_ENUMERATOR)) ? enumerator_from_jsdisp(jsdisp) : NULL; }
static inline HRESULT enumvar_get_next_item(EnumeratorInstance *This) @@ -92,12 +88,12 @@ static void Enumerator_destructor(jsdisp_t *dispex) heap_free(dispex); }
-static HRESULT Enumerator_atEnd(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Enumerator_atEnd(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { EnumeratorInstance *This;
- if (!(This = enumerator_this(jsthis))) + if (!(This = enumerator_this(vthis))) return JS_E_ENUMERATOR_EXPECTED;
TRACE("%d\n", This->atend); @@ -107,20 +103,20 @@ static HRESULT Enumerator_atEnd(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return S_OK; }
-static HRESULT Enumerator_item(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Enumerator_item(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { EnumeratorInstance *This;
TRACE("\n");
- if (!(This = enumerator_this(jsthis))) + if (!(This = enumerator_this(vthis))) return JS_E_ENUMERATOR_EXPECTED;
return r ? jsval_copy(This->item, r) : S_OK; }
-static HRESULT Enumerator_moveFirst(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Enumerator_moveFirst(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { EnumeratorInstance *This; @@ -128,7 +124,7 @@ static HRESULT Enumerator_moveFirst(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla
TRACE("\n");
- if (!(This = enumerator_this(jsthis))) + if (!(This = enumerator_this(vthis))) return JS_E_ENUMERATOR_EXPECTED;
if (This->enumvar) @@ -148,7 +144,7 @@ static HRESULT Enumerator_moveFirst(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla return S_OK; }
-static HRESULT Enumerator_moveNext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Enumerator_moveNext(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { EnumeratorInstance *This; @@ -156,7 +152,7 @@ static HRESULT Enumerator_moveNext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
TRACE("\n");
- if (!(This = enumerator_this(jsthis))) + if (!(This = enumerator_this(vthis))) return JS_E_ENUMERATOR_EXPECTED;
if (This->enumvar) @@ -287,7 +283,7 @@ static HRESULT create_enumerator(script_ctx_t *ctx, jsval_t *argv, jsdisp_t **re return S_OK; }
-static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index 49adaeb..58dc8a8 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -29,17 +29,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
/* ECMA-262 3rd Edition 15.11.4.4 */ -static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, +static HRESULT Error_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - jsdisp_t *jsthis; jsstr_t *name = NULL, *msg = NULL, *ret = NULL; + jsdisp_t *jsthis = NULL; jsval_t v; HRESULT hres;
TRACE("\n");
- jsthis = get_jsdisp(vthis); + if(is_object_instance(vthis)) + jsthis = to_jsdisp(get_object(vthis)); + else if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5) + return JS_E_OBJECT_EXPECTED; + if(!jsthis || ctx->version < 2) { if(r) { jsstr_t *str; @@ -114,7 +118,7 @@ static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, return S_OK; }
-static HRESULT Error_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Error_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -260,56 +264,56 @@ static HRESULT error_constr(script_ctx_t *ctx, WORD flags, unsigned argc, jsval_ } }
-static HRESULT ErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT ErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->error_constr); }
-static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->eval_error_constr); }
-static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->range_error_constr); }
-static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->reference_error_constr); }
-static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->regexp_error_constr); }
-static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->syntax_error_constr); }
-static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); return error_constr(ctx, flags, argc, argv, r, ctx->type_error_constr); }
-static HRESULT URIErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT URIErrorConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 3eef1aa..3730915 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -77,14 +77,10 @@ static inline FunctionInstance *function_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, FunctionInstance, dispex); }
-static inline FunctionInstance *function_from_vdisp(vdisp_t *vdisp) +static inline FunctionInstance *function_this(jsval_t vthis) { - return function_from_jsdisp(vdisp->u.jsdisp); -} - -static inline FunctionInstance *function_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_FUNCTION) ? function_from_vdisp(jsthis) : NULL; + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_FUNCTION)) ? function_from_jsdisp(jsdisp) : NULL; }
static inline ArgumentsInstance *arguments_from_jsdisp(jsdisp_t *jsdisp) @@ -92,7 +88,7 @@ static inline ArgumentsInstance *arguments_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, ArgumentsInstance, jsdisp); }
-static HRESULT Arguments_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Arguments_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); @@ -271,7 +267,7 @@ static HRESULT Function_get_length(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t return S_OK; }
-static HRESULT Function_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Function_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; @@ -280,7 +276,7 @@ static HRESULT Function_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- if(!(function = function_this(jsthis))) + if(!(function = function_this(vthis))) return JS_E_FUNCTION_EXPECTED;
hres = function->vtbl->toString(function, &str); @@ -330,7 +326,7 @@ static HRESULT array_to_args(script_ctx_t *ctx, jsdisp_t *arg_array, unsigned *a return S_OK; }
-static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; jsval_t *args = NULL; @@ -340,7 +336,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
TRACE("\n");
- if(!(function = function_this(jsthis)) && (jsthis->flags & VDISP_JSDISP)) + if(!is_object_instance(vthis) || (!(function = function_this(vthis)) && to_jsdisp(get_object(vthis)))) return JS_E_FUNCTION_EXPECTED;
if(argc) { @@ -377,7 +373,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un hres = function->vtbl->call(ctx, function, this_obj, flags, cnt, args, r); }else { jsval_t res; - hres = disp_call_value(ctx, jsthis->u.disp, this_obj, DISPATCH_METHOD, cnt, args, &res); + hres = disp_call_value(ctx, get_object(vthis), this_obj, DISPATCH_METHOD, cnt, args, &res); if(SUCCEEDED(hres)) { if(r) *r = res; @@ -395,7 +391,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return hres; }
-static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Function_call(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; @@ -405,7 +401,7 @@ static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- if(!(function = function_this(jsthis))) + if(!(function = function_this(vthis))) return JS_E_FUNCTION_EXPECTED;
if(argc) { @@ -425,7 +421,7 @@ static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns return hres; }
-static HRESULT Function_bind(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Function_bind(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { IDispatch *bound_this = NULL; @@ -435,7 +431,7 @@ static HRESULT Function_bind(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- if(!(function = function_this(jsthis))) + if(!(function = function_this(vthis))) return JS_E_FUNCTION_EXPECTED;
if(argc < 1) { @@ -461,19 +457,18 @@ static HRESULT Function_bind(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns return S_OK; }
-HRESULT Function_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function;
TRACE("\n");
- if(!is_vclass(jsthis, JSCLASS_FUNCTION)) { + if(!(function = function_this(vthis))) { ERR("dispex is not a function\n"); return E_FAIL; }
- function = function_from_jsdisp(jsthis->u.jsdisp); return function->vtbl->call(ctx, function, NULL, flags, argc, argv, r); }
@@ -599,18 +594,14 @@ static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, ID unsigned argc, jsval_t *argv, jsval_t *r) { NativeFunction *function = (NativeFunction*)func; - vdisp_t vthis; - HRESULT hres; + jsval_t vthis;
if(this_disp) - set_disp(&vthis, this_disp); + vthis = jsval_disp(this_disp); else - set_disp(&vthis, lookup_global_host(ctx)); - - hres = function->proc(ctx, &vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r); + vthis = jsval_disp(lookup_global_host(ctx));
- vdisp_release(&vthis); - return hres; + return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r); }
static HRESULT NativeFunction_toString(FunctionInstance *func, jsstr_t **ret) @@ -984,7 +975,7 @@ static HRESULT construct_function(script_ctx_t *ctx, unsigned argc, jsval_t *arg return S_OK; }
-static HRESULT FunctionConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT FunctionConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { HRESULT hres; @@ -1011,7 +1002,7 @@ static HRESULT FunctionConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla return S_OK; }
-static HRESULT FunctionProt_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT FunctionProt_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c index c9a00d1..5186f47 100644 --- a/dlls/jscript/global.c +++ b/dlls/jscript/global.c @@ -65,7 +65,7 @@ static WCHAR int_to_char(int i) return 'A'+i-10; }
-static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_escape(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *ret_str, *str; @@ -130,7 +130,7 @@ static HRESULT JSGlobal_escape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }
/* ECMA-262 3rd Edition 15.1.2.1 */ -HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +HRESULT JSGlobal_eval(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { call_frame_t *frame = ctx->call_ctx; @@ -174,7 +174,7 @@ HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned a return hres; }
-static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { BOOL ret = TRUE; @@ -197,7 +197,7 @@ static HRESULT JSGlobal_isNaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return S_OK; }
-static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_isFinite(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { BOOL ret = FALSE; @@ -231,7 +231,7 @@ static INT char_to_int(WCHAR c) return 100; }
-static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { BOOL neg = FALSE, empty = TRUE; @@ -314,7 +314,7 @@ static HRESULT JSGlobal_parseInt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return S_OK; }
-static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { LONGLONG d = 0, hlp; @@ -421,7 +421,7 @@ static inline int hex_to_int(const WCHAR wch) { return -1; }
-static HRESULT JSGlobal_unescape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_unescape(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *ret_str, *str; @@ -491,14 +491,14 @@ static HRESULT JSGlobal_unescape(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return S_OK; }
-static HRESULT JSGlobal_GetObject(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_GetObject(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); return E_NOTIMPL; }
-static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -516,7 +516,7 @@ static HRESULT JSGlobal_ScriptEngine(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl return S_OK; }
-static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -526,7 +526,7 @@ static HRESULT JSGlobal_ScriptEngineMajorVersion(script_ctx_t *ctx, vdisp_t *jst return S_OK; }
-static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -536,7 +536,7 @@ static HRESULT JSGlobal_ScriptEngineMinorVersion(script_ctx_t *ctx, vdisp_t *jst return S_OK; }
-static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -546,7 +546,7 @@ static HRESULT JSGlobal_ScriptEngineBuildVersion(script_ctx_t *ctx, vdisp_t *jst return S_OK; }
-static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { static int once = 0; @@ -555,7 +555,7 @@ static HRESULT JSGlobal_CollectGarbage(script_ctx_t *ctx, vdisp_t *jsthis, WORD return S_OK; }
-static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const WCHAR *ptr, *uri; @@ -620,7 +620,7 @@ static HRESULT JSGlobal_encodeURI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return S_OK; }
-static HRESULT JSGlobal_decodeURI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_decodeURI(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const WCHAR *ptr, *uri; @@ -706,7 +706,7 @@ static HRESULT JSGlobal_decodeURI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return S_OK; }
-static HRESULT JSGlobal_encodeURIComponent(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_encodeURIComponent(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *str, *ret_str; @@ -770,7 +770,7 @@ static HRESULT JSGlobal_encodeURIComponent(script_ctx_t *ctx, vdisp_t *jsthis, W }
/* ECMA-262 3rd Edition 15.1.3.2 */ -static HRESULT JSGlobal_decodeURIComponent(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT JSGlobal_decodeURIComponent(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const WCHAR *ptr, *uri; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index c192ec7..f4e8782 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -138,71 +138,7 @@ typedef enum {
jsdisp_t *iface_to_jsdisp(IDispatch*) DECLSPEC_HIDDEN;
-typedef struct { - union { - IDispatch *disp; - IDispatchEx *dispex; - jsdisp_t *jsdisp; - } u; - DWORD flags; -} vdisp_t; - -#define VDISP_DISPEX 0x0001 -#define VDISP_JSDISP 0x0002 - -static inline void vdisp_release(vdisp_t *vdisp) -{ - IDispatch_Release(vdisp->u.disp); -} - -static inline BOOL is_jsdisp(vdisp_t *vdisp) -{ - return (vdisp->flags & VDISP_JSDISP) != 0; -} - -static inline BOOL is_dispex(vdisp_t *vdisp) -{ - return (vdisp->flags & VDISP_DISPEX) != 0; -} - -static inline void set_jsdisp(vdisp_t *vdisp, jsdisp_t *jsdisp) -{ - vdisp->u.jsdisp = jsdisp; - vdisp->flags = VDISP_JSDISP | VDISP_DISPEX; - IDispatch_AddRef(vdisp->u.disp); -} - -static inline void set_disp(vdisp_t *vdisp, IDispatch *disp) -{ - IDispatchEx *dispex; - jsdisp_t *jsdisp; - HRESULT hres; - - jsdisp = iface_to_jsdisp(disp); - if(jsdisp) { - vdisp->u.jsdisp = jsdisp; - vdisp->flags = VDISP_JSDISP | VDISP_DISPEX; - return; - } - - hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); - if(SUCCEEDED(hres)) { - vdisp->u.dispex = dispex; - vdisp->flags = VDISP_DISPEX; - return; - } - - IDispatch_AddRef(disp); - vdisp->u.disp = disp; - vdisp->flags = 0; -} - -static inline jsdisp_t *get_jsdisp(vdisp_t *vdisp) -{ - return is_jsdisp(vdisp) ? vdisp->u.jsdisp : NULL; -} - -typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,vdisp_t*,WORD,unsigned,jsval_t*,jsval_t*); +typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*); typedef HRESULT (*builtin_getter_t)(script_ctx_t*,jsdisp_t*,jsval_t*); typedef HRESULT (*builtin_setter_t)(script_ctx_t*,jsdisp_t*,jsval_t);
@@ -337,7 +273,7 @@ HRESULT create_builtin_constructor(script_ctx_t*,builtin_invoke_t,const WCHAR*,c jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT Function_invoke(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
-HRESULT Function_value(script_ctx_t*,vdisp_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; struct _function_code_t *Function_get_code(jsdisp_t*) DECLSPEC_HIDDEN;
@@ -513,18 +449,13 @@ HRESULT regexp_string_match(script_ctx_t*,jsdisp_t*,jsstr_t*,jsval_t*) DECLSPEC_ BOOL bool_obj_value(jsdisp_t*) DECLSPEC_HIDDEN; unsigned array_get_length(jsdisp_t*) DECLSPEC_HIDDEN;
-HRESULT JSGlobal_eval(script_ctx_t*,vdisp_t*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN; +HRESULT JSGlobal_eval(script_ctx_t*,jsval_t,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
static inline BOOL is_class(jsdisp_t *jsdisp, jsclass_t class) { return jsdisp->builtin_info->class == class; }
-static inline BOOL is_vclass(vdisp_t *vdisp, jsclass_t class) -{ - return is_jsdisp(vdisp) && is_class(vdisp->u.jsdisp, class); -} - static inline BOOL is_int32(double d) { return INT32_MIN <= d && d <= INT32_MAX && (double)(int)d == d; diff --git a/dlls/jscript/json.c b/dlls/jscript/json.c index d3896ca..e0867eb 100644 --- a/dlls/jscript/json.c +++ b/dlls/jscript/json.c @@ -268,7 +268,7 @@ static HRESULT parse_json_value(json_parse_ctx_t *ctx, jsval_t *r) }
/* ECMA-262 5.1 Edition 15.12.2 */ -static HRESULT JSON_parse(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT JSON_parse(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { json_parse_ctx_t parse_ctx; const WCHAR *buf; @@ -749,7 +749,7 @@ static HRESULT stringify(stringify_ctx_t *ctx, jsdisp_t *object, const WCHAR *na }
/* ECMA-262 5.1 Edition 15.12.3 */ -static HRESULT JSON_stringify(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT JSON_stringify(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { stringify_ctx_t stringify_ctx = { ctx }; jsdisp_t *obj = NULL, *replacer; diff --git a/dlls/jscript/jsregexp.c b/dlls/jscript/jsregexp.c index cb6c051..33f1538 100644 --- a/dlls/jscript/jsregexp.c +++ b/dlls/jscript/jsregexp.c @@ -39,9 +39,10 @@ static inline RegExpInstance *regexp_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, RegExpInstance, dispex); }
-static inline RegExpInstance *regexp_from_vdisp(vdisp_t *vdisp) +static inline RegExpInstance *regexp_this(jsval_t vthis) { - return regexp_from_jsdisp(vdisp->u.jsdisp); + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_REGEXP)) ? regexp_from_jsdisp(jsdisp) : NULL; }
static void set_last_index(RegExpInstance *This, DWORD last_index) @@ -294,7 +295,7 @@ static HRESULT RegExp_set_lastIndex(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t return S_OK; }
-static HRESULT RegExp_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT RegExp_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { RegExpInstance *regexp; @@ -304,12 +305,11 @@ static HRESULT RegExp_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- if(!is_vclass(jsthis, JSCLASS_REGEXP)) { + if(!(regexp = regexp_this(vthis))) { WARN("Not a RegExp\n"); return JS_E_REGEXP_EXPECTED; }
- regexp = regexp_from_vdisp(jsthis);
if(!r) return S_OK; @@ -408,7 +408,7 @@ static HRESULT create_match_array(script_ctx_t *ctx, jsstr_t *input_str, return S_OK; }
-static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t arg, +static HRESULT run_exec(script_ctx_t *ctx, jsval_t vthis, jsval_t arg, jsstr_t **input, match_state_t **result, BOOL *ret) { RegExpInstance *regexp; @@ -418,13 +418,11 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t arg, jsstr_t *jsstr; HRESULT hres;
- if(!is_vclass(jsthis, JSCLASS_REGEXP)) { - FIXME("Not a RegExp\n"); - return E_NOTIMPL; + if(!(regexp = regexp_this(vthis))) { + WARN("Not a RegExp\n"); + return JS_E_REGEXP_EXPECTED; }
- regexp = regexp_from_vdisp(jsthis); - hres = to_flat_string(ctx, arg, &jsstr, &string); if(FAILED(hres)) return hres; @@ -463,7 +461,7 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t arg, return S_OK; }
-static HRESULT RegExp_exec(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT RegExp_exec(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { match_state_t *match; @@ -476,7 +474,7 @@ static HRESULT RegExp_exec(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig
mark = heap_pool_mark(&ctx->tmp_heap);
- hres = run_exec(ctx, jsthis, argc ? argv[0] : jsval_string(jsstr_empty()), &string, &match, &b); + hres = run_exec(ctx, vthis, argc ? argv[0] : jsval_string(jsstr_empty()), &string, &match, &b); if(FAILED(hres)) { heap_pool_clear(mark); return hres; @@ -499,7 +497,7 @@ static HRESULT RegExp_exec(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig return hres; }
-static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT RegExp_test(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { match_state_t *match; @@ -511,7 +509,7 @@ static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig TRACE("\n");
mark = heap_pool_mark(&ctx->tmp_heap); - hres = run_exec(ctx, jsthis, argc ? argv[0] : jsval_string(undef_str = jsstr_undefined()), NULL, &match, &b); + hres = run_exec(ctx, vthis, argc ? argv[0] : jsval_string(undef_str = jsstr_undefined()), NULL, &match, &b); heap_pool_clear(mark); if(!argc) jsstr_release(undef_str); @@ -523,7 +521,7 @@ static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig return S_OK; }
-static HRESULT RegExp_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT RegExp_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); @@ -886,7 +884,7 @@ static HRESULT RegExpConstr_get_rightContext(script_ctx_t *ctx, jsdisp_t *jsthis return S_OK; }
-static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT RegExpConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c index c65bbaf..46dd58c 100644 --- a/dlls/jscript/math.c +++ b/dlls/jscript/math.c @@ -29,7 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
/* ECMA-262 3rd Edition 15.8.2.12 */ -static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_abs(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double d; @@ -52,7 +52,7 @@ static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return S_OK; }
-static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_acos(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -75,7 +75,7 @@ static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_asin(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -98,7 +98,7 @@ static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_atan(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -121,7 +121,7 @@ static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_atan2(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x, y; @@ -149,7 +149,7 @@ static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsign }
/* ECMA-262 3rd Edition 15.8.2.6 */ -static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_ceil(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -172,7 +172,7 @@ static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_cos(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -195,7 +195,7 @@ static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return S_OK; }
-static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_exp(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -218,7 +218,7 @@ static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return S_OK; }
-static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_floor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -241,7 +241,7 @@ static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsign return S_OK; }
-static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_log(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -265,7 +265,7 @@ static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned }
/* ECMA-262 3rd Edition 15.8.2.11 */ -static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_max(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DOUBLE max, d; @@ -299,7 +299,7 @@ static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned }
/* ECMA-262 3rd Edition 15.8.2.12 */ -static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_min(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { DOUBLE min, d; @@ -333,7 +333,7 @@ static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned }
/* ECMA-262 3rd Edition 15.8.2.13 */ -static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_pow(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x, y; @@ -361,7 +361,7 @@ static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned }
/* ECMA-262 3rd Edition 15.8.2.14 */ -static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_random(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { UINT x; @@ -377,7 +377,7 @@ static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig }
/* ECMA-262 3rd Edition 15.8.2.15 */ -static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_round(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -400,7 +400,7 @@ static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsign return S_OK; }
-static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_sin(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -423,7 +423,7 @@ static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return S_OK; }
-static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_sqrt(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; @@ -446,7 +446,7 @@ static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Math_tan(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double x; diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c index 410f27b..472acd0 100644 --- a/dlls/jscript/number.c +++ b/dlls/jscript/number.c @@ -39,14 +39,16 @@ static inline NumberInstance *number_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, NumberInstance, dispex); }
-static inline NumberInstance *number_from_vdisp(vdisp_t *vdisp) +static inline HRESULT numberval_this(jsval_t vthis, DOUBLE *ret) { - return number_from_jsdisp(vdisp->u.jsdisp); -} - -static inline NumberInstance *number_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_NUMBER) ? number_from_vdisp(jsthis) : NULL; + jsdisp_t *jsdisp; + if(is_number(vthis)) + *ret = get_number(vthis); + else if(is_object_instance(vthis) && (jsdisp = to_jsdisp(get_object(vthis))) && is_class(jsdisp, JSCLASS_NUMBER)) + *ret = number_from_jsdisp(jsdisp)->value; + else + return JS_E_NUMBER_EXPECTED; + return S_OK; }
static inline void number_to_str(double d, WCHAR *buf, int size, int *dec_point) @@ -222,10 +224,9 @@ static inline jsstr_t *number_to_exponential(double val, int prec) }
/* ECMA-262 3rd Edition 15.7.4.2 */ -static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - NumberInstance *number; INT radix = 10; DOUBLE val; jsstr_t *str; @@ -233,8 +234,9 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- if(!(number = number_this(jsthis))) - return JS_E_NUMBER_EXPECTED; + hres = numberval_this(vthis, &val); + if(FAILED(hres)) + return hres;
if(argc) { hres = to_int32(ctx, argv[0], &radix); @@ -245,8 +247,6 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u return JS_E_INVALIDARG; }
- val = number->value; - if(radix==10 || !isfinite(val)) { hres = to_string(ctx, jsval_number(val), &str); if(FAILED(hres)) @@ -341,17 +341,16 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u return S_OK; }
-static HRESULT Number_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); return E_NOTIMPL; }
-static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_toFixed(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - NumberInstance *number; DOUBLE val; INT prec = 0; jsstr_t *str; @@ -359,8 +358,9 @@ static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
TRACE("\n");
- if(!(number = number_this(jsthis))) - return JS_E_NUMBER_EXPECTED; + hres = numberval_this(vthis, &val); + if(FAILED(hres)) + return hres;
if(argc) { hres = to_int32(ctx, argv[0], &prec); @@ -371,7 +371,6 @@ static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return JS_E_FRACTION_DIGITS_OUT_OF_RANGE; }
- val = number->value; if(!isfinite(val)) { hres = to_string(ctx, jsval_number(val), &str); if(FAILED(hres)) @@ -389,10 +388,9 @@ static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return S_OK; }
-static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_toExponential(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - NumberInstance *number; DOUBLE val; INT prec = 0; jsstr_t *str; @@ -400,8 +398,9 @@ static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla
TRACE("\n");
- if(!(number = number_this(jsthis))) - return JS_E_NUMBER_EXPECTED; + hres = numberval_this(vthis, &val); + if(FAILED(hres)) + return hres;
if(argc) { hres = to_int32(ctx, argv[0], &prec); @@ -412,7 +411,6 @@ static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla return JS_E_FRACTION_DIGITS_OUT_OF_RANGE; }
- val = number->value; if(!isfinite(val)) { hres = to_string(ctx, jsval_number(val), &str); if(FAILED(hres)) @@ -432,17 +430,17 @@ static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla return S_OK; }
-static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_toPrecision(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - NumberInstance *number; INT prec = 0, size; jsstr_t *str; DOUBLE val; HRESULT hres;
- if(!(number = number_this(jsthis))) - return JS_E_NUMBER_EXPECTED; + hres = numberval_this(vthis, &val); + if(FAILED(hres)) + return hres;
if(argc) { hres = to_int32(ctx, argv[0], &prec); @@ -453,7 +451,6 @@ static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return JS_E_PRECISION_OUT_OF_RANGE; }
- val = number->value; if(!isfinite(val) || !prec) { hres = to_string(ctx, jsval_number(val), &str); if(FAILED(hres)) @@ -479,18 +476,20 @@ static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return S_OK; }
-static HRESULT Number_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Number_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - NumberInstance *number; + HRESULT hres; + DOUBLE val;
TRACE("\n");
- if(!(number = number_this(jsthis))) - return JS_E_NUMBER_EXPECTED; + hres = numberval_this(vthis, &val); + if(FAILED(hres)) + return hres;
if(r) - *r = jsval_number(number->value); + *r = jsval_number(val); return S_OK; }
@@ -520,7 +519,7 @@ static const builtin_info_t NumberInst_info = { NULL };
-static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT NumberConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { double n; diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 24692f8..8426c16 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -24,11 +24,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
-static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + const WCHAR *str = L"[object Object]"; jsdisp_t *jsdisp; - const WCHAR *str; + IDispatch *disp; + HRESULT hres;
/* Keep in sync with jsclass_t enum */ static const WCHAR *names[] = { @@ -54,7 +56,14 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u
TRACE("\n");
- jsdisp = get_jsdisp(jsthis); + if(is_undefined(vthis) || is_null(vthis)) + goto set_output; + + hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres; + + jsdisp = to_jsdisp(disp); if(!jsdisp) { str = L"[object Object]"; }else if(names[jsdisp->builtin_info->class]) { @@ -62,9 +71,13 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u }else { assert(jsdisp->builtin_info->class != JSCLASS_NONE); FIXME("jsdisp->builtin_info->class = %d\n", jsdisp->builtin_info->class); - return E_FAIL; + hres = E_FAIL; } + IDispatch_Release(disp); + if(FAILED(hres)) + return hres;
+set_output: if(r) { jsstr_t *ret; ret = jsstr_alloc(str); @@ -76,34 +89,56 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u return S_OK; }
-static HRESULT Object_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + jsdisp_t *jsdisp; + IDispatch *disp; + HRESULT hres; + TRACE("\n");
- if(!is_jsdisp(jsthis)) { + hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres; + + if(!(jsdisp = to_jsdisp(disp))) { FIXME("Host object this\n"); - return E_FAIL; + hres = E_FAIL; + goto done; }
- return jsdisp_call_name(jsthis->u.jsdisp, L"toString", DISPATCH_METHOD, 0, NULL, r); + hres = jsdisp_call_name(jsdisp, L"toString", DISPATCH_METHOD, 0, NULL, r); +done: + IDispatch_Release(disp); + return hres; }
-static HRESULT Object_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + IDispatch *disp; + HRESULT hres; + TRACE("\n");
- if(r) { - IDispatch_AddRef(jsthis->u.disp); - *r = jsval_disp(jsthis->u.disp); - } + hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres; + + if(r) + *r = jsval_disp(disp); + else + IDispatch_Release(disp); return S_OK; }
-static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + IDispatchEx *dispex; + jsdisp_t *jsdisp; + IDispatch *disp; jsstr_t *name; DISPID id; BSTR bstr; @@ -111,33 +146,39 @@ static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl
TRACE("\n");
+ hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres; + if(!argc) { if(r) *r = jsval_bool(FALSE); - return S_OK; + goto done; }
hres = to_string(ctx, argv[0], &name); if(FAILED(hres)) - return hres; + goto done;
- if(is_jsdisp(jsthis)) { + if((jsdisp = to_jsdisp(disp))) { property_desc_t prop_desc; const WCHAR *name_str;
name_str = jsstr_flatten(name); if(!name_str) { jsstr_release(name); - return E_OUTOFMEMORY; + hres = E_OUTOFMEMORY; + goto done; }
- hres = jsdisp_get_own_property(jsthis->u.jsdisp, name_str, TRUE, &prop_desc); + hres = jsdisp_get_own_property(jsdisp, name_str, TRUE, &prop_desc); jsstr_release(name); if(FAILED(hres) && hres != DISP_E_UNKNOWNNAME) - return hres; + goto done;
if(r) *r = jsval_bool(hres == S_OK); - return S_OK; + hres = S_OK; + goto done; }
@@ -145,66 +186,91 @@ static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl if(bstr) jsstr_flush(name, bstr); jsstr_release(name); - if(!bstr) - return E_OUTOFMEMORY; - - if(is_dispex(jsthis)) - hres = IDispatchEx_GetDispID(jsthis->u.dispex, bstr, make_grfdex(ctx, fdexNameCaseSensitive), &id); - else - hres = IDispatch_GetIDsOfNames(jsthis->u.disp, &IID_NULL, &bstr, 1, ctx->lcid, &id); + if(!bstr) { + hres = E_OUTOFMEMORY; + goto done; + }
+ hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); + if(SUCCEEDED(hres)) { + hres = IDispatchEx_GetDispID(dispex, bstr, make_grfdex(ctx, fdexNameCaseSensitive), &id); + IDispatchEx_Release(dispex); + }else { + hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, &bstr, 1, ctx->lcid, &id); + } SysFreeString(bstr); if(r) *r = jsval_bool(SUCCEEDED(hres)); - return S_OK; + hres = S_OK; +done: + IDispatch_Release(disp); + return hres; }
-static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { property_desc_t prop_desc; const WCHAR *name; jsstr_t *name_str; + jsdisp_t *jsdisp; + IDispatch *disp; HRESULT hres;
TRACE("\n");
+ hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres; + if(argc != 1) { FIXME("argc %d not supported\n", argc); - return E_NOTIMPL; + hres = E_NOTIMPL; + goto done; }
- if(!is_jsdisp(jsthis)) { + if(!(jsdisp = to_jsdisp(disp))) { FIXME("Host object this\n"); - return E_FAIL; + hres = E_FAIL; + goto done; }
hres = to_flat_string(ctx, argv[0], &name_str, &name); if(FAILED(hres)) - return hres; + goto done;
- hres = jsdisp_get_own_property(jsthis->u.jsdisp, name, TRUE, &prop_desc); + hres = jsdisp_get_own_property(jsdisp, name, TRUE, &prop_desc); jsstr_release(name_str); if(FAILED(hres) && hres != DISP_E_UNKNOWNNAME) - return hres; + goto done;
if(r) *r = jsval_bool(hres == S_OK && (prop_desc.flags & PROPF_ENUMERABLE) != 0); - return S_OK; + hres = S_OK; +done: + IDispatch_Release(disp); + return hres; }
-static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - jsdisp_t *jsdisp; + jsdisp_t *jsthis, *jsdisp; + IDispatch *disp; BOOL ret = FALSE; + HRESULT hres; + + hres = to_object(ctx, vthis, &disp); + if(FAILED(hres)) + return hres;
if(!r) - return S_OK; + goto done;
- if(argc && is_jsdisp(jsthis) && is_object_instance(argv[0]) && (jsdisp = to_jsdisp(get_object(argv[0])))) { + if(argc && (jsthis = to_jsdisp(disp)) && is_object_instance(argv[0]) && + (jsdisp = to_jsdisp(get_object(argv[0])))) { while(jsdisp->prototype) { - if(jsdisp->prototype == jsthis->u.jsdisp) { + if(jsdisp->prototype == jsthis) { ret = TRUE; break; } @@ -213,7 +279,9 @@ static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla }
*r = jsval_bool(ret); - return S_OK; +done: + IDispatch_Release(disp); + return hres; }
static HRESULT Object_get_proto_(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) @@ -466,7 +534,7 @@ static HRESULT jsdisp_define_properties(script_ctx_t *ctx, jsdisp_t *obj, jsval_ return FAILED(hres) ? hres : S_OK; }
-static HRESULT Object_defineProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_defineProperty(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { property_desc_t prop_desc; @@ -515,7 +583,7 @@ static HRESULT Object_defineProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl return hres; }
-static HRESULT Object_defineProperties(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_defineProperties(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -534,7 +602,7 @@ static HRESULT Object_defineProperties(script_ctx_t *ctx, vdisp_t *jsthis, WORD return hres; }
-static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { property_desc_t prop_desc; @@ -597,7 +665,7 @@ static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, vdisp_t *jsthi return hres; }
-static HRESULT Object_create(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_create(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *proto = NULL, *obj; @@ -636,7 +704,7 @@ static HRESULT Object_create(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return hres; }
-static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -704,7 +772,7 @@ static HRESULT object_keys(script_ctx_t *ctx, jsval_t arg, enum jsdisp_enum_type return hres; }
-static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_keys(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t arg = argc ? argv[0] : jsval_undefined(); @@ -714,7 +782,7 @@ static HRESULT Object_keys(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, return object_keys(ctx, arg, JSDISP_ENUM_OWN_ENUMERABLE, r); }
-static HRESULT Object_getOwnPropertyNames(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Object_getOwnPropertyNames(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t arg = argc ? argv[0] : jsval_undefined(); @@ -724,7 +792,7 @@ static HRESULT Object_getOwnPropertyNames(script_ctx_t *ctx, vdisp_t *jsthis, WO return object_keys(ctx, arg, JSDISP_ENUM_OWN, r); }
-static HRESULT Object_preventExtensions(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Object_preventExtensions(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj;
@@ -746,7 +814,7 @@ static HRESULT Object_preventExtensions(script_ctx_t *ctx, vdisp_t *jsthis, WORD return S_OK; }
-static HRESULT Object_freeze(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, +static HRESULT Object_freeze(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -769,7 +837,7 @@ static HRESULT Object_freeze(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns return S_OK; }
-static HRESULT Object_seal(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, +static HRESULT Object_seal(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -792,7 +860,7 @@ static HRESULT Object_seal(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig return S_OK; }
-static HRESULT Object_isExtensible(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) +static HRESULT Object_isExtensible(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj;
@@ -813,7 +881,7 @@ static HRESULT Object_isExtensible(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag return S_OK; }
-static HRESULT Object_isFrozen(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, +static HRESULT Object_isFrozen(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -835,7 +903,7 @@ static HRESULT Object_isFrozen(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, u return S_OK; }
-static HRESULT Object_isSealed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, +static HRESULT Object_isSealed(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *obj; @@ -882,7 +950,7 @@ static const builtin_info_t ObjectConstr_info = { NULL };
-static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT ObjectConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { HRESULT hres; diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c index 5ae41d8..35edcf8 100644 --- a/dlls/jscript/set.c +++ b/dlls/jscript/set.c @@ -37,42 +37,42 @@ typedef struct { size_t size; } MapInstance;
-static HRESULT Set_add(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_add(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("%p\n", jsthis); + FIXME("%p\n", debugstr_jsval(vthis)); return E_NOTIMPL; }
-static HRESULT Set_clear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("%p\n", jsthis); + FIXME("%p\n", debugstr_jsval(vthis)); return E_NOTIMPL; }
-static HRESULT Set_delete(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_delete(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("%p\n", jsthis); + FIXME("%p\n", debugstr_jsval(vthis)); return E_NOTIMPL; }
-static HRESULT Set_forEach(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("%p\n", jsthis); + FIXME("%p\n", debugstr_jsval(vthis)); return E_NOTIMPL; }
-static HRESULT Set_has(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_has(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("%p\n", jsthis); + FIXME("%p\n", debugstr_jsval(vthis)); return E_NOTIMPL; }
-static HRESULT Set_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); @@ -104,7 +104,7 @@ static const builtin_info_t Set_info = { NULL };
-static HRESULT Set_constructor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Set_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { SetInstance *set; @@ -176,14 +176,19 @@ static int jsval_map_compare(const void *k, const struct wine_rb_entry *e) } }
-static MapInstance *get_map_this(vdisp_t *jsthis) +static HRESULT get_map_this(jsval_t vthis, MapInstance **ret) { - if(!(jsthis->flags & VDISP_JSDISP) || !is_class(jsthis->u.jsdisp, JSCLASS_MAP)) { + jsdisp_t *jsdisp; + + if(!is_object_instance(vthis)) + return JS_E_OBJECT_EXPECTED; + if(!(jsdisp = to_jsdisp(get_object(vthis))) || !is_class(jsdisp, JSCLASS_MAP)) { WARN("not a Map object passed as 'this'\n"); - return NULL; + return JS_E_MAP_EXPECTED; }
- return CONTAINING_RECORD(jsthis->u.jsdisp, MapInstance, dispex); + *ret = CONTAINING_RECORD(jsdisp, MapInstance, dispex); + return S_OK; }
static struct jsval_map_entry *get_map_entry(MapInstance *map, jsval_t key) @@ -215,12 +220,15 @@ static void delete_map_entry(MapInstance *map, struct jsval_map_entry *entry) release_map_entry(entry); }
-static HRESULT Map_clear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { MapInstance *map; + HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p\n", map);
@@ -233,14 +241,17 @@ static HRESULT Map_clear(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigne return S_OK; }
-static HRESULT Map_delete(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_delete(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t key = argc >= 1 ? argv[0] : jsval_undefined(); struct jsval_map_entry *entry; MapInstance *map; + HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p (%s)\n", map, debugstr_jsval(key));
@@ -249,7 +260,7 @@ static HRESULT Map_delete(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsign return S_OK; }
-static HRESULT Map_forEach(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_forEach(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t callback = argc ? argv[0] : jsval_undefined(); @@ -257,7 +268,9 @@ static HRESULT Map_forEach(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig MapInstance *map; HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p (%s)\n", map, debugstr_jsval(argc >= 1 ? argv[0] : jsval_undefined()));
@@ -290,14 +303,17 @@ static HRESULT Map_forEach(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig return S_OK; }
-static HRESULT Map_get(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_get(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t key = argc >= 1 ? argv[0] : jsval_undefined(); struct jsval_map_entry *entry; MapInstance *map; + HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p (%s)\n", map, debugstr_jsval(key));
@@ -309,7 +325,7 @@ static HRESULT Map_get(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return r ? jsval_copy(entry->value, r) : S_OK; }
-static HRESULT Map_set(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_set(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t key = argc >= 1 ? argv[0] : jsval_undefined(); @@ -318,7 +334,9 @@ static HRESULT Map_set(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned MapInstance *map; HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p (%s %s)\n", map, debugstr_jsval(key), debugstr_jsval(value));
@@ -353,14 +371,17 @@ static HRESULT Map_set(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned return S_OK; }
-static HRESULT Map_has(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_has(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsval_t key = argc >= 1 ? argv[0] : jsval_undefined(); struct jsval_map_entry *entry; MapInstance *map; + HRESULT hres;
- if(!(map = get_map_this(jsthis))) return JS_E_MAP_EXPECTED; + hres = get_map_this(vthis, &map); + if(FAILED(hres)) + return hres;
TRACE("%p (%s)\n", map, debugstr_jsval(key));
@@ -379,7 +400,7 @@ static HRESULT Map_get_size(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) return S_OK; }
-static HRESULT Map_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); @@ -430,7 +451,7 @@ static const builtin_info_t Map_info = { NULL };
-static HRESULT Map_constructor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT Map_constructor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { MapInstance *map; diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 5958216..e995660 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -36,33 +36,32 @@ static inline StringInstance *string_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, StringInstance, dispex); }
-static inline StringInstance *string_from_vdisp(vdisp_t *vdisp) +static inline StringInstance *string_this(jsval_t vthis) { - return string_from_jsdisp(vdisp->u.jsdisp); + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_STRING)) ? string_from_jsdisp(jsdisp) : NULL; }
-static inline StringInstance *string_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_STRING) ? string_from_vdisp(jsthis) : NULL; -} - -static HRESULT get_string_val(script_ctx_t *ctx, vdisp_t *jsthis, jsstr_t **val) +static HRESULT get_string_val(script_ctx_t *ctx, jsval_t vthis, jsstr_t **val) { StringInstance *string;
- if((string = string_this(jsthis))) { + if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5 && (is_undefined(vthis) || is_null(vthis))) + return JS_E_OBJECT_EXPECTED; + + if((string = string_this(vthis))) { *val = jsstr_addref(string->str); return S_OK; }
- return to_string(ctx, jsval_disp(jsthis->u.disp), val); + return to_string(ctx, vthis, val); }
-static HRESULT get_string_flat_val(script_ctx_t *ctx, vdisp_t *jsthis, jsstr_t **jsval, const WCHAR **val) +static HRESULT get_string_flat_val(script_ctx_t *ctx, jsval_t vthis, jsstr_t **jsval, const WCHAR **val) { HRESULT hres;
- hres = get_string_val(ctx, jsthis, jsval); + hres = get_string_val(ctx, vthis, jsval); if(FAILED(hres)) return hres;
@@ -84,11 +83,11 @@ static HRESULT String_get_length(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r return S_OK; }
-static HRESULT stringobj_to_string(vdisp_t *jsthis, jsval_t *r) +static HRESULT stringobj_to_string(jsval_t vthis, jsval_t *r) { StringInstance *string;
- if(!(string = string_this(jsthis))) { + if(!(string = string_this(vthis))) { WARN("this is not a string object\n"); return E_FAIL; } @@ -99,31 +98,31 @@ static HRESULT stringobj_to_string(vdisp_t *jsthis, jsval_t *r) }
/* ECMA-262 3rd Edition 15.5.4.2 */ -static HRESULT String_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n");
- return stringobj_to_string(jsthis, r); + return stringobj_to_string(vthis, r); }
/* ECMA-262 3rd Edition 15.5.4.2 */ -static HRESULT String_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n");
- return stringobj_to_string(jsthis, r); + return stringobj_to_string(vthis, r); }
-static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r, const WCHAR *tagname) +static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, jsval_t vthis, jsval_t *r, const WCHAR *tagname) { unsigned tagname_len; jsstr_t *str, *ret; WCHAR *ptr; HRESULT hres;
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -158,13 +157,13 @@ static HRESULT do_attributeless_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, j return S_OK; }
-static HRESULT do_attribute_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, unsigned argc, jsval_t *argv, jsval_t *r, +static HRESULT do_attribute_tag_format(script_ctx_t *ctx, jsval_t vthis, unsigned argc, jsval_t *argv, jsval_t *r, const WCHAR *tagname, const WCHAR *attrname) { jsstr_t *str, *attr_value = NULL; HRESULT hres;
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -216,32 +215,32 @@ static HRESULT do_attribute_tag_format(script_ctx_t *ctx, vdisp_t *jsthis, unsig return hres; }
-static HRESULT String_anchor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_anchor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attribute_tag_format(ctx, jsthis, argc, argv, r, L"A", L"NAME"); + return do_attribute_tag_format(ctx, vthis, argc, argv, r, L"A", L"NAME"); }
-static HRESULT String_big(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_big(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"BIG"); + return do_attributeless_tag_format(ctx, vthis, r, L"BIG"); }
-static HRESULT String_blink(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_blink(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"BLINK"); + return do_attributeless_tag_format(ctx, vthis, r, L"BLINK"); }
-static HRESULT String_bold(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_bold(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"B"); + return do_attributeless_tag_format(ctx, vthis, r, L"B"); }
/* ECMA-262 3rd Edition 15.5.4.5 */ -static HRESULT String_charAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_charAt(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *str, *ret; @@ -250,7 +249,7 @@ static HRESULT String_charAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -283,7 +282,7 @@ static HRESULT String_charAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.5.4.5 */ -static HRESULT String_charCodeAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_charCodeAt(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *str; @@ -292,7 +291,7 @@ static HRESULT String_charCodeAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -326,7 +325,7 @@ static HRESULT String_charCodeAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition 15.5.4.6 */ -static HRESULT String_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_concat(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsstr_t *ret = NULL, *str; @@ -334,7 +333,7 @@ static HRESULT String_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -411,25 +410,25 @@ static HRESULT String_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns return S_OK; }
-static HRESULT String_fixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_fixed(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"TT"); + return do_attributeless_tag_format(ctx, vthis, r, L"TT"); }
-static HRESULT String_fontcolor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_fontcolor(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attribute_tag_format(ctx, jsthis, argc, argv, r, L"FONT", L"COLOR"); + return do_attribute_tag_format(ctx, vthis, argc, argv, r, L"FONT", L"COLOR"); }
-static HRESULT String_fontsize(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_fontsize(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attribute_tag_format(ctx, jsthis, argc, argv, r, L"FONT", L"SIZE"); + return do_attribute_tag_format(ctx, vthis, argc, argv, r, L"FONT", L"SIZE"); }
-static HRESULT String_indexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_indexOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { unsigned pos = 0, search_len, length; @@ -440,7 +439,7 @@ static HRESULT String_indexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
TRACE("\n");
- hres = get_string_flat_val(ctx, jsthis, &jsstr, &str); + hres = get_string_flat_val(ctx, vthis, &jsstr, &str); if(FAILED(hres)) return hres;
@@ -490,14 +489,14 @@ static HRESULT String_indexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return S_OK; }
-static HRESULT String_italics(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_italics(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"I"); + return do_attributeless_tag_format(ctx, vthis, r, L"I"); }
/* ECMA-262 3rd Edition 15.5.4.8 */ -static HRESULT String_lastIndexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_lastIndexOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { unsigned pos = 0, search_len, length; @@ -508,7 +507,7 @@ static HRESULT String_lastIndexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
TRACE("\n");
- hres = get_string_flat_val(ctx, jsthis, &jsstr, &str); + hres = get_string_flat_val(ctx, vthis, &jsstr, &str); if(FAILED(hres)) return hres;
@@ -559,14 +558,14 @@ static HRESULT String_lastIndexOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags return S_OK; }
-static HRESULT String_link(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_link(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attribute_tag_format(ctx, jsthis, argc, argv, r, L"A", L"HREF"); + return do_attribute_tag_format(ctx, vthis, argc, argv, r, L"A", L"HREF"); }
/* ECMA-262 3rd Edition 15.5.4.10 */ -static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_match(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *regexp = NULL; @@ -602,7 +601,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi return hres; }
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(SUCCEEDED(hres)) hres = regexp_string_match(ctx, regexp, str, r);
@@ -718,7 +717,7 @@ static HRESULT rep_call(script_ctx_t *ctx, jsdisp_t *func, }
/* ECMA-262 3rd Edition 15.5.4.11 */ -static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_replace(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const WCHAR *str, *match_str = NULL, *rep_str = NULL; @@ -732,7 +731,7 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
TRACE("\n");
- hres = get_string_flat_val(ctx, jsthis, &jsstr, &str); + hres = get_string_flat_val(ctx, vthis, &jsstr, &str); if(FAILED(hres)) return hres;
@@ -938,7 +937,7 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un return hres; }
-static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_search(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *regexp = NULL; @@ -949,7 +948,7 @@ static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- hres = get_string_flat_val(ctx, jsthis, &jsstr, &str); + hres = get_string_flat_val(ctx, vthis, &jsstr, &str); if(FAILED(hres)) return hres;
@@ -989,7 +988,7 @@ static HRESULT String_search(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns }
/* ECMA-262 3rd Edition 15.5.4.13 */ -static HRESULT String_slice(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_slice(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { int start=0, end, length; @@ -999,7 +998,7 @@ static HRESULT String_slice(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -1065,13 +1064,13 @@ static HRESULT String_slice(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi return S_OK; }
-static HRESULT String_small(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_small(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"SMALL"); + return do_attributeless_tag_format(ctx, vthis, r, L"SMALL"); }
-static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_split(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { match_state_t match_result, *match_ptr = &match_result; @@ -1082,7 +1081,7 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi jsstr_t *jsstr, *match_jsstr, *tmp_str; HRESULT hres;
- hres = get_string_flat_val(ctx, jsthis, &jsstr, &str); + hres = get_string_flat_val(ctx, vthis, &jsstr, &str); if(FAILED(hres)) return hres; length = jsstr_length(jsstr); @@ -1231,20 +1230,20 @@ static HRESULT String_split(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi return hres; }
-static HRESULT String_strike(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_strike(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"STRIKE"); + return do_attributeless_tag_format(ctx, vthis, r, L"STRIKE"); }
-static HRESULT String_sub(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_sub(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"SUB"); + return do_attributeless_tag_format(ctx, vthis, r, L"SUB"); }
/* ECMA-262 3rd Edition 15.5.4.15 */ -static HRESULT String_substring(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_substring(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { INT start=0, end, length; @@ -1254,7 +1253,7 @@ static HRESULT String_substring(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -1303,7 +1302,7 @@ static HRESULT String_substring(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, }
/* ECMA-262 3rd Edition B.2.3 */ -static HRESULT String_substr(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_substr(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { int start=0, len, length; @@ -1313,7 +1312,7 @@ static HRESULT String_substr(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
TRACE("\n");
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -1357,19 +1356,19 @@ static HRESULT String_substr(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns return hres; }
-static HRESULT String_sup(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_sup(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - return do_attributeless_tag_format(ctx, jsthis, r, L"SUP"); + return do_attributeless_tag_format(ctx, vthis, r, L"SUP"); }
-static HRESULT to_upper_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r) +static HRESULT to_upper_case(script_ctx_t *ctx, jsval_t vthis, jsval_t *r) { jsstr_t *str; HRESULT hres;
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -1393,13 +1392,13 @@ static HRESULT to_upper_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r) return S_OK; }
-static HRESULT to_lower_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r) +static HRESULT to_lower_case(script_ctx_t *ctx, jsval_t vthis, jsval_t *r) { jsstr_t *str; HRESULT hres;
- hres = get_string_val(ctx, jsthis, &str); + hres = get_string_val(ctx, vthis, &str); if(FAILED(hres)) return hres;
@@ -1423,35 +1422,35 @@ static HRESULT to_lower_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r) return S_OK; }
-static HRESULT String_toLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_toLowerCase(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return to_lower_case(ctx, jsthis, r); + return to_lower_case(ctx, vthis, r); }
-static HRESULT String_toUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_toUpperCase(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return to_upper_case(ctx, jsthis, r); + return to_upper_case(ctx, vthis, r); }
-static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return to_lower_case(ctx, jsthis, r); + return to_lower_case(ctx, vthis, r); }
-static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); - return to_upper_case(ctx, jsthis, r); + return to_upper_case(ctx, vthis, r); }
-static HRESULT String_trim(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, +static HRESULT String_trim(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const WCHAR *str, *begin, *end; @@ -1459,7 +1458,10 @@ static HRESULT String_trim(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig unsigned len; HRESULT hres;
- hres = to_flat_string(ctx, jsval_disp(jsthis->u.disp), &jsstr, &str); + if(is_undefined(vthis) || is_null(vthis)) + return JS_E_OBJECT_EXPECTED; + + hres = to_flat_string(ctx, vthis, &jsstr, &str); if(FAILED(hres)) { WARN("to_flat_string failed: %08x\n", hres); return hres; @@ -1486,7 +1488,7 @@ static HRESULT String_trim(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsig return hres; }
-static HRESULT String_localeCompare(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT String_localeCompare(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); @@ -1592,7 +1594,7 @@ static const builtin_info_t StringInst_info = { };
/* ECMA-262 3rd Edition 15.5.3.2 */ -static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { WCHAR *ret_str; @@ -1623,7 +1625,7 @@ static HRESULT StringConstr_fromCharCode(script_ctx_t *ctx, vdisp_t *jsthis, WOR return S_OK; }
-static HRESULT StringConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT StringConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { HRESULT hres; diff --git a/dlls/jscript/vbarray.c b/dlls/jscript/vbarray.c index 41faa20..0198030 100644 --- a/dlls/jscript/vbarray.c +++ b/dlls/jscript/vbarray.c @@ -33,17 +33,13 @@ static inline VBArrayInstance *vbarray_from_jsdisp(jsdisp_t *jsdisp) return CONTAINING_RECORD(jsdisp, VBArrayInstance, dispex); }
-static inline VBArrayInstance *vbarray_from_vdisp(vdisp_t *vdisp) +static inline VBArrayInstance *vbarray_this(jsval_t vthis) { - return vbarray_from_jsdisp(vdisp->u.jsdisp); + jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL; + return (jsdisp && is_class(jsdisp, JSCLASS_VBARRAY)) ? vbarray_from_jsdisp(jsdisp) : NULL; }
-static inline VBArrayInstance *vbarray_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_VBARRAY) ? vbarray_from_vdisp(jsthis) : NULL; -} - -static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_dimensions(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; @@ -59,7 +55,7 @@ static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, return S_OK; }
-static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_getItem(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; @@ -102,7 +98,7 @@ static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, un return hres; }
-static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_lbound(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; @@ -133,7 +129,7 @@ static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, uns return S_OK; }
-static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_toArray(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; @@ -188,7 +184,7 @@ static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, un return S_OK; }
-static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_ubound(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; @@ -219,7 +215,7 @@ static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, uns return S_OK; }
-static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArray_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FIXME("\n"); @@ -281,7 +277,7 @@ static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBAr return S_OK; }
-static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, +static HRESULT VBArrayConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray;
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/function.c | 2 +- dlls/jscript/tests/api.js | 36 ++++++++++++++++++++++++++ dlls/mshtml/tests/es5.js | 53 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 3730915..43f2441 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -599,7 +599,7 @@ static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, ID if(this_disp) vthis = jsval_disp(this_disp); else - vthis = jsval_disp(lookup_global_host(ctx)); + vthis = jsval_null();
return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r); } diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index d5d8e7d..7e656b1 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -3061,6 +3061,42 @@ ok(unescape.length == 1, "unescape.length = " + unescape.length); String.length = 3; ok(String.length == 1, "String.length = " + String.length);
+(function() { + var tests = [ + [ "Array.sort", 0x800a138f, function(ctx) { Array.prototype.sort.call(ctx); } ], + [ "Boolean.valueOf", 0x800a1392, function(ctx) { Boolean.prototype.valueOf.call(ctx); } ], + [ "Date.getYear", 0x800a138e, function(ctx) { Date.prototype.getYear.call(ctx); } ], + [ "Enumerator.atEnd", 0x800a1397, function(ctx) { Enumerator.prototype.atEnd.call(ctx); } ], + [ "Function.apply", 0x800a138a, function(ctx) { Function.prototype.apply.call(ctx, [ function() {} ]); } ], + [ "Number.toExponential", 0x800a1389, function(ctx) { Number.prototype.toExponential.call(ctx); } ], + [ "Object.hasOwnProperty", 0x800a138f, function(ctx) { Object.prototype.hasOwnProperty.call(ctx, "toString"); } ], + [ "RegExp.test", 0x800a1398, function(ctx) { RegExp.prototype.test.call(ctx, "foobar"); } ], + [ "VBArray.lbound", 0x800a1395, function(ctx) { VBArray.prototype.lbound.call(ctx); } ] + ]; + + for(var i = 0; i < tests.length; i++) { + try { + tests[i][2](null); + ok(false, "expected exception calling " + tests[i][0] + " with null context"); + }catch(ex) { + var n = ex.number + 0x100000000; /* make it unsigned like HRESULT */ + ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n); + } + try { + tests[i][2](undefined); + ok(false, "expected exception calling " + tests[i][0] + " with undefined context"); + }catch(ex) { + var n = ex.number + 0x100000000; + ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n); + } + } + + var r = Error.prototype.toString.call(undefined); + ok(r === "[object Error]", "Error.toString with undefined context returned " + r); + r = String.prototype.slice.call(null, 1, 3); + ok(r === "ul", "String.slice with null context returned " + r); +})(); + var tmp = createArray(); ok(getVT(tmp) == "VT_ARRAY|VT_VARIANT", "getVT(createArray()) = " + getVT(tmp)); ok(getVT(VBArray(tmp)) == "VT_ARRAY|VT_VARIANT", "getVT(VBArray(tmp)) = " + getVT(VBArray(tmp))); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 58b0d43..f5d23b0 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -17,6 +17,14 @@ */
var JS_E_PROP_DESC_MISMATCH = 0x800a01bd; +var JS_E_NUMBER_EXPECTED = 0x800a1389; +var JS_E_FUNCTION_EXPECTED = 0x800a138a; +var JS_E_DATE_EXPECTED = 0x800a138e; +var JS_E_OBJECT_EXPECTED = 0x800a138f; +var JS_E_BOOLEAN_EXPECTED = 0x800a1392; +var JS_E_VBARRAY_EXPECTED = 0x800a1395; +var JS_E_ENUMERATOR_EXPECTED = 0x800a1397; +var JS_E_REGEXP_EXPECTED = 0x800a1398; var JS_E_INVALID_WRITABLE_PROP_DESC = 0x800a13ac; var JS_E_NONCONFIGURABLE_REDEFINED = 0x800a13d6; var JS_E_NONWRITABLE_MODIFIED = 0x800a13d7; @@ -1222,6 +1230,51 @@ sync_test("isFrozen", function() { ok(Object.isExtensible(o) === false, "o is extensible"); });
+sync_test("builtin_context", function() { + var tests = [ + [ "Array.map", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.map.call(ctx, function(a, b) {}); } ], + [ "Array.sort", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.sort.call(ctx); } ], + [ "Boolean.toString", JS_E_BOOLEAN_EXPECTED, function(ctx) { Boolean.prototype.toString.call(ctx); } ], + [ "Date.getTime", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.getTime.call(ctx); } ], + [ "Date.toGMTString", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.toGMTString.call(ctx); } ], + [ "Enumerator.item", JS_E_ENUMERATOR_EXPECTED, function(ctx) { Enumerator.prototype.item.call(ctx); } ], + [ "Error.toString", JS_E_OBJECT_EXPECTED, function(ctx) { Error.prototype.toString.call(ctx); } ], + [ "Function.call", JS_E_FUNCTION_EXPECTED, function(ctx) { Function.prototype.call.call(ctx, function() {}); } ], + [ "Map.clear", JS_E_OBJECT_EXPECTED, function(ctx) { Map.prototype.clear.call(ctx); } ], + [ "Number.toFixed", JS_E_NUMBER_EXPECTED, function(ctx) { Number.prototype.toFixed.call(ctx); } ], + [ "Object.isPrototypeOf", JS_E_OBJECT_EXPECTED, function(ctx) { Object.prototype.isPrototypeOf.call(ctx, Object); } ], + [ "RegExp.exec", JS_E_REGEXP_EXPECTED, function(ctx) { RegExp.prototype.exec.call(ctx, "foobar"); } ], + [ "String.search", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.search.call(ctx, /foobar/g); } ], + [ "String.trim", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.trim.call(ctx); } ], + [ "VBArray.dimensions", JS_E_VBARRAY_EXPECTED, function(ctx) { VBArray.prototype.dimensions.call(ctx); } ] + ]; + + /* make global object suitable for some calls */ + window[0] = "foo"; + window[1] = "bar"; + window.length = 2; + + for(var i = 0; i < tests.length; i++) { + try { + tests[i][2](null); + ok(false, "expected exception calling " + tests[i][0] + " with null context"); + }catch(ex) { + var n = ex.number + 0x100000000; /* make it unsigned like HRESULT */ + ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n); + } + try { + tests[i][2](undefined); + ok(false, "expected exception calling " + tests[i][0] + " with undefined context"); + }catch(ex) { + var n = ex.number + 0x100000000; + ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n); + } + } + + var obj = (function() { return this; }).call(null); + ok(obj === window, "obj = " + obj); +}); + sync_test("head_setter", function() { document.head = ""; ok(typeof(document.head) === "object", "typeof(document.head) = " + typeof(document.head));
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=103466
Your paranoid android.
=== w7u_adm (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1638813634985 expected 1638813635048"
=== w7u_el (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1638813495450 expected 1638813495528"
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
I kept the check in Object_toString, because that's what the spec says and special cases before calling to_object, and it's changed from version ES3 to ES5.
dlls/jscript/object.c | 5 ++++- dlls/mshtml/tests/documentmode.js | 2 +- dlls/mshtml/tests/es5.js | 1 - 3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 8426c16..f48c3c1 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -56,8 +56,11 @@ static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns
TRACE("\n");
- if(is_undefined(vthis) || is_null(vthis)) + if(is_undefined(vthis) || is_null(vthis)) { + if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5) + str = is_null(vthis) ? L"[object Null]" : L"[object Object]"; goto set_output; + }
hres = to_object(ctx, vthis, &disp); if(FAILED(hres)) diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 2af5fae..8f96222 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1243,7 +1243,7 @@ sync_test("elem_attr", function() { r = elem.removeAttribute("ondblclick"); ok(r === (v < 8 ? false : (v < 9 ? true : undefined)), "ondblclick removeAttribute returned " + r); r = Object.prototype.toString.call(elem.ondblclick); - todo_wine_if(v >= 9). + todo_wine_if(v >= 11). ok(r === (v < 8 ? "[object Array]" : (v < 9 ? "[object Object]" : (v < 11 ? "[object Null]" : "[object Function]"))), "removed ondblclick Object.toString returned " + r);
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index f5d23b0..1da2eeb 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -805,7 +805,6 @@ sync_test("toString", function() { todo_wine. ok(tmp === "[object Window]", "toString.call(null) = " + tmp); tmp = Object.prototype.toString.call(null); - todo_wine. ok(tmp === "[object Null]", "toString.call(null) = " + tmp); tmp = Object.prototype.toString.call(undefined); todo_wine.
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=103467
Your paranoid android.
=== w8adm (32 bit report) ===
mshtml: htmldoc.c:3084: Test failed: Incorrect error code: -2146697211 htmldoc.c:3089: Test failed: Page address: L"http://test.winehq.org/tests/winehq_snapshot/" htmldoc.c:5861: Test failed: expected OnChanged_1012 htmldoc.c:5862: Test failed: expected Exec_HTTPEQUIV htmldoc.c:5864: Test failed: expected Exec_SETTITLE htmldoc.c:5905: Test failed: expected FireNavigateComplete2
=== w7u_adm (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1638817119830 expected 1638817119892"
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
This follows the spec with tests. As the spec says:
`The thisArg value is passed without modification as the this value. This is a change from Edition 3, where a undefined or null thisArg is replaced with the global object and ToObject is applied to all other values and that result is passed as the this value.`
For ES5 and above, we convert it to object in InterpretedFunction_call, because we don't support strict mode yet. For earlier versions, conversion is done in apply/call themselves, as quoted above.
dlls/jscript/function.c | 70 +++++++++++++++++++++++---------------- dlls/jscript/tests/api.js | 8 +++++ dlls/mshtml/tests/es5.js | 4 +++ 3 files changed, 54 insertions(+), 28 deletions(-)
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 43f2441..517418b 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -35,7 +35,7 @@ typedef struct { } FunctionInstance;
struct _function_vtbl_t { - HRESULT (*call)(script_ctx_t*,FunctionInstance*,IDispatch*,unsigned,unsigned,jsval_t*,jsval_t*); + HRESULT (*call)(script_ctx_t*,FunctionInstance*,jsval_t,unsigned,unsigned,jsval_t*,jsval_t*); HRESULT (*toString)(FunctionInstance*,jsstr_t**); function_code_t* (*get_code)(FunctionInstance*); void (*destructor)(FunctionInstance*); @@ -256,7 +256,7 @@ HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsi assert(is_class(func_this, JSCLASS_FUNCTION)); function = function_from_jsdisp(func_this);
- return function->vtbl->call(function->dispex.ctx, function, jsthis, flags, argc, argv, r); + return function->vtbl->call(function->dispex.ctx, function, jsval_disp(jsthis), flags, argc, argv, r); }
static HRESULT Function_get_length(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) @@ -328,10 +328,10 @@ static HRESULT array_to_args(script_ctx_t *ctx, jsdisp_t *arg_array, unsigned *a
static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + jsval_t this_val = jsval_undefined(); FunctionInstance *function; jsval_t *args = NULL; unsigned i, cnt = 0; - IDispatch *this_obj = NULL; HRESULT hres = S_OK;
TRACE("\n"); @@ -340,10 +340,16 @@ static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsi return JS_E_FUNCTION_EXPECTED;
if(argc) { - if(!is_undefined(argv[0]) && !is_null(argv[0])) { + if(ctx->version < SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(argv[0]) && !is_null(argv[0])) { + IDispatch *this_obj; hres = to_object(ctx, argv[0], &this_obj); if(FAILED(hres)) return hres; + this_val = jsval_disp(this_obj); + }else { + hres = jsval_copy(argv[0], &this_val); + if(FAILED(hres)) + return hres; } }
@@ -370,10 +376,11 @@ static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsi
if(SUCCEEDED(hres)) { if(function) { - hres = function->vtbl->call(ctx, function, this_obj, flags, cnt, args, r); + hres = function->vtbl->call(ctx, function, this_val, flags, cnt, args, r); }else { jsval_t res; - hres = disp_call_value(ctx, get_object(vthis), this_obj, DISPATCH_METHOD, cnt, args, &res); + hres = disp_call_value(ctx, get_object(vthis), is_object_instance(this_val) ? get_object(this_val) : NULL, + DISPATCH_METHOD, cnt, args, &res); if(SUCCEEDED(hres)) { if(r) *r = res; @@ -383,8 +390,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsi } }
- if(this_obj) - IDispatch_Release(this_obj); + jsval_release(this_val); for(i=0; i < cnt; i++) jsval_release(args[i]); heap_free(args); @@ -394,8 +400,8 @@ static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsi static HRESULT Function_call(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + jsval_t this_val = jsval_undefined(); FunctionInstance *function; - IDispatch *this_obj = NULL; unsigned cnt = 0; HRESULT hres;
@@ -405,19 +411,23 @@ static HRESULT Function_call(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsig return JS_E_FUNCTION_EXPECTED;
if(argc) { - if(!is_undefined(argv[0]) && !is_null(argv[0])) { + if(ctx->version < SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(argv[0]) && !is_null(argv[0])) { + IDispatch *this_obj; hres = to_object(ctx, argv[0], &this_obj); if(FAILED(hres)) return hres; + this_val = jsval_disp(this_obj); + }else { + hres = jsval_copy(argv[0], &this_val); + if(FAILED(hres)) + return hres; } - cnt = argc-1; }
- hres = function->vtbl->call(ctx, function, this_obj, flags, cnt, argv + 1, r); + hres = function->vtbl->call(ctx, function, this_val, flags, cnt, argv + 1, r);
- if(this_obj) - IDispatch_Release(this_obj); + jsval_release(this_val); return hres; }
@@ -469,7 +479,7 @@ HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned ar return E_FAIL; }
- return function->vtbl->call(ctx, function, NULL, flags, argc, argv, r); + return function->vtbl->call(ctx, function, vthis, flags, argc, argv, r); }
HRESULT Function_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) @@ -590,16 +600,10 @@ static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_ return S_OK; }
-static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, IDispatch *this_disp, unsigned flags, +static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r) { NativeFunction *function = (NativeFunction*)func; - jsval_t vthis; - - if(this_disp) - vthis = jsval_disp(this_disp); - else - vthis = jsval_null();
return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r); } @@ -698,12 +702,13 @@ HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_pro return S_OK; }
-static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *func, IDispatch *this_obj, unsigned flags, +static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r) { InterpretedFunction *function = (InterpretedFunction*)func; - jsdisp_t *new_obj = NULL; + IDispatch *this_obj = NULL; DWORD exec_flags = 0; + jsdisp_t *new_obj; HRESULT hres;
TRACE("%p\n", function); @@ -718,6 +723,14 @@ static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *fun if(FAILED(hres)) return hres; this_obj = to_disp(new_obj); + }else if(is_object_instance(vthis)) { + this_obj = get_object(vthis); + if(this_obj) + IDispatch_AddRef(this_obj); + }else if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(vthis) && !is_null(vthis)) { + hres = to_object(ctx, vthis, &this_obj); + if(FAILED(hres)) + return hres; }
if(flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE) @@ -726,8 +739,8 @@ static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *fun exec_flags |= EXEC_CONSTRUCTOR; hres = exec_source(ctx, exec_flags, function->code, function->func_code, function->scope_chain, this_obj, &function->function.dispex, argc, argv, r); - if(new_obj) - jsdisp_release(new_obj); + if(this_obj) + IDispatch_Release(this_obj); return hres; }
@@ -801,7 +814,7 @@ HRESULT create_source_function(script_ctx_t *ctx, bytecode_t *code, function_cod return S_OK; }
-static HRESULT BindFunction_call(script_ctx_t *ctx, FunctionInstance *func, IDispatch *this_obj, unsigned flags, +static HRESULT BindFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r) { BindFunction *function = (BindFunction*)func; @@ -823,7 +836,8 @@ static HRESULT BindFunction_call(script_ctx_t *ctx, FunctionInstance *func, IDis memcpy(call_args + function->argc, argv, argc * sizeof(*call_args)); }
- hres = function->target->vtbl->call(ctx, function->target, function->this, flags, call_argc, call_args, r); + hres = function->target->vtbl->call(ctx, function->target, jsval_disp(function->this), + flags, call_argc, call_args, r);
heap_free(call_args); return hres; diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 7e656b1..7cc7c16 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -3095,6 +3095,14 @@ ok(String.length == 1, "String.length = " + String.length); ok(r === "[object Error]", "Error.toString with undefined context returned " + r); r = String.prototype.slice.call(null, 1, 3); ok(r === "ul", "String.slice with null context returned " + r); + r = String.prototype.slice.call(undefined, 2, 5); + ok(r === "def", "String.slice with undefined context returned " + r); + r = (function() { return this; }).call(null); + ok(r === test, "wrong 'this' of function with null context"); + r = (function() { return this; }).call(undefined); + ok(r === test, "wrong 'this' of function with undefined context"); + r = (function() { return this; }).call(42); + ok(r.valueOf() === 42, "'this' of function with 42 context = " + r); })();
var tmp = createArray(); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 1da2eeb..fd45362 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -1272,6 +1272,10 @@ sync_test("builtin_context", function() {
var obj = (function() { return this; }).call(null); ok(obj === window, "obj = " + obj); + var obj = (function() { return this; }).call(undefined); + ok(obj === window, "obj = " + obj); + obj = (function() { return this; }).call(42); + ok(obj.valueOf() === 42, "obj = " + obj); });
sync_test("head_setter", function() {
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=103468
Your paranoid android.
=== w1064_tsign (32 bit report) ===
mshtml: htmldoc.c:2541: Test failed: unexpected call UpdateUI htmldoc.c:2853: Test failed: unexpected call Exec_UPDATECOMMANDS
=== w1064_tsign (64 bit report) ===
mshtml: htmldoc.c:2541: Test failed: unexpected call UpdateUI htmldoc.c:2853: Test failed: unexpected call Exec_UPDATECOMMANDS htmldoc.c:350: Test failed: expected Exec_SETTITLE htmldoc.c:2859: Test failed: unexpected call Exec_SETTITLE
=== w7u_adm (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1638821020811 expected 1638821020873"
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/object.c | 2 +- dlls/mshtml/tests/es5.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index f48c3c1..03c1366 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -58,7 +58,7 @@ static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns
if(is_undefined(vthis) || is_null(vthis)) { if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5) - str = is_null(vthis) ? L"[object Null]" : L"[object Object]"; + str = is_null(vthis) ? L"[object Null]" : L"[object Undefined]"; goto set_output; }
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index fd45362..ad71b13 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -807,10 +807,8 @@ sync_test("toString", function() { tmp = Object.prototype.toString.call(null); ok(tmp === "[object Null]", "toString.call(null) = " + tmp); tmp = Object.prototype.toString.call(undefined); - todo_wine. ok(tmp === "[object Undefined]", "toString.call(undefined) = " + tmp); tmp = Object.prototype.toString.call(); - todo_wine. ok(tmp === "[object Undefined]", "toString.call() = " + tmp);
obj = Object.create(null);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=103469
Your paranoid android.
=== w8adm (32 bit report) ===
mshtml: events.c:1089: Test failed: unexpected call img_onerror events: Timeout
=== debiant2 (64 bit WoW report) ===
mshtml: htmllocation: Timeout
Hi Gabriel,
On 12/6/21 4:40 PM, Gabriel Ivăncescu wrote:
- if(params.cArgs > func->argc) {
params.rgvarg += params.cArgs - func->argc;
params.cArgs = func->argc;
- }
The patch seems fine, but since this affects scripts, it would be good to have a script test with extra arguments.
Thanks,
Jacek