Adrian Stachlewski created THRIFT-5885:
------------------------------------------

             Summary: TBinaryProtocolAccelerated incorrectly deserializes 
IntEnum to None
                 Key: THRIFT-5885
                 URL: https://issues.apache.org/jira/browse/THRIFT-5885
             Project: Thrift
          Issue Type: Bug
          Components: Python - Compiler, Python - Library
    Affects Versions: 0.22.0
         Environment: thrift==0.22.0
            Reporter: Adrian Stachlewski


When using {{{}TBinaryProtocolAccelerated{}}}, {{IntEnum}} fields are 
incorrectly deserialized to {{{}None{}}}.

This issue occurs when the {{read}} function is executed via 
{{{}_fast_decode{}}}. In this path, the custom deserialization logic 
{{CustomEnum(iprot.readI32())}} is skipped. Instead, an integer value 
({{{}i32{}}}) is directly passed to {{{}__setattr__{}}}, where the value is 
resolved using:
{code:java}
Operation.__members__.get(value) {code}
However, __members__ maps enum names (not values) to enum members, which 
results in the call returning None. This leads to the enum field being set to 
None instead of the expected enum instance. A minimal and effective fix could 
be to update the __setattr__ method logic to:
{code:java}
if name == "enum_field":
    super().__setattr__(name, value if hasattr(value, 'value') or value is None 
else Operation(value)) {code}
This would ensure that the enum value is correctly reconstructed from its 
integer representation during deserialization.
 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to