From 0d5120a8a1c871784ee9c73010fb69bea6a19eb2 Mon Sep 17 00:00:00 2001 From: Jose Date: Mon, 11 Jan 2021 20:41:50 +0100 Subject: Fix Swift marshal and unmarshal of exception optional data members --- cpp/src/slice2swift/Gen.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'cpp/src/slice2swift/Gen.cpp') diff --git a/cpp/src/slice2swift/Gen.cpp b/cpp/src/slice2swift/Gen.cpp index 056786dee5d..7dd2ecc8aec 100644 --- a/cpp/src/slice2swift/Gen.cpp +++ b/cpp/src/slice2swift/Gen.cpp @@ -434,6 +434,7 @@ Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) const DataMemberList members = p->dataMembers(); const DataMemberList allMembers = p->allDataMembers(); const DataMemberList baseMembers = base ? base->allDataMembers() : DataMemberList(); + const DataMemberList optionalMembers = p->orderedOptionalDataMembers(); StringPairList extraParams; if(p->isLocal()) @@ -489,7 +490,17 @@ Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) << (!base ? "true" : "false") << ")"; for(DataMemberList::const_iterator i = members.begin(); i != members.end(); ++i) { - writeMarshalUnmarshalCode(out, (*i)->type(), p, "self." + fixIdent((*i)->name()), true, (*i)->tag()); + DataMemberPtr member = *i; + if(!member->optional()) + { + writeMarshalUnmarshalCode(out, member->type(), p, "self." + fixIdent(member->name()), true); + } + } + + for(DataMemberList::const_iterator i = optionalMembers.begin(); i != optionalMembers.end(); ++i) + { + DataMemberPtr member = *i; + writeMarshalUnmarshalCode(out, member->type(), p, "self." + fixIdent(member->name()), true, member->tag()); } out << nl << "ostr.endSlice()"; if(base) @@ -505,8 +516,19 @@ Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p) out << nl << "_ = try istr.startSlice()"; for(DataMemberList::const_iterator i = members.begin(); i != members.end(); ++i) { - writeMarshalUnmarshalCode(out, (*i)->type(), p, "self." + fixIdent((*i)->name()), false, (*i)->tag()); + DataMemberPtr member = *i; + if(!member->optional()) + { + writeMarshalUnmarshalCode(out, member->type(), p, "self." + fixIdent(member->name()), false); + } + } + + for(DataMemberList::const_iterator i = optionalMembers.begin(); i != optionalMembers.end(); ++i) + { + DataMemberPtr member = *i; + writeMarshalUnmarshalCode(out, member->type(), p, "self." + fixIdent(member->name()), false, member->tag()); } + out << nl << "try istr.endSlice()"; if(base) { -- cgit v1.2.3