Module: wine Branch: master Commit: dd5ac4c6afd68ad965cdaa285ab51ca7b5bd36d3 URL: https://gitlab.winehq.org/wine/wine/-/commit/dd5ac4c6afd68ad965cdaa285ab51ca...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Jun 30 23:24:21 2024 +0200
jscript: Support host objects in disp_cmp.
Based on patch by Gabriel Ivăncescu.
---
dlls/jscript/dispex.c | 15 +++++++++++++++ dlls/jscript/engine.c | 20 +++++++++++++------- dlls/jscript/jscript.h | 1 + 3 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 8c499fbd37b..26d89ab2b5e 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3393,3 +3393,18 @@ HRESULT init_host_object(script_ctx_t *ctx, IWineJSDispatchHost *host_iface, IWi *ret = &host_obj->jsdisp.IWineJSDispatch_iface; return S_OK; } + +IWineJSDispatchHost *get_host_dispatch(IDispatch *disp) +{ + HostObject *host_obj; + jsdisp_t *jsdisp; + + if(!(jsdisp = to_jsdisp(disp))) + return NULL; + if(jsdisp->builtin_info != &HostObject_info) + return NULL; + + host_obj = HostObject_from_jsdisp(jsdisp); + IWineJSDispatchHost_AddRef(host_obj->host_iface); + return host_obj->host_iface; +} diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 2be22a9b526..12e53435f16 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -637,14 +637,20 @@ static HRESULT disp_cmp(IDispatch *disp1, IDispatch *disp2, BOOL *ret) return S_OK; }
- hres = IDispatch_QueryInterface(disp1, &IID_IUnknown, (void**)&unk1); - if(FAILED(hres)) - return hres; + unk1 = (IUnknown *)get_host_dispatch(disp1); + if(!unk1) { + hres = IDispatch_QueryInterface(disp1, &IID_IUnknown, (void**)&unk1); + if(FAILED(hres)) + return hres; + }
- hres = IDispatch_QueryInterface(disp2, &IID_IUnknown, (void**)&unk2); - if(FAILED(hres)) { - IUnknown_Release(unk1); - return hres; + unk2 = (IUnknown *)get_host_dispatch(disp2); + if(!unk2) { + hres = IDispatch_QueryInterface(disp2, &IID_IUnknown, (void**)&unk2); + if(FAILED(hres)) { + IUnknown_Release(unk1); + return hres; + } }
if(unk1 == unk2) { diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index a36291204b6..fdcead4a064 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -225,6 +225,7 @@ static inline IDispatchEx *to_dispex(jsdisp_t *jsdisp)
jsdisp_t *as_jsdisp(IDispatch*); jsdisp_t *to_jsdisp(IDispatch*); +IWineJSDispatchHost *get_host_dispatch(IDispatch*);
jsdisp_t *jsdisp_addref(jsdisp_t*); ULONG jsdisp_release(jsdisp_t*);