diff options
author | Jose <jose@zeroc.com> | 2011-12-30 00:50:17 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2011-12-30 00:50:17 +0100 |
commit | 7c87650730bd406521e4a75a7374e62ba3128ad2 (patch) | |
tree | dddad39775ca64d5324f0be7b75469d6c1d78999 /cpp/src/Slice/JavaUtil.cpp | |
parent | ICE-4565 - Generate default value initialization in header file (diff) | |
download | ice-7c87650730bd406521e4a75a7374e62ba3128ad2.tar.bz2 ice-7c87650730bd406521e4a75a7374e62ba3128ad2.tar.xz ice-7c87650730bd406521e4a75a7374e62ba3128ad2.zip |
ICE-3441 - Compute serialVersionUID
Diffstat (limited to 'cpp/src/Slice/JavaUtil.cpp')
-rw-r--r-- | cpp/src/Slice/JavaUtil.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp index e124b33292d..533342a6593 100644 --- a/cpp/src/Slice/JavaUtil.cpp +++ b/cpp/src/Slice/JavaUtil.cpp @@ -11,6 +11,7 @@ #include <Slice/JavaUtil.h> #include <Slice/FileTracker.h> #include <Slice/Util.h> +#include <Slice/MD5.h> #include <IceUtil/Functional.h> #include <IceUtil/DisableWarnings.h> @@ -31,6 +32,100 @@ using namespace Slice; using namespace IceUtil; using namespace IceUtilInternal; +long +Slice::computeSerialVersionUUID(const ClassDefPtr& p) +{ + ostringstream os; + + ClassList bases = p->bases(); + os << "Name: " << p->scoped(); + + os << " Bases: ["; + for(ClassList::const_iterator i = bases.begin(); i != bases.end();) + { + os << (*i)->scoped(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + os << " Members: ["; + DataMemberList members = p->dataMembers(); + for(DataMemberList::const_iterator i = members.begin(); i != members.end();) + { + os << (*i)->name() << ":" << (*i)->type(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + const string data = os.str(); + MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size())); + vector<unsigned char> bytes; + bytes.resize(16); + md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0])); + + long h0 = 0; + long h1 = 0; + for(int i = 0; i < 8; ++i) + { + h0 |= (long)bytes[i] << (i * 4); + } + if(h0) + + for(int i = 0; i < 8; ++i) + { + h1 |= (long)bytes[i + 8] << (i * 4); + } + return abs(h0 ^ h1); +} + +long +Slice::computeSerialVersionUUID(const StructPtr& p) +{ + ostringstream os; + + os << "Name: " << p->scoped(); + os << " Members: ["; + DataMemberList members = p->dataMembers(); + for(DataMemberList::const_iterator i = members.begin(); i != members.end();) + { + os << (*i)->name() << ":" << (*i)->type(); + i++; + if(i != l.end()) + { + os << ", "; + } + } + os << "]"; + + const string data = os.str(); + MD5 md5(reinterpret_cast<const unsigned char*>(data.c_str()), static_cast<int>(data.size())); + vector<unsigned char> bytes; + bytes.resize(16); + md5.getDigest(reinterpret_cast<unsigned char*>(&bytes[0])); + + long h0 = 0; + long h1 = 0; + for(int i = 0; i < 8; ++i) + { + h0 |= (long)bytes[i] << (i * 4); + } + + for(int i = 0; i < 8; ++i) + { + h1 |= (long)bytes[i + 8] << (i * 4); + } + + return abs(h0 ^ h1); +} + Slice::JavaOutput::JavaOutput() { } @@ -2829,6 +2924,11 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont) result.push_back(s); continue; } + else if(s.substr(prefix.size(), pos - prefix.size()) == "serialVersionUID") + { + result.push_back(s); + continue; + } emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'"); } |