While working in vbscript, I noticed abs on a `BSTR` value with a positive number would come back with an invalid value.
Given the following script:
```
Dim x
x = "30000"
Debug.Print "x" & "=" & abs(x)
```
Outputs:
```
Script.Print 'x=3.08221696253945E-314'
```
After debugging, `pVarIn` gets the R8 value but is never shallow copied into `pVarOut`.
I'm not sure how to write a test case in `oleaut32`, so I included a test case in `vbscript`.
--
v7: oleaut32: fix VarAbs function for BSTR with positive values
oleaut32: Fix VarAbs function for BSTR with positive values.
oleaut32: Remove overflow check for VT_R4 and VT_R8 in VarAbs.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2175
Today, test_RtlUniform() skips almost all of its tests on Windows Vista
or later. The skipped tests only succeed in Windows XP, and fail on
Windows Vista or later.
This is because RtlUniform()'s behavior has changed, presumably due to a
bug fix shipped in Windows Vista. It appears that RtlUniform, a linear
congruential generator, could overflow before computing the modulo in
WindoWs XP. This is no longer the case in Windows Vista or later.
Meanwhile, we no longer support Windows XP behavior and thus do not test
for it regularly; therefore, the tests are obsolete as of 2023.
Remove obsolete tests that no longer work with any of the Windows
versions actively tested by WineHQ (as of 2023), and replace them with
updated tests that works in the Windows versions from Vista up to 10.
Also, fix Wine's RtlUniform() to match the new behavior accordingly.
--
v10: ntdll: Fix integer overflow in RtlUniform.
https://gitlab.winehq.org/wine/wine/-/merge_requests/821
While working in vbscript, I noticed abs on a `BSTR` value with a positive number would come back with an invalid value.
Given the following script:
```
Dim x
x = "30000"
Debug.Print "x" & "=" & abs(x)
```
Outputs:
```
Script.Print 'x=3.08221696253945E-314'
```
After debugging, `pVarIn` gets the R8 value but is never shallow copied into `pVarOut`.
I'm not sure how to write a test case in `oleaut32`, so I included a test case in `vbscript`.
--
v6: oleaut32: fix VarAbs function for BSTR with positive values
https://gitlab.winehq.org/wine/wine/-/merge_requests/2175
On Tue Feb 14 14:55:14 2023 +0000, Huw Davies wrote:
> The optimization below doesn't seem to be worth it. On x86_64 I
> couldn't measure a difference between the algorithm above and the
> optimization below. On i386, while the optimization was about 10%
> faster, the algorithm above matched native's performance, so there seems
> little point in adding the complexity.
> If you really need the optimization, you could potentially introduce it
> in a later MR.
It was an attempt to implement it in an unusual way so that there was low likelihood that the algorithm matched any particular existing implementation.
I'll switch to the modulo one anyway.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/821#note_24060
Huw Davies (@huw) commented about dlls/ntdll/rtl.c:
> - result = *seed * 0xffffffed + 0x7fffffc3;
> - if (result == 0xffffffff || result == 0x7ffffffe) {
> - result = (result + 2) & MAXLONG;
> - } else if (result == 0x7fffffff) {
> - result = 0;
> - } else if ((result & 0x80000000) == 0) {
> - result = result + (~result & 1);
> - } else {
> - result = (result + (result & 1)) & MAXLONG;
> - } /* if */
> + /* The algorithm below is equivalent to the following expression:
> + *
> + * result = ((ULONGLONG)*seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff;
> + * return (*seed = result);
> + */
> +
The optimization below doesn't seem to be worth it. On x86_64 I couldn't measure a difference between the algorithm above and the optimization below. On i386, while the optimization was about 10% faster, the algorithm above matched native's performance, so there seems little point in adding the complexity.
If you really need the optimization, you could potentially introduce it in a later MR.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/821#note_24059