summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/JavaUtil.cpp77
-rw-r--r--cpp/src/slice2java/Gen.cpp71
2 files changed, 116 insertions, 32 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp
index 0c75dadedd0..6b6559b4f2f 100644
--- a/cpp/src/Slice/JavaUtil.cpp
+++ b/cpp/src/Slice/JavaUtil.cpp
@@ -32,6 +32,21 @@ using namespace Slice;
using namespace IceUtil;
using namespace IceUtilInternal;
+
+namespace
+{
+
+void
+hashAdd(long& hashCode, const std::string& value)
+{
+ for(std::string::const_iterator p = value.begin(); p != value.end(); ++p)
+ {
+ hashCode = ((hashCode << 5) + hashCode) ^ *p;
+ }
+}
+
+}
+
long
Slice::computeSerialVersionUUID(const ClassDefPtr& p)
{
@@ -66,23 +81,9 @@ Slice::computeSerialVersionUUID(const ClassDefPtr& p)
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);
+ long hashCode = 5381;
+ hashAdd(hashCode, data);
+ return hashCode;
}
long
@@ -105,26 +106,38 @@ Slice::computeSerialVersionUUID(const StructPtr& p)
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)
+ long hashCode = 5381;
+ hashAdd(hashCode, data);
+ return hashCode;
+}
+
+long
+Slice::computeSerialVersionUUID(const ExceptionPtr& p)
+{
+ ostringstream os;
+
+ os << "Name: " << p->scoped();
+ os << " Members: [";
+ DataMemberList members = p->dataMembers();
+ for(DataMemberList::const_iterator i = members.begin(); i != members.end();)
{
- h1 |= (long)bytes[i + 8] << (i * 4);
+ os << (*i)->name() << ":" << (*i)->type();
+ i++;
+ if(i != members.end())
+ {
+ os << ", ";
+ }
}
+ os << "]";
- return abs(h0 ^ h1);
+ const string data = os.str();
+ long hashCode = 5381;
+ hashAdd(hashCode, data);
+ return hashCode;
}
+
+
Slice::JavaOutput::JavaOutput()
{
}
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index 5d8c60fad01..b85daa68764 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -2460,6 +2460,41 @@ Slice::Gen::TieVisitor::visitClassDefStart(const ClassDefPtr& p)
}
out << sp << nl << "private " << '_' << name << opIntfName << " _ice_delegate;";
+ out << sp << nl << "public static final long serialVersionUID = ";
+ string serialVersionUID;
+ if(p->findMetaData("java:serialVersionUID", serialVersionUID))
+ {
+ string::size_type pos = serialVersionUID.rfind(":") + 1;
+ if(pos == string::npos)
+ {
+ ostringstream os;
+ os << "ignoring invalid serialVersionUID for class `" << p->scoped() << "'; generating default value";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ else
+ {
+ Int64 v = 0;
+ serialVersionUID = serialVersionUID.substr(pos);
+ if(serialVersionUID != "0")
+ {
+ if(!stringToInt64(serialVersionUID, v)) // conversion error
+ {
+ ostringstream os;
+ os << "ignoring invalid serialVersionUID for class `" << p->scoped()
+ << "'; generating default value";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ }
+ out << v;
+ }
+ }
+ else
+ {
+ out << computeSerialVersionUUID(p);
+ }
+ out << "L;";
out << eb;
close();
@@ -3383,6 +3418,42 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
}
}
+ out << sp << nl << "public static final long serialVersionUID = ";
+ string serialVersionUID;
+ if(p->findMetaData("java:serialVersionUID", serialVersionUID))
+ {
+ string::size_type pos = serialVersionUID.rfind(":") + 1;
+ if(pos == string::npos)
+ {
+ ostringstream os;
+ os << "ignoring invalid serialVersionUID for exception `" << p->scoped() << "'; generating default value";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ else
+ {
+ Int64 v = 0;
+ serialVersionUID = serialVersionUID.substr(pos);
+ if(serialVersionUID != "0")
+ {
+ if(!stringToInt64(serialVersionUID, v)) // conversion error
+ {
+ ostringstream os;
+ os << "ignoring invalid serialVersionUID for exception `" << p->scoped()
+ << "'; generating default value";
+ emitWarning("", "", os.str());
+ out << computeSerialVersionUUID(p);
+ }
+ }
+ out << v;
+ }
+ }
+ else
+ {
+ out << computeSerialVersionUUID(p);
+ }
+ out << "L;";
+
out << eb;
close();
}