[PATCH 3/8] jscript: Fill the exception in a helper function and use deferred fill-in if needed.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Fri Apr 15 08:00:23 CDT 2022
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
Useful for further patches (and the js proxies too).
dlls/jscript/dispex.c | 30 ++++++++++++++++++------------
dlls/jscript/jscript.h | 1 +
2 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 8682766..beede34 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -2056,22 +2056,28 @@ static HRESULT disp_invoke(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD f
hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, params, r, &ei, &err);
}
- if(hres == DISP_E_EXCEPTION) {
- TRACE("DISP_E_EXCEPTION: %08lx %s %s\n", ei.scode, debugstr_w(ei.bstrSource), debugstr_w(ei.bstrDescription));
- reset_ei(ctx->ei);
- ctx->ei->error = (SUCCEEDED(ei.scode) || ei.scode == DISP_E_EXCEPTION) ? E_FAIL : ei.scode;
- if(ei.bstrSource)
- ctx->ei->source = jsstr_alloc_len(ei.bstrSource, SysStringLen(ei.bstrSource));
- if(ei.bstrDescription)
- ctx->ei->message = jsstr_alloc_len(ei.bstrDescription, SysStringLen(ei.bstrDescription));
- SysFreeString(ei.bstrSource);
- SysFreeString(ei.bstrDescription);
- SysFreeString(ei.bstrHelpFile);
- }
+ if(hres == DISP_E_EXCEPTION)
+ disp_fill_exception(ctx, &ei);
return hres;
}
+void disp_fill_exception(script_ctx_t *ctx, EXCEPINFO *ei)
+{
+ TRACE("DISP_E_EXCEPTION: %08lx %s %s\n", ei->scode, debugstr_w(ei->bstrSource), debugstr_w(ei->bstrDescription));
+ reset_ei(ctx->ei);
+ if(ei->pfnDeferredFillIn)
+ ei->pfnDeferredFillIn(ei);
+ ctx->ei->error = (SUCCEEDED(ei->scode) || ei->scode == DISP_E_EXCEPTION) ? E_FAIL : ei->scode;
+ if(ei->bstrSource)
+ ctx->ei->source = jsstr_alloc_len(ei->bstrSource, SysStringLen(ei->bstrSource));
+ if(ei->bstrDescription)
+ ctx->ei->message = jsstr_alloc_len(ei->bstrDescription, SysStringLen(ei->bstrDescription));
+ SysFreeString(ei->bstrSource);
+ SysFreeString(ei->bstrDescription);
+ SysFreeString(ei->bstrHelpFile);
+}
+
HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, unsigned argc, jsval_t *argv, jsval_t *ret)
{
VARIANT buf[6], retv;
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 7ed4425..8cf386d 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -240,6 +240,7 @@ HRESULT create_dispex(script_ctx_t*,const builtin_info_t*,jsdisp_t*,jsdisp_t**)
HRESULT init_dispex(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*) DECLSPEC_HIDDEN;
HRESULT init_dispex_from_constr(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*) DECLSPEC_HIDDEN;
+void disp_fill_exception(script_ctx_t*,EXCEPINFO*) DECLSPEC_HIDDEN;
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT disp_call_value(script_ctx_t*,IDispatch*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_call_value(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
--
2.34.1
More information about the wine-devel
mailing list