summaryrefslogtreecommitdiff
path: root/cpp/src/slice2js
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-06-16 16:12:59 +0200
committerJose <jose@zeroc.com>2015-06-16 16:12:59 +0200
commit0fe91035e5d1f074c011a9489d9113cea8f17008 (patch)
tree5155aa107a49696407bc5c5a190899275bd7c9f6 /cpp/src/slice2js
parentFixed ICE-6594: IceGrid/replication test failure (diff)
downloadice-0fe91035e5d1f074c011a9489d9113cea8f17008.tar.bz2
ice-0fe91035e5d1f074c011a9489d9113cea8f17008.tar.xz
ice-0fe91035e5d1f074c011a9489d9113cea8f17008.zip
Fixed ICE-6602: optionals marshaling bug
Diffstat (limited to 'cpp/src/slice2js')
-rw-r--r--cpp/src/slice2js/Gen.cpp39
-rw-r--r--cpp/src/slice2js/Gen.h4
2 files changed, 23 insertions, 20 deletions
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<string> 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 << ");";
diff --git a/cpp/src/slice2js/Gen.h b/cpp/src/slice2js/Gen.h
index 3c9781471c7..4d17cf75a90 100644
--- a/cpp/src/slice2js/Gen.h
+++ b/cpp/src/slice2js/Gen.h
@@ -26,8 +26,8 @@ protected:
void writeMarshalUnmarshalParams(const ParamDeclList&, const OperationPtr&, bool);
void writePostUnmarshalParams(const ParamDeclList&, const OperationPtr&);
- void writeMarshalDataMembers(const DataMemberList&);
- void writeUnmarshalDataMembers(const DataMemberList&);
+ void writeMarshalDataMembers(const DataMemberList&, const DataMemberList&);
+ void writeUnmarshalDataMembers(const DataMemberList&, const DataMemberList&);
void writeInitDataMembers(const DataMemberList&, const std::string&);
virtual std::vector<std::string> getParams(const OperationPtr&);