[PATCH v2 0/2] MR10927: vbscript: Mark class member fixed-size arrays as FADF_FIXEDSIZE
When a class member is declared with explicit bounds (Private mArr(N) or Public mArr(N)) the SAFEARRAY created at instance construction was missing FADF_FIXEDSIZE, so interp_redim's fixed-size guard silently accepted a later ReDim from a method body. Set the flag (and FADF_STATIC) to match interp_dim's handling of local fixed-size arrays, so ReDim raises err 10 like native. -- v2: vbscript: Mark class member fixed-size arrays as FADF_FIXEDSIZE. vbscript/tests: Add tests for ReDim on class member arrays. https://gitlab.winehq.org/wine/wine/-/merge_requests/10927
From: Francis De Brabandere <francisdb@gmail.com> A fixed-size class member array (Private mArr(N) or Public mArr(N)) is created with FADF_FIXEDSIZE on native, so attempting to ReDim it from a method body raises err 10 at runtime. Dynamic (mArr()) and scalar (mArr) members can be ReDim'd freely. These cases pass the parser but reach interp_redim; mark the fixed-size ones todo_wine for the upcoming fix. --- dlls/vbscript/tests/lang.vbs | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 79cac74800e..6101e3b180a 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2862,6 +2862,68 @@ sub TestExecuteGlobalRedim end sub Call TestExecuteGlobalRedim +Class FixedClassArr + Private mArr(2) + Public LastErr + Public Sub Resize(n) + On Error Resume Next + Err.Clear : ReDim mArr(n) : LastErr = Err.Number + End Sub + Public Sub ResizePreserve(n) + On Error Resume Next + Err.Clear : ReDim Preserve mArr(n) : LastErr = Err.Number + End Sub +End Class + +Class FixedClassArr2D + Private mArr(2, 3) + Public LastErr + Public Sub Resize(a, b) + On Error Resume Next + Err.Clear : ReDim mArr(a, b) : LastErr = Err.Number + End Sub +End Class + +Class DynamicClassArr + Private mArr() + Public LastErr + Public Function UB : UB = UBound(mArr) : End Function + Public Sub Resize(n) + On Error Resume Next + Err.Clear : ReDim mArr(n) : LastErr = Err.Number + End Sub +End Class + +Class ScalarClassMember + Private mArr + Public LastErr + Public Function UB : UB = UBound(mArr) : End Function + Public Sub Resize(n) + On Error Resume Next + Err.Clear : ReDim mArr(n) : LastErr = Err.Number + End Sub +End Class + +dim cFix : Set cFix = New FixedClassArr +cFix.Resize 5 +todo_wine_ok cFix.LastErr = 10, "ReDim fixed class member err = " & cFix.LastErr +cFix.ResizePreserve 5 +todo_wine_ok cFix.LastErr = 10, "ReDim Preserve fixed class member err = " & cFix.LastErr + +dim cFix2D : Set cFix2D = New FixedClassArr2D +cFix2D.Resize 5, 7 +todo_wine_ok cFix2D.LastErr = 10, "ReDim fixed 2D class member err = " & cFix2D.LastErr + +dim cDyn : Set cDyn = New DynamicClassArr +cDyn.Resize 5 +call ok(cDyn.LastErr = 0, "ReDim dynamic class member err = " & cDyn.LastErr) +call ok(cDyn.UB = 5, "ReDim dynamic class member UB = " & cDyn.UB) + +dim cScalar : Set cScalar = New ScalarClassMember +cScalar.Resize 5 +call ok(cScalar.LastErr = 0, "ReDim scalar->array class member err = " & cScalar.LastErr) +call ok(cScalar.UB = 5, "ReDim scalar->array class member UB = " & cScalar.UB) + sub TestReDimList dim x, y -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10927
From: Francis De Brabandere <francisdb@gmail.com> When a class member is declared with explicit bounds (Private mArr(N) or Public mArr(N)) the SAFEARRAY created at instance construction was missing FADF_FIXEDSIZE, so interp_redim's fixed-size guard silently accepted a later ReDim from a method body. Set the flag (and FADF_STATIC) to match interp_dim's handling of local fixed-size arrays, so ReDim raises err 10 like native. --- dlls/vbscript/tests/lang.vbs | 6 +++--- dlls/vbscript/vbdisp.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 6101e3b180a..00e9c8c7c50 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2906,13 +2906,13 @@ End Class dim cFix : Set cFix = New FixedClassArr cFix.Resize 5 -todo_wine_ok cFix.LastErr = 10, "ReDim fixed class member err = " & cFix.LastErr +call ok(cFix.LastErr = 10, "ReDim fixed class member err = " & cFix.LastErr) cFix.ResizePreserve 5 -todo_wine_ok cFix.LastErr = 10, "ReDim Preserve fixed class member err = " & cFix.LastErr +call ok(cFix.LastErr = 10, "ReDim Preserve fixed class member err = " & cFix.LastErr) dim cFix2D : Set cFix2D = New FixedClassArr2D cFix2D.Resize 5, 7 -todo_wine_ok cFix2D.LastErr = 10, "ReDim fixed 2D class member err = " & cFix2D.LastErr +call ok(cFix2D.LastErr = 10, "ReDim fixed 2D class member err = " & cFix2D.LastErr) dim cDyn : Set cDyn = New DynamicClassArr cDyn.Resize 5 diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c index 1ea228c8aca..554d410b57e 100644 --- a/dlls/vbscript/vbdisp.c +++ b/dlls/vbscript/vbdisp.c @@ -741,6 +741,7 @@ HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret) hres = E_OUTOFMEMORY; break; } + vbdisp->arrays[i]->fFeatures |= FADF_FIXEDSIZE | FADF_STATIC; } if(SUCCEEDED(hres)) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10927
participants (2)
-
Francis De Brabandere -
Francis De Brabandere (@francisdb)