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)