Dmytro Shteflyuk created THRIFT-6104:
----------------------------------------

             Summary: Ruby native struct writing should accept Set subclasses
                 Key: THRIFT-6104
                 URL: https://issues.apache.org/jira/browse/THRIFT-6104
             Project: Thrift
          Issue Type: Bug
            Reporter: Dmytro Shteflyuk
            Assignee: Dmytro Shteflyuk


h3. Problem

The native struct writer handles a Thrift {{set}} field as a Ruby {{Set}} only 
when the value has the exact {{Set}} class.

A subclass of {{Set}} is therefore rejected by the native extension and falls 
through to the Hash handling path. The pure-Ruby writer accepts the subclass 
through the normal {{Set}} contract and serializes its elements.

h3. Client impact

Ruby clients can use a {{Set}} subclass for a generated struct field declared 
as a Thrift {{set}}, yet receive different behavior depending on whether 
{{thrift_native}} is loaded.

The same value serializes in pure-Ruby mode but raises a type error in native 
mode, even though it has the public {{Set}} behavior expected by the generated 
field.

h3. Reproduction

Given a generated struct with a {{set<i16>}} field:

{code:ruby}
class TaggedSet < Set
end

record = MyGeneratedStruct.new(
  values: TaggedSet.new([5, 17, 239])
)

Thrift::Serializer.new(Thrift::BinaryProtocolFactory.new).serialize(record)
{code}

With the native extension loaded, serialization rejects {{TaggedSet}} as though 
it were not a {{Set}}. Without the native extension, it serializes the same 
elements.

h3. Expected behavior

Native struct writing should honor the public {{Set}} contract and accept 
subclasses of {{Set}}. A {{Set}} subclass should serialize the same elements as 
an equivalent {{Set}}.



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

Reply via email to