[PATCH v2 0/1] MR10400: Draft: vbscript: Map DISP_E_DIVBYZERO to VBScript error 11.
Add the missing DISP_E_DIVBYZERO mapping in map_vbs_exception() so that division by zero errors report Err.Number = 11 with the correct description "Division by zero", matching native behavior. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42400 -- v2: vbscript: Map DISP_E_DIVBYZERO to VBScript error 11. https://gitlab.winehq.org/wine/wine/-/merge_requests/10400
From: Francis De Brabandere <francisdb@gmail.com> Add the missing DISP_E_DIVBYZERO mapping in map_vbs_exception() so that division by zero errors report Err.Number = 11 with the correct description "Division by zero", matching native behavior. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42400 --- dlls/vbscript/interp.c | 6 ++++++ dlls/vbscript/tests/error.vbs | 20 ++++++++++++++++++++ dlls/vbscript/vbscript.rc | 1 + dlls/vbscript/vbscript_defs.h | 1 + 4 files changed, 28 insertions(+) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 779f3f881a5..eab48a7805c 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -2246,6 +2246,8 @@ static HRESULT interp_mod(exec_ctx_t *ctx) release_val(&l); } release_val(&r); + if(hres == DISP_E_DIVBYZERO) + return MAKE_VBSERROR(VBSE_DIVISION_BY_ZERO); if(FAILED(hres)) return hres; @@ -2270,6 +2272,8 @@ static HRESULT interp_idiv(exec_ctx_t *ctx) release_val(&l); } release_val(&r); + if(hres == DISP_E_DIVBYZERO) + return MAKE_VBSERROR(VBSE_DIVISION_BY_ZERO); if(FAILED(hres)) return hres; @@ -2294,6 +2298,8 @@ static HRESULT interp_div(exec_ctx_t *ctx) release_val(&l); } release_val(&r); + if(hres == DISP_E_DIVBYZERO) + return MAKE_VBSERROR(VBSE_DIVISION_BY_ZERO); if(FAILED(hres)) return hres; diff --git a/dlls/vbscript/tests/error.vbs b/dlls/vbscript/tests/error.vbs index 40dde515f87..ccb1faeae46 100644 --- a/dlls/vbscript/tests/error.vbs +++ b/dlls/vbscript/tests/error.vbs @@ -460,6 +460,26 @@ end sub call testVBErrorCodes +sub testDivisionByZero() + on error resume next + dim x + + Err.Clear() + x = 1 / 0 + call ok(Err.Number = 11, "1 / 0 Err.Number = " & Err.Number) + call ok(Err.Description = "Division by zero", "1 / 0 Err.Description = " & Err.Description) + + Err.Clear() + x = 1 \ 0 + call ok(Err.Number = 11, "1 \ 0 Err.Number = " & Err.Number) + + Err.Clear() + x = 1 Mod 0 + call ok(Err.Number = 11, "1 Mod 0 Err.Number = " & Err.Number) +end sub + +call testDivisionByZero + on error resume next throwWithDesc diff --git a/dlls/vbscript/vbscript.rc b/dlls/vbscript/vbscript.rc index 96b1f41a9a2..b9a1c3ad5c3 100644 --- a/dlls/vbscript/vbscript.rc +++ b/dlls/vbscript/vbscript.rc @@ -30,6 +30,7 @@ STRINGTABLE VBSE_OUT_OF_MEMORY "Out of memory" VBSE_OUT_OF_BOUNDS "Subscript out of range" VBSE_ARRAY_LOCKED "This array is fixed or temporarily locked" + VBSE_DIVISION_BY_ZERO "Division by zero" VBSE_TYPE_MISMATCH "Type mismatch" VBSE_FILE_NOT_FOUND "File not found" VBSE_IO_ERROR "Device I/O error" diff --git a/dlls/vbscript/vbscript_defs.h b/dlls/vbscript/vbscript_defs.h index 19c71b62975..e0e9d1cac94 100644 --- a/dlls/vbscript/vbscript_defs.h +++ b/dlls/vbscript/vbscript_defs.h @@ -241,6 +241,7 @@ #define VBSE_OUT_OF_MEMORY 7 #define VBSE_OUT_OF_BOUNDS 9 #define VBSE_ARRAY_LOCKED 10 +#define VBSE_DIVISION_BY_ZERO 11 #define VBSE_TYPE_MISMATCH 13 #define VBSE_FILE_NOT_FOUND 53 #define VBSE_IO_ERROR 57 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10400
Jacek Caban (@jacek) commented about dlls/vbscript/interp.c:
release_val(&l); } release_val(&r); + if(hres == DISP_E_DIVBYZERO) + return MAKE_VBSERROR(VBSE_DIVISION_BY_ZERO);
Could we do that in `map_vbs_exception` instead? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10400#note_133013
participants (3)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb) -
Jacek Caban (@jacek)