[PATCH] msvcp110: Fix the spec entry for _Getcvt for msvcp110 and higher.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Sat May 15 12:03:51 CDT 2021
On 5/4/21 4:48 AM, Piotr Caban wrote:
> Hi Zeb,
>
> On 5/4/21 6:41 AM, Zebediah Figura wrote:
>> -@ cdecl -ret64 _Getcvt()
>> +@ cdecl -ret64 _Getcvt(ptr)
> It used to be:
> @ cdecl _Getcvt(ptr)
>
> Taking in account there was some discussion regarding lldiv I guess it
> should be changed differently. Probably current implementation is
> incorrect on some platforms. I guess it should look like this:
> #if (defined(__GNUC__) && defined(__i386__) //TODO: check if we need
> similar workaround for x86_64
> /* Workaround a bug in GCC */
> ULONGLONG __cdecl _Getcvt(void)
> {
> union {
> _Cvtvec cvtvec;
> ULONGLONG ull;
> } ret;
>
> TRACE("\n");
>
> ret.cvtvec.page = ___lc_codepage_func();
> ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
> return ret.ull;
> }
> #else
> _Cvtvec __cdecl _Getcvt(void)
> {
> _Cvtvec ret = {0};
> #if _MSVCP_VER >= 110
> int i;
> #endif
>
> TRACE("\n");
>
> ret.cvtvec.page = ___lc_codepage_func();
> #if _MSVCP_VER < 110
> ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
> #else
> ret->mb_max = ___mb_cur_max_func();
>
> if(ret->mb_max > 1) {
> for(i=0; i<256; i++)
> if(_ismbblead(i)) ret->isleadbyte[i/8] |= 1 << (i&7);
> }
> #endif
> return ret;
> }
> #endif
>
> And the spec file entry can be changed to:
> @ cdecl -norelay _Getcvt()
>
> Please note that code written here is completely untested. I'm just
> raising some possible concerns.
Sorry for the silence. I expect you're right. I'll get around to
properly testing this at some point.
More information about the wine-devel
mailing list