[Bug 51899] 16-bit Collins Dictionary has black background.

WineHQ Bugzilla wine-bugs at winehq.org
Sat Oct 23 12:13:38 CDT 2021


https://bugs.winehq.org/show_bug.cgi?id=51899

--- Comment #11 from Bruni <earns.61 at gmail.com> ---
(In reply to O. Nykyforchyn from comment #10)

> This expression tests whether the supplied handle is valid, I see no way to
> make the code with it simpler.
> 
> https://source.winehq.org/patches/data/218030

How about this code? Also, where can one see if your patch was accepted?
(before a new wine release)

DC_ATTR *get_dc_attr( HDC hdc )
{
    DWORD handle_type_bit_mask = 0x1f0000;
    DWORD type = gdi_handle_type( hdc );
    DC_ATTR *dc_attr = get_gdi_client_ptr( hdc, 0 );

    if (!type)
        return dc_attr->disabled ? NULL : dc_attr;

    if ((type & handle_type_bit_mask) != NTGDI_OBJ_DC)
    {
        SetLastError( ERROR_INVALID_HANDLE );
        return NULL;
    }

    if (!dc_attr)
    {
        SetLastError( ERROR_INVALID_HANDLE );
        return NULL;
    }

    return dc_attr->disabled ? NULL : dc_attr;
}

Explanation:

In (type && (type & 0x1f0000) != NTGDI_OBJ_DC),

!= has higher precedence than &&, both have left-to-right associativity

That is, it is grouped as (type && ((type & 0x1f0000) != NTGDI_OBJ_DC)).

If we let
>if ((type && (type & 0x1f0000) != NTGDI_OBJ_DC) || !(dc_attr = get_gdi_client_ptr( hdc, 0 )))

be
>if ((x && y) || !z))

where `type` stands for x

`(type & 0x1f0000) != NTGDI_OBJ_DC` stands for y

`(dc_attr = get_gdi_client_ptr( hdc, 0 ))` stands for z

then

Both && and || are affected by "Short-circuit evaluation" rule.

So in if ((x && y) || !z) { body } expression,

it's enough for both x and y to be true or for z to be false to execute if's
body.

So z can be split into separate if, which can be placed after original if,
copying its body.

Which results in
if (x && y) { body }
if (!z) { body }

In if (x && y) { body } expression,

it's enough for x to be false to not execute if's body.
And one can immediately return in our case, where if's body is the last block
before `return`.

So one can decompose it as follows

if (!x) return
if (y) { body }
if (!z) { body }

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list