summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2013-07-25 19:24:18 +0200
committerJose <jose@zeroc.com>2013-07-25 19:24:18 +0200
commitf07348f395a6eeecae963953f19fdb4b746e536a (patch)
tree76f05767ec82d257a6584a5dcfab34488929cdee /cpp/src
parentMinor build rules fix (diff)
downloadice-f07348f395a6eeecae963953f19fdb4b746e536a.tar.bz2
ice-f07348f395a6eeecae963953f19fdb4b746e536a.tar.xz
ice-f07348f395a6eeecae963953f19fdb4b746e536a.zip
Fixes for optionals and enums with explicit values in checksum calculations.
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/Checksum.cpp121
1 files changed, 110 insertions, 11 deletions
diff --git a/cpp/src/Slice/Checksum.cpp b/cpp/src/Slice/Checksum.cpp
index 94fa3bf3f6c..78406e41e86 100644
--- a/cpp/src/Slice/Checksum.cpp
+++ b/cpp/src/Slice/Checksum.cpp
@@ -9,6 +9,7 @@
#include <Slice/Checksum.h>
#include <Slice/MD5.h>
+#include <IceUtil/OutputUtil.h>
using namespace std;
using namespace Slice;
@@ -113,9 +114,38 @@ Slice::ChecksumVisitor::visitClassDefStart(const ClassDefPtr& p)
if(p->hasDataMembers())
{
DataMemberList members = p->dataMembers();
+ DataMemberList optionals;
for(DataMemberList::iterator q = members.begin(); q != members.end(); ++q)
{
- ostr << typeToString((*q)->type()) << ' ' << (*q)->name() << endl;
+ if((*q)->optional())
+ {
+ optionals.push_back(*q);
+ }
+ else
+ {
+ ostr << typeToString((*q)->type()) << ' ' << (*q)->name() << endl;
+ }
+ }
+
+ if(!optionals.empty())
+ {
+ //
+ // Sort optional parameters by tag.
+ //
+ class SortFn
+ {
+ public:
+ static bool compare(const DataMemberPtr& lhs, const DataMemberPtr& rhs)
+ {
+ return lhs->tag() < rhs->tag();
+ }
+ };
+ optionals.sort(SortFn::compare);
+
+ for(DataMemberList::iterator q = optionals.begin(); q != optionals.end(); ++q)
+ {
+ ostr << typeToString((*q)->type()) << ' ' << (*q)->tag() << ' ' << (*q)->name();
+ }
}
}
@@ -124,20 +154,63 @@ Slice::ChecksumVisitor::visitClassDefStart(const ClassDefPtr& p)
OperationList ops = p->operations();
for(OperationList::iterator q = ops.begin(); q != ops.end(); ++q)
{
- ostr << typeToString((*q)->returnType()) << ' ' << (*q)->name() << '(';
+ ostr << typeToString((*q)->returnType()) << ' ';
+ if((*q)->returnIsOptional())
+ {
+ ostr << (*q)->returnTag() << ' ';
+ }
+ ostr << (*q)->name() << '(';
ParamDeclList params = (*q)->parameters();
+ ParamDeclList optionals;
for(ParamDeclList::iterator r = params.begin(); r != params.end(); ++r)
{
- if(r != params.begin())
+ if((*r)->optional())
{
- ostr << ", ";
+ optionals.push_back(*r);
}
- if((*r)->isOutParam())
+ else
{
- ostr << "out ";
+ if(r != params.begin())
+ {
+ ostr << ", ";
+ }
+ if((*r)->isOutParam())
+ {
+ ostr << "out ";
+ }
+ ostr << typeToString((*r)->type()) << ' ' << (*r)->name();
}
- ostr << typeToString((*r)->type()) << ' ' << (*r)->name();
}
+
+ if(!optionals.empty())
+ {
+ //
+ // Sort optional parameters by tag.
+ //
+ class SortFn
+ {
+ public:
+ static bool compare(const ParamDeclPtr& lhs, const ParamDeclPtr& rhs)
+ {
+ return lhs->tag() < rhs->tag();
+ }
+ };
+ optionals.sort(SortFn::compare);
+
+ for(ParamDeclList::iterator r = optionals.begin(); r != optionals.end(); ++r)
+ {
+ if(r != optionals.begin() || params.size() > optionals.size())
+ {
+ ostr << ", ";
+ }
+ if((*r)->isOutParam())
+ {
+ ostr << "out ";
+ }
+ ostr << typeToString((*r)->type()) << ' ' << (*r)->tag() << ' ' << (*r)->name();
+ }
+ }
+
ostr << ')';
ExceptionList ex = (*q)->throws();
if(!ex.empty())
@@ -252,13 +325,39 @@ Slice::ChecksumVisitor::visitEnum(const EnumPtr& p)
ostringstream ostr;
ostr << "enum " << p->name() << endl;
-
+
+ //
+ // Check if any of the enumerators were assigned an explicit value.
+ //
+ const bool explicitValue = p->explicitValue();
+
EnumeratorList enums = p->getEnumerators();
- for(EnumeratorList::iterator q = enums.begin(); q != enums.end(); ++q)
+ if(explicitValue)
{
- ostr << (*q)->name() << endl;
+ //
+ // Sort enumerators by value.
+ //
+ class SortFn
+ {
+ public:
+ static bool compare(const EnumeratorPtr& lhs, const EnumeratorPtr& rhs)
+ {
+ return lhs->value() < rhs->value();
+ }
+ };
+ enums.sort(SortFn::compare);
+ for(EnumeratorList::iterator q = enums.begin(); q != enums.end(); ++q)
+ {
+ ostr << (*q)->name() << ' ' << IceUtilInternal::int64ToString((*q)->value()) << endl;
+ }
+ }
+ else
+ {
+ for(EnumeratorList::iterator q = enums.begin(); q != enums.end(); ++q)
+ {
+ ostr << (*q)->name() << endl;
+ }
}
-
updateMap(p->scoped(), ostr.str());
}