Module: wine Branch: master Commit: a3d2ad1c2ea138a04f890b3a5864f3e8306884ca URL: https://gitlab.winehq.org/wine/wine/-/commit/a3d2ad1c2ea138a04f890b3a5864f3e...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 8 13:39:38 2024 +0200
jscript: Support converting host objects to string.
---
dlls/jscript/dispex.c | 16 ++++++++++++++++ dlls/jscript/jscript.h | 1 + dlls/jscript/jsdisp.idl | 1 + dlls/jscript/object.c | 16 +++++++++++----- 4 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index b684b9edd99..8c499fbd37b 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3349,6 +3349,21 @@ static HRESULT HostObject_next_prop(jsdisp_t *jsdisp, unsigned id, struct proper return IWineJSDispatchHost_NextProperty(This->host_iface, id, desc); }
+static HRESULT HostObject_to_string(jsdisp_t *jsdisp, jsstr_t **ret) +{ + HostObject *This = HostObject_from_jsdisp(jsdisp); + BSTR str; + HRESULT hres; + + hres = IWineJSDispatchHost_ToString(This->host_iface, &str); + if(FAILED(hres)) + return hres; + + *ret = jsstr_alloc(str); + SysFreeString(str); + return *ret ? S_OK : E_OUTOFMEMORY; +} + static const builtin_info_t HostObject_info = { .class = JSCLASS_OBJECT, .addref = HostObject_addref, @@ -3357,6 +3372,7 @@ static const builtin_info_t HostObject_info = { .prop_get = HostObject_prop_get, .prop_put = HostObject_prop_put, .next_prop = HostObject_next_prop, + .to_string = HostObject_to_string, };
HRESULT init_host_object(script_ctx_t *ctx, IWineJSDispatchHost *host_iface, IWineJSDispatch **ret) diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 29dec3297ca..a36291204b6 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -189,6 +189,7 @@ typedef struct { HRESULT (*next_prop)(jsdisp_t*,unsigned,struct property_info*); HRESULT (*prop_get)(jsdisp_t*,unsigned,jsval_t*); HRESULT (*prop_put)(jsdisp_t*,unsigned,jsval_t); + HRESULT (*to_string)(jsdisp_t*,jsstr_t**); HRESULT (*gc_traverse)(struct gc_ctx*,enum gc_traverse_op,jsdisp_t*); } builtin_info_t;
diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index a794dbebe67..533677f6cad 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -56,6 +56,7 @@ interface IWineJSDispatchHost : IDispatchEx HRESULT GetProperty(DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, IServiceProvider *caller); HRESULT SetProperty(DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller); HRESULT CallFunction(DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller); + HRESULT ToString(BSTR *str); }
[ diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 382f4107c45..da544c6b1c3 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -27,8 +27,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { + const WCHAR *str = NULL; + jsstr_t *ret = NULL; jsdisp_t *jsdisp; - const WCHAR *str; IDispatch *disp; HRESULT hres;
@@ -74,6 +75,8 @@ static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns jsdisp = to_jsdisp(disp); if(!jsdisp) { str = L"[object Object]"; + }else if(jsdisp->builtin_info->to_string) { + hres = jsdisp->builtin_info->to_string(jsdisp, &ret); }else if(names[jsdisp->builtin_info->class]) { str = names[jsdisp->builtin_info->class]; }else { @@ -87,11 +90,14 @@ static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns
set_output: if(r) { - jsstr_t *ret; - ret = jsstr_alloc(str); - if(!ret) - return E_OUTOFMEMORY; + if(!ret) { + ret = jsstr_alloc(str); + if(!ret) + return E_OUTOFMEMORY; + } *r = jsval_string(ret); + }else if(ret) { + jsstr_release(ret); }
return S_OK;