Jens Geyer created THRIFT-5994:
----------------------------------

             Summary: Haxe generator: map<bool,V>, map<double,V>, map<binary,V> 
and set equivalents generate invalid ObjectMap/ObjectSet
                 Key: THRIFT-5994
                 URL: https://issues.apache.org/jira/browse/THRIFT-5994
             Project: Thrift
          Issue Type: Bug
          Components: Haxe - Compiler, Haxe - Library
            Reporter: Jens Geyer


When a Thrift IDL file uses {{bool}}, {{double}}, or {{binary}} as a map key 
type or set element type, the Haxe generator emits {{ObjectMap<Bool,V>}}, 
{{ObjectMap<Float,V>}}, {{ObjectMap<Bytes,V>}}, {{ObjectSet<Bool>}}, 
{{ObjectSet<Float>}}, or {{ObjectSet<Bytes>}}. These usages are all invalid:

- {{ObjectMap<K,V>}} and {{ObjectSet<K>}} require {{K : {}}} (a 
reference/object type constraint). {{Bool}} and {{Float}} are Haxe value types 
that do not satisfy this constraint, causing a compile-time type error.
- {{Bytes}} satisfies the constraint structurally, but 
{{ObjectMap}}/{{ObjectSet}} use reference equality. Two equal {{Bytes}} values 
at different addresses are treated as distinct keys/elements, producing 
semantically incorrect behaviour.

Fix: add three new helper classes to the Thrift Haxe library:

- {{BoolMap<T>}} / {{BoolSet}}: implement {{haxe.Constraints.IMap<Bool,T>}} 
backed by {{IntMap<T>}} / {{IntMap<Int>}} with encoding {{k ? 1 : 0}}.
- {{FloatMap<T>}} / {{FloatSet}}: implement {{haxe.Constraints.IMap<Float,T>}} 
backed by {{StringMap<T>}} / {{StringMap<Int>}} with keys stored as 8-byte IEEE 
754 hex strings (via {{Bytes.setDouble}}), giving exact equality semantics 
including NaN, -0.0, and infinities.
- {{BytesMap<T>}} / {{BytesSet}}: implement {{haxe.Constraints.IMap<Bytes,T>}} 
backed by {{StringMap<T>}} / {{StringMap<Int>}} with keys stored as hex strings 
({{Bytes.toHex}}), giving content equality semantics.

Wire the new types in {{type_name()}}: {{map<bool,V>}} -> {{BoolMap}}, 
{{map<double,V>}} -> {{FloatMap}}, {{map<binary,V>}} -> {{BytesMap}}; 
{{set<bool>}} -> {{BoolSet}}, {{set<double>}} -> {{FloatSet}}, {{set<binary>}} 
-> {{BytesSet}}.



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

Reply via email to