summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2cpp')
-rw-r--r--cpp/src/slice2cpp/.depend2
-rw-r--r--cpp/src/slice2cpp/Gen.cpp38
-rw-r--r--cpp/src/slice2cpp/Gen.h2
-rw-r--r--cpp/src/slice2cpp/Main.cpp13
4 files changed, 50 insertions, 5 deletions
diff --git a/cpp/src/slice2cpp/.depend b/cpp/src/slice2cpp/.depend
index 31f8f9f1846..f6f33296ae8 100644
--- a/cpp/src/slice2cpp/.depend
+++ b/cpp/src/slice2cpp/.depend
@@ -1,2 +1,2 @@
-Gen.o: Gen.cpp Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/CPlusPlusUtil.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Iterator.h
+Gen.o: Gen.cpp Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/CPlusPlusUtil.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Iterator.h ../../include/Slice/Checksum.h
Main.o: Main.cpp ../../include/Slice/Preprocessor.h ../../include/IceUtil/Config.h Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index 2cb5bfa7352..e12c24edde6 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -11,6 +11,7 @@
#include <Slice/CPlusPlusUtil.h>
#include <IceUtil/Functional.h>
#include <IceUtil/Iterator.h>
+#include <Slice/Checksum.h>
#include <limits>
#include <sys/stat.h>
@@ -21,14 +22,15 @@ using namespace IceUtil;
Slice::Gen::Gen(const string& name, const string& base, const string& headerExtension,
const string& sourceExtension, const string& include, const vector<string>& includePaths,
- const string& dllExport, const string& dir, bool imp) :
+ const string& dllExport, const string& dir, bool imp, bool checksum) :
_base(base),
_headerExtension(headerExtension),
_sourceExtension(sourceExtension),
_include(include),
_includePaths(includePaths),
_dllExport(dllExport),
- _impl(imp)
+ _impl(imp),
+ _checksum(checksum)
{
for(vector<string>::iterator p = _includePaths.begin(); p != _includePaths.end(); ++p)
{
@@ -215,6 +217,11 @@ Slice::Gen::generate(const UnitPtr& p)
H << "\n#include <Ice/FactoryTable.h>";
}
+ if(_checksum)
+ {
+ C << "\n#include <Ice/SliceChecksum.h>";
+ }
+
StringList includes = p->includeFiles();
for(StringList::const_iterator q = includes.begin(); q != includes.end(); ++q)
@@ -286,6 +293,31 @@ Slice::Gen::generate(const UnitPtr& p)
ImplVisitor implVisitor(implH, implC, _dllExport);
p->visit(&implVisitor);
}
+
+ if(_checksum)
+ {
+ ChecksumMap map = createChecksums(p);
+ if(!map.empty())
+ {
+ C << sp << nl << "static const char* __sliceChecksums[] =";
+ C << sb;
+ for(ChecksumMap::const_iterator p = map.begin(); p != map.end(); ++p)
+ {
+ C << nl << "\"" << p->first << "\", \"";
+ ostringstream str;
+ str.flags(ios_base::hex);
+ str.fill('0');
+ for(vector<unsigned char>::const_iterator q = p->second.begin(); q != p->second.end(); ++q)
+ {
+ str << (int)(*q);
+ }
+ C << str.str() << "\",";
+ }
+ C << nl << "0";
+ C << eb << ';';
+ C << nl << "static IceInternal::SliceChecksumInit __sliceChecksumInit(__sliceChecksums);";
+ }
+ }
}
Slice::Gen::TypesVisitor::TypesVisitor(Output& h, Output& c, const string& dllExport) :
@@ -1851,7 +1883,7 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDefPtr& p)
H << nl << "public:";
H.inc();
- if(!p->isAbstract())
+ if(!p->isAbstract() && !p->isLocal())
{
H << sp << nl << "void __copyMembers(" << scoped << "Ptr) const;";
diff --git a/cpp/src/slice2cpp/Gen.h b/cpp/src/slice2cpp/Gen.h
index 9787eb51610..16480c9b5e7 100644
--- a/cpp/src/slice2cpp/Gen.h
+++ b/cpp/src/slice2cpp/Gen.h
@@ -28,6 +28,7 @@ public:
const std::vector<std::string>&,
const std::string&,
const std::string&,
+ bool,
bool);
~Gen();
@@ -50,6 +51,7 @@ private:
std::vector<std::string> _includePaths;
std::string _dllExport;
bool _impl;
+ bool _checksum;
class TypesVisitor : public ::IceUtil::noncopyable, public ParserVisitor
{
diff --git a/cpp/src/slice2cpp/Main.cpp b/cpp/src/slice2cpp/Main.cpp
index df62a318de1..1b554a842e5 100644
--- a/cpp/src/slice2cpp/Main.cpp
+++ b/cpp/src/slice2cpp/Main.cpp
@@ -34,6 +34,7 @@ usage(const char* n)
"--depend Generate Makefile dependencies.\n"
"-d, --debug Print debug messages.\n"
"--ice Permit `Ice' prefix (for building Ice source code only)\n"
+ "--checksum Generate checksums for Slice definitions.\n"
;
// Note: --case-sensitive is intentionally not shown here!
}
@@ -53,6 +54,7 @@ main(int argc, char* argv[])
bool ice = false;
bool caseSensitive = false;
bool depend = false;
+ bool checksum = false;
int idx = 1;
while(idx < argc)
@@ -220,6 +222,15 @@ main(int argc, char* argv[])
}
--argc;
}
+ else if(strcmp(argv[idx], "--checksum") == 0)
+ {
+ checksum = true;
+ for(int i = idx ; i + 1 < argc ; ++i)
+ {
+ argv[i] = argv[i + 1];
+ }
+ --argc;
+ }
else if(argv[idx][0] == '-')
{
cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl;
@@ -274,7 +285,7 @@ main(int argc, char* argv[])
else
{
Gen gen(argv[0], icecpp.getBaseName(), headerExtension, sourceExtension, include,
- includePaths, dllExport, output, impl);
+ includePaths, dllExport, output, impl, checksum);
if(!gen)
{
u->destroy();