From: Jacek Caban jacek@codeweavers.com
--- dlls/jscript/dispex.c | 16 ++++++++++++++++ dlls/jscript/jscript.h | 1 + dlls/jscript/jsdisp.idl | 1 + dlls/jscript/object.c | 14 ++++++++++---- 4 files changed, 28 insertions(+), 4 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..e01e0b55580 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -27,6 +27,7 @@ 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) { + jsstr_t *ret = NULL; jsdisp_t *jsdisp; const WCHAR *str; IDispatch *disp; @@ -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;