From 0fe91035e5d1f074c011a9489d9113cea8f17008 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 16 Jun 2015 16:12:59 +0200 Subject: Fixed ICE-6602: optionals marshaling bug --- cpp/src/slice2js/Gen.cpp | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) (limited to 'cpp/src/slice2js/Gen.cpp') diff --git a/cpp/src/slice2js/Gen.cpp b/cpp/src/slice2js/Gen.cpp index 0f14a9be27e..a7fdc7913b2 100644 --- a/cpp/src/slice2js/Gen.cpp +++ b/cpp/src/slice2js/Gen.cpp @@ -170,23 +170,24 @@ Slice::JsVisitor::writeMarshalUnmarshalParams(const ParamDeclList& params, const } void -Slice::JsVisitor::writeMarshalDataMembers(const DataMemberList& dataMembers) +Slice::JsVisitor::writeMarshalDataMembers(const DataMemberList& dataMembers, const DataMemberList& optionalMembers) { for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { - if((*q)->optional()) - { - writeOptionalMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), (*q)->tag(), true); - } - else + if(!(*q)->optional()) { writeMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), true); } } + + for(DataMemberList::const_iterator q = optionalMembers.begin(); q != optionalMembers.end(); ++q) + { + writeOptionalMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), (*q)->tag(), true); + } } void -Slice::JsVisitor::writeUnmarshalDataMembers(const DataMemberList& dataMembers) +Slice::JsVisitor::writeUnmarshalDataMembers(const DataMemberList& dataMembers, const DataMemberList& optionalMembers) { for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { @@ -199,15 +200,16 @@ Slice::JsVisitor::writeUnmarshalDataMembers(const DataMemberList& dataMembers) for(DataMemberList::const_iterator q = dataMembers.begin(); q != dataMembers.end(); ++q) { - if((*q)->optional()) - { - writeOptionalMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), (*q)->tag(), false); - } - else + if(!(*q)->optional()) { writeMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), false); } } + + for(DataMemberList::const_iterator q = optionalMembers.begin(); q != optionalMembers.end(); ++q) + { + writeOptionalMarshalUnmarshalCode(_out, (*q)->type(), "this." + fixId((*q)->name()), (*q)->tag(), false); + } } void @@ -1220,11 +1222,11 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p) { _out << nl << "function(__os)"; _out << sb; - writeMarshalDataMembers(dataMembers); + writeMarshalDataMembers(dataMembers, optionalMembers); _out << eb << ","; _out << nl << "function(__is)"; _out << sb; - writeUnmarshalDataMembers(dataMembers); + writeUnmarshalDataMembers(dataMembers, optionalMembers); _out << eb << ","; _out << nl; } @@ -1543,6 +1545,7 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) const DataMemberList allDataMembers = p->allDataMembers(); const DataMemberList dataMembers = p->dataMembers(); + const DataMemberList optionalMembers = p->orderedOptionalDataMembers(); vector allParamNames; for(DataMemberList::const_iterator q = allDataMembers.begin(); q != allDataMembers.end(); ++q) @@ -1584,11 +1587,11 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) { _out << nl << "function(__os)"; _out << sb; - writeMarshalDataMembers(dataMembers); + writeMarshalDataMembers(dataMembers, optionalMembers); _out << eb << ","; _out << nl << "function(__is)"; _out << sb; - writeUnmarshalDataMembers(dataMembers); + writeUnmarshalDataMembers(dataMembers, optionalMembers); _out << eb; } else @@ -1653,11 +1656,11 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p) _out << ","; _out << nl << "function(__os)"; _out << sb; - writeMarshalDataMembers(dataMembers); + writeMarshalDataMembers(dataMembers, DataMemberList()); _out << eb << ","; _out << nl << "function(__is)"; _out << sb; - writeUnmarshalDataMembers(dataMembers); + writeUnmarshalDataMembers(dataMembers, DataMemberList()); _out << eb << "," << nl << p->minWireSize() << ", " << nl << (p->isVariableLength() ? "false" : "true"); _out.dec(); _out << ");"; -- cgit v1.2.3