python-dbus-next icon indicating copy to clipboard operation
python-dbus-next copied to clipboard

Use enum's constructor to resolve enum values

Open whot opened this issue 3 years ago • 0 comments

Rather than creating a map of {value: enum}, let's just use Foo(value) to resolve to the respective enum value.

This fixes a regression with introspection introduced in commit 3282eed "Improve unmarshall performance":

  File "dbus_next/_private/unmarshaller.py", line 247, in _read_header
    self.flag = MESSAGE_FLAG_MAP[buffer[2]]
                ~~~~~~~~~~~~~~~~^^^^^^^^^^^
  KeyError: 0

MESSAGE_FLAG_MAP is built like this:

    MESSAGE_FLAG_MAP = {field.value: field for field in MessageFlag}

But MessageFlag is a IntFlag, so the zero value (NONE) is missing from the iterator:

  >>> [f for f in dbus_next.constants.MessageFlag]
  [<MessageFlag.NO_REPLY_EXPECTED: 1>, <MessageFlag.NO_AUTOSTART: 2>,
   <MessageFlag.ALLOW_INTERACTIVE_AUTHORIZATION: 4>]

Resolving the enum through the constructor fixes this. MESSAGE_TYPE_MAP and HEADER_NAME_MAP are changed in solidarity.

Fixes #142

whot avatar Nov 17 '22 09:11 whot