Module: wine Branch: master Commit: fa0c84ae0b3f3597cd98a9d3d3d999f86e6992b6 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fa0c84ae0b3f3597cd98a9d3d...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Oct 31 19:16:29 2019 +0100
vbscript: Support DISP_E_EXCEPTION Invoke[Ex] return value.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/tests/error.vbs | 16 ++++++++++++++++ dlls/vbscript/tests/run.c | 11 ++++++++++- dlls/vbscript/vbdisp.c | 19 +++++++++++++++---- 3 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/dlls/vbscript/tests/error.vbs b/dlls/vbscript/tests/error.vbs index 13f9a2072e..1853f6c4bf 100644 --- a/dlls/vbscript/tests/error.vbs +++ b/dlls/vbscript/tests/error.vbs @@ -457,4 +457,20 @@ end sub
call testVBErrorCodes
+on error resume next + +throwWithDesc +ok err.number = &hdeadbeef&, "err.number = " & hex(err.number) +ok err.description = "test", "err.description = " & err.description +ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext +ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile + +throwWithDesc = 1 +ok err.number = &hdeadbeef&, "err.number = " & hex(err.number) +ok err.description = "test", "err.description = " & err.description +ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext +ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile + +on error goto 0 + call reportSuccess() diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index b7a204f919..9354cae309 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -139,6 +139,7 @@ DEFINE_EXPECT(OnLeaveScript); #define DISPID_GLOBAL_WEEKSTARTDAY 1021 #define DISPID_GLOBAL_GLOBALCALLBACK 1022 #define DISPID_GLOBAL_TESTERROROBJECT 1023 +#define DISPID_GLOBAL_THROWWITHDESC 1024
#define DISPID_TESTOBJ_PROPGET 2000 #define DISPID_TESTOBJ_PROPPUT 2001 @@ -1105,7 +1106,8 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD { L"testArray", DISPID_GLOBAL_TESTARRAY }, { L"throwInt", DISPID_GLOBAL_THROWINT }, { L"testOptionalArg", DISPID_GLOBAL_TESTOPTIONALARG }, - { L"testErrorObject", DISPID_GLOBAL_TESTERROROBJECT } + { L"testErrorObject", DISPID_GLOBAL_TESTERROROBJECT }, + { L"throwWithDesc", DISPID_GLOBAL_THROWWITHDESC } };
test_grfdex(grfdex, fdexNameCaseInsensitive); @@ -1463,6 +1465,13 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, }
return hres; + + case DISPID_GLOBAL_THROWWITHDESC: + pei->scode = 0xdeadbeef; + pei->bstrDescription = SysAllocString(L"test"); + pei->bstrHelpFile = SysAllocString(L"test.chm"); + pei->dwHelpContext = 10; + return DISP_E_EXCEPTION; }
case DISPID_GLOBAL_TESTOPTIONALARG: { diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 1dd6d4ed05..25a80fc89d 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -952,15 +952,21 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp, return invoke_vbdisp(vbdisp, id, flags, FALSE, dp, retv);
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); - if(FAILED(hres)) { + if(SUCCEEDED(hres)) { + hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */); + IDispatchEx_Release(dispex); + }else { UINT err = 0;
TRACE("using IDispatch\n"); - return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err); + hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err); }
- hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */); - IDispatchEx_Release(dispex); + if(hres == DISP_E_EXCEPTION) { + clear_ei(&ctx->ei); + ctx->ei = ei; + hres = SCRIPT_E_RECORDED; + } return hres; }
@@ -994,5 +1000,10 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, NULL, &ei, &err); }
+ if(hres == DISP_E_EXCEPTION) { + clear_ei(&ctx->ei); + ctx->ei = ei; + hres = SCRIPT_E_RECORDED; + } return hres; }