THRIFT-3652 incorrect serialization of optionals
Client: AS3
Patch: Jens Geyer
diff --git a/compiler/cpp/src/generate/t_as3_generator.cc b/compiler/cpp/src/generate/t_as3_generator.cc
index c0a03dc..67beaf6 100644
--- a/compiler/cpp/src/generate/t_as3_generator.cc
+++ b/compiler/cpp/src/generate/t_as3_generator.cc
@@ -926,6 +926,11 @@
indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+ bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
+ if (could_be_unset) {
+ indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl;
+ indent_up();
+ }
bool null_allowed = type_can_be_null((*f_iter)->get_type());
if (null_allowed) {
out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
@@ -945,6 +950,10 @@
indent_down();
indent(out) << "}" << endl;
}
+ if (could_be_unset) {
+ indent_down();
+ indent(out) << "}" << endl;
+ }
}
// Write the struct map
out << indent() << "oprot.writeFieldStop();" << endl << indent() << "oprot.writeStructEnd();"