Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
0.9
-
None
-
None
-
All
Description
The Javascript compiler is unable to serialize maps where a struct is a key due to particularities with how Javascript treats {} objects.
Using the following thrift definition:
struct Foo { 1: required string name; } struct Bar { 1: required string description; } struct Mapper { 1: required map<Foo,Bar> fooToBar; }
It produces the following javascript code:
Mapper.prototype.write = function(output) { output.writeStructBegin('Mapper'); if (this.fooToBar !== null && this.fooToBar !== undefined) { output.writeFieldBegin('fooToBar', Thrift.Type.MAP, 1); output.writeMapBegin(Thrift.Type.STRUCT, Thrift.Type.STRUCT, Thrift.objectLength(this.fooToBar)); // XXX // This will always fail as kiter8 will always be a String // XXX for (var kiter8 in this.fooToBar) { if (this.fooToBar.hasOwnProperty(kiter8)) { var viter9 = this.fooToBar[kiter8]; // kiter8 is a string, not an object. kiter8.write(output); viter9.write(output); } } output.writeMapEnd(); output.writeFieldEnd(); } output.writeFieldStop(); output.writeStructEnd(); return; };
This code always fails since enumeration of an object's keys will always yield String values. I've annotated the relevant parts in the above code.
There isn't really a simple fix for this either: Using for-in, there is no way to get a reference to the original key object. Practically, a Map type would have to be added to the thrift library with basic put()/get()/delete() operations to allow for struct maps.