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();"