diff options
author | Jose <jose@zeroc.com> | 2015-06-16 16:12:59 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2015-06-16 16:12:59 +0200 |
commit | 0fe91035e5d1f074c011a9489d9113cea8f17008 (patch) | |
tree | 5155aa107a49696407bc5c5a190899275bd7c9f6 /cpp/src/slice2java | |
parent | Fixed ICE-6594: IceGrid/replication test failure (diff) | |
download | ice-0fe91035e5d1f074c011a9489d9113cea8f17008.tar.bz2 ice-0fe91035e5d1f074c011a9489d9113cea8f17008.tar.xz ice-0fe91035e5d1f074c011a9489d9113cea8f17008.zip |
Fixed ICE-6602: optionals marshaling bug
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 112 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.h | 2 |
2 files changed, 78 insertions, 36 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index 0cfbdc57c37..469a8751f5e 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -855,7 +855,8 @@ Slice::JavaVisitor::writeStreamUnmarshalDataMember(Output& out, const string& pa } void -Slice::JavaVisitor::writePatcher(Output& out, const string& package, const DataMemberList& classMembers, bool stream) +Slice::JavaVisitor::writePatcher(Output& out, const string& package, const DataMemberList& classMembers, + const DataMemberList& optionalMembers, bool stream) { out << sp << nl << "private class Patcher implements IceInternal.Patcher"; if(stream) @@ -881,6 +882,11 @@ Slice::JavaVisitor::writePatcher(Output& out, const string& package, const DataM int memberCount = 0; for(DataMemberList::const_iterator d = classMembers.begin(); d != classMembers.end(); ++d) { + if((*d)->optional()) + { + continue; + } + BuiltinPtr b = BuiltinPtr::dynamicCast((*d)->type()); if(b) { @@ -902,8 +908,60 @@ Slice::JavaVisitor::writePatcher(Output& out, const string& package, const DataM } } - if((*d)->optional()) + string memberName = fixKwd((*d)->name()); + if(b) + { + out << nl << memberName << " = v;"; + } + else + { + string memberType = typeToString((*d)->type(), TypeModeMember, package); + out << nl << "if(v == null || v instanceof " << memberType << ")"; + out << sb; + out << nl << memberName << " = (" << memberType << ")v;"; + out << eb; + out << nl << "else"; + out << sb; + out << nl << "IceInternal.Ex.throwUOE(type(), v);"; + out << eb; + } + + if(classMembers.size() > 1) + { + out << nl << "break;"; + } + + memberCount++; + } + + for(DataMemberList::const_iterator d = optionalMembers.begin(); d != optionalMembers.end(); ++d) + { + BuiltinPtr b = BuiltinPtr::dynamicCast((*d)->type()); + if(b && b->kind() != Builtin::KindObject) { + continue; + } + + TypePtr paramType = (*d)->type(); + BuiltinPtr builtin = BuiltinPtr::dynamicCast(paramType); + if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(paramType)) + { + + if(classMembers.size() > 1) + { + out.dec(); + out << nl << "case " << memberCount << ":"; + out.inc(); + if(b) + { + out << nl << "__typeId = Ice.ObjectImpl.ice_staticId();"; + } + else + { + out << nl << "__typeId = \"" << (*d)->type()->typeId() << "\";"; + } + } + string capName = (*d)->name(); capName[0] = toupper(static_cast<unsigned char>(capName[0])); @@ -923,35 +981,16 @@ Slice::JavaVisitor::writePatcher(Output& out, const string& package, const DataM out << nl << "IceInternal.Ex.throwUOE(type(), v);"; out << eb; } - } - else - { - string memberName = fixKwd((*d)->name()); - if(b) + + if(classMembers.size() > 1) { - out << nl << memberName << " = v;"; + out << nl << "break;"; } - else - { - string memberType = typeToString((*d)->type(), TypeModeMember, package); - out << nl << "if(v == null || v instanceof " << memberType << ")"; - out << sb; - out << nl << memberName << " = (" << memberType << ")v;"; - out << eb; - out << nl << "else"; - out << sb; - out << nl << "IceInternal.Ex.throwUOE(type(), v);"; - out << eb; - } - } - if(classMembers.size() > 1) - { - out << nl << "break;"; + memberCount++; } - - memberCount++; } + if(classMembers.size() > 1) { out << eb; @@ -1709,18 +1748,20 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr& } out << eb; + DataMemberList classMembers = p->classDataMembers(); DataMemberList allClassMembers = p->allClassDataMembers(); - if(allClassMembers.size() != 0) + + if(classMembers.size() != 0) { - writePatcher(out, package, allClassMembers, stream); + writePatcher(out, package, classMembers, optionalMembers, stream); } out << sp << nl << "protected void __readImpl(IceInternal.BasicStream __is)"; out << sb; out << nl << "__is.startReadSlice();"; - DataMemberList classMembers = p->classDataMembers(); + int classMemberCount = static_cast<int>(allClassMembers.size() - classMembers.size()); - const bool needCustomPatcher = classMembers.size() > 1 || allClassMembers.size() > 1; + const bool needCustomPatcher = classMembers.size() > 1; iter = 0; for(DataMemberList::const_iterator d = members.begin(); d != members.end(); ++d) { @@ -3697,18 +3738,19 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) } out << eb; + DataMemberList classMembers = p->classDataMembers(); DataMemberList allClassMembers = p->allClassDataMembers(); - if(allClassMembers.size() != 0) + + if(classMembers.size() != 0) { - writePatcher(out, package, allClassMembers, _stream); + writePatcher(out, package, classMembers, optionalMembers, _stream); } out << sp << nl << "protected void" << nl << "__readImpl(IceInternal.BasicStream __is)"; out << sb; out << nl << "__is.startReadSlice();"; iter = 0; - DataMemberList classMembers = p->classDataMembers(); int classMemberCount = static_cast<int>(allClassMembers.size() - classMembers.size()); - const bool needCustomPatcher = classMembers.size() > 1 || allClassMembers.size() > 1; + const bool needCustomPatcher = classMembers.size() > 1; for(DataMemberList::const_iterator d = members.begin(); d != members.end(); ++d) { if(!(*d)->optional()) @@ -4046,7 +4088,7 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p) if(classMembers.size() != 0) { - writePatcher(out, package, classMembers, _stream); + writePatcher(out, package, classMembers, DataMemberList(), _stream); } out << sp << nl << "public void" << nl << "__read(IceInternal.BasicStream __is)"; diff --git a/cpp/src/slice2java/Gen.h b/cpp/src/slice2java/Gen.h index e4764171406..e4def10d75e 100644 --- a/cpp/src/slice2java/Gen.h +++ b/cpp/src/slice2java/Gen.h @@ -86,7 +86,7 @@ protected: // // Generate a patcher class. // - void writePatcher(::IceUtilInternal::Output&, const std::string&, const DataMemberList&, bool); + void writePatcher(::IceUtilInternal::Output&, const std::string&, const DataMemberList&, const DataMemberList&, bool); // // Generate dispatch and marshalling methods for a class or interface. |