summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r--cpp/src/slice2java/.depend4
-rw-r--r--cpp/src/slice2java/Gen.cpp102
-rw-r--r--cpp/src/slice2java/Gen.h2
-rw-r--r--cpp/src/slice2java/Main.cpp80
-rw-r--r--cpp/src/slice2java/Makefile.mak4
5 files changed, 121 insertions, 71 deletions
diff --git a/cpp/src/slice2java/.depend b/cpp/src/slice2java/.depend
index e140be10882..05d89fd4b1a 100644
--- a/cpp/src/slice2java/.depend
+++ b/cpp/src/slice2java/.depend
@@ -1,2 +1,2 @@
-Gen$(OBJEXT): Gen.cpp $(includedir)/IceUtil/DisableWarnings.h ./Gen.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Slice/JavaUtil.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Iterator.h
-Main$(OBJEXT): Main.cpp $(includedir)/IceUtil/Options.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/Slice/Preprocessor.h ./Gen.h $(includedir)/Slice/Parser.h $(includedir)/Slice/JavaUtil.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h
+Gen$(OBJEXT): Gen.cpp $(includedir)/IceUtil/DisableWarnings.h ./Gen.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Slice/JavaUtil.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h $(includedir)/Slice/Util.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Iterator.h
+Main$(OBJEXT): Main.cpp $(includedir)/IceUtil/Options.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Slice/Preprocessor.h $(includedir)/Slice/FileTracker.h $(includedir)/Slice/Parser.h $(includedir)/Slice/Util.h ./Gen.h $(includedir)/Slice/JavaUtil.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index ab9cc42aed4..6d1d24f2714 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -10,6 +10,7 @@
#include <IceUtil/DisableWarnings.h>
#include <Gen.h>
#include <Slice/Checksum.h>
+#include <Slice/Util.h>
#include <IceUtil/Functional.h>
#include <IceUtil/Iterator.h>
#include <cstring>
@@ -1206,12 +1207,6 @@ Slice::Gen::~Gen()
{
}
-bool
-Slice::Gen::operator!() const
-{
- return false;
-}
-
void
Slice::Gen::generate(const UnitPtr& p, bool stream)
{
@@ -1670,30 +1665,19 @@ Slice::Gen::PackageVisitor::PackageVisitor(const string& dir) :
bool
Slice::Gen::PackageVisitor::visitModuleStart(const ModulePtr& p)
{
- DefinitionContextPtr dc = p->definitionContext();
- assert(dc);
- StringList globalMetaData = dc->getMetaData();
-
- static const string packagePrefix = "java:package:";
-
- for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q)
+ string prefix = getPackagePrefix(p);
+ if(!prefix.empty())
{
- string s = *q;
- if(s.find(packagePrefix) == 0)
- {
- string markerClass = s.substr(packagePrefix.size()) + "." + fixKwd(p->name()) + "._Marker";
-
- open(markerClass);
-
- Output& out = output();
- out << sp << nl << "interface _Marker";
- out << sb;
- out << eb;
-
- close();
- }
+ string markerClass = prefix + "." + fixKwd(p->name()) + "._Marker";
+ open(markerClass);
+
+ Output& out = output();
+ out << sp << nl << "interface _Marker";
+ out << sb;
+ out << eb;
+
+ close();
}
-
return false;
}
@@ -1837,7 +1821,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
// Constructors.
//
out << sp;
- out << nl << "public " << name << "()";
+ out << nl << "public " << fixKwd(name) << "()";
out << sb;
if(baseClass)
{
@@ -1845,7 +1829,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
}
out << eb;
- out << sp << nl << "public " << name << spar;
+ out << sp << nl << "public " << fixKwd(name) << spar;
vector<string> paramDecl;
for(d = allDataMembers.begin(); d != allDataMembers.end(); ++d)
{
@@ -2279,7 +2263,7 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p)
out << nl << " **/";
}
- out << nl << "public final class " << name << " implements java.lang.Cloneable";
+ out << nl << "public final class " << name << " implements java.lang.Cloneable, java.io.Serializable";
out << sb;
return true;
@@ -2658,8 +2642,7 @@ Slice::Gen::TypesVisitor::visitDataMember(const DataMemberPtr& p)
if(cls)
{
ops = cls->allOperations();
- DefinitionContextPtr dc = p->definitionContext();
- file = dc->filename();
+ file = p->file();
line = p->line();
if(!validateGetterSetter(ops, "get" + capName, 0, file, line) ||
!validateGetterSetter(ops, "set" + capName, 1, file, line))
@@ -2800,11 +2783,11 @@ Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p)
out << nl << " **/";
}
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
if(java2)
{
- out << nl << "public final class " << name;
+ out << nl << "public final class " << name << " implements java.io.Serializable";
out << sb;
out << nl << "private static " << name << "[] __values = new " << name << "[" << sz << "];";
@@ -2857,7 +2840,7 @@ Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p)
}
else
{
- out << nl << "public enum " << name;
+ out << nl << "public enum " << name << " implements java.io.Serializable";
out << sb;
for(en = enumerators.begin(); en != enumerators.end(); ++en)
@@ -2983,8 +2966,21 @@ Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p)
if(java2)
{
+ //
+ // Without this method, Java would create a new instance of an enumerator
+ // during deserialization, but we want it to use one of the predefined
+ // enumerators instead.
+ //
+ out << sp << nl << "private java.lang.Object" << nl << "readResolve()";
+ out.inc();
+ out << nl << "throws java.io.ObjectStreamException";
+ out.dec();
+ out << sb;
+ out << nl << "return convert(__value);";
+ out << eb;
out << sp << nl << "final static private String[] __T =";
out << sb;
+
en = enumerators.begin();
while(en != enumerators.end())
{
@@ -3134,8 +3130,9 @@ Slice::Gen::TypesVisitor::validateGetterSetter(const OperationList& ops, const s
int numParams = static_cast<int>((*i)->parameters().size());
if(numArgs >= numParams && numArgs - numParams <= 1)
{
- cerr << file << ":" << line
- << ": error: operation `" << name << "' conflicts with getter/setter method" << endl;
+ ostringstream ostr;
+ ostr << "operation `" << name << "' conflicts with getter/setter method";
+ emitError(file, line, ostr.str());
return false;
}
break;
@@ -3189,6 +3186,23 @@ Slice::Gen::HolderVisitor::visitStructStart(const StructPtr& p)
void
Slice::Gen::HolderVisitor::visitSequence(const SequencePtr& p)
{
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(p->type());
+ if(builtin && builtin->kind() == Builtin::KindByte)
+ {
+ string prefix = "java:serializable:";
+ string meta;
+ if(p->findMetaData(prefix, meta))
+ {
+ return; // No holders for serializable types.
+ }
+ prefix = "java:protobuf:";
+ if(p->findMetaData(prefix, meta))
+ {
+ return; // No holders for protobuf types.
+
+ }
+ }
+
writeHolder(p);
}
@@ -3310,7 +3324,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sb;
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextType = java2 ? "java.util.Map" : "java.util.Map<String, String>";
string contextParam = contextType + " __ctx";
string explicitContextParam = "boolean __explicitCtx";
@@ -3974,7 +3988,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
out << nl << " **/";
}
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextParam = java2 ? "java.util.Map __ctx" : "java.util.Map<String, String> __ctx";
out << nl << "public " << retS << ' ' << name << spar << params << contextParam << epar;
@@ -4051,7 +4065,7 @@ Slice::Gen::DelegateVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sb;
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextParam = java2 ? "java.util.Map __ctx" : "java.util.Map<String, String> __ctx";
OperationList ops = p->operations();
@@ -4107,7 +4121,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sp << nl << "public final class _" << name << "DelM extends Ice._ObjectDelM implements _" << name << "Del";
out << sb;
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextParam = java2 ? "java.util.Map __ctx" : "java.util.Map<String, String> __ctx";
OperationList ops = p->allOperations();
@@ -4308,7 +4322,7 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sp << nl << "public final class _" << name << "DelD extends Ice._ObjectDelD implements _" << name << "Del";
out << sb;
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextParam = java2 ? "java.util.Map __ctx" : "java.util.Map<String, String> __ctx";
OperationList ops = p->allOperations();
@@ -4992,7 +5006,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
out << nl << "public abstract void ice_exception(Ice.UserException ex);";
}
- bool java2 = p->definitionContext()->findMetaData("java:java2") == "java:java2";
+ bool java2 = p->definitionContext()->findMetaData(_java2MetaData) == _java2MetaData;
string contextParam = java2 ? "java.util.Map __ctx" : "java.util.Map<String, String> __ctx";
out << sp << nl << "public final boolean" << nl << "__invoke" << spar << "Ice.ObjectPrx __prx"
diff --git a/cpp/src/slice2java/Gen.h b/cpp/src/slice2java/Gen.h
index 161a837872c..6971c465d6b 100644
--- a/cpp/src/slice2java/Gen.h
+++ b/cpp/src/slice2java/Gen.h
@@ -74,8 +74,6 @@ public:
const std::string&);
~Gen();
- bool operator!() const; // Returns true if there was a constructor error
-
void generate(const UnitPtr&, bool);
void generateTie(const UnitPtr&);
void generateImpl(const UnitPtr&);
diff --git a/cpp/src/slice2java/Main.cpp b/cpp/src/slice2java/Main.cpp
index 7439180b8f2..0ed57b5d415 100644
--- a/cpp/src/slice2java/Main.cpp
+++ b/cpp/src/slice2java/Main.cpp
@@ -12,6 +12,7 @@
#include <IceUtil/StaticMutex.h>
#include <Slice/Preprocessor.h>
#include <Slice/FileTracker.h>
+#include <Slice/Util.h>
#include <Gen.h>
#ifdef __BCPLUSPLUS__
@@ -50,6 +51,8 @@ usage(const char* n)
"--impl Generate sample implementations.\n"
"--impl-tie Generate sample TIE implementations.\n"
"--depend Generate Makefile dependencies.\n"
+ "--depend-xml Generate dependencies in XML format.\n"
+ "--list-generated Emit list of generated files in XML format.\n"
"-d, --debug Print debug messages.\n"
"--ice Permit `Ice' prefix (for building Ice source code only)\n"
"--checksum CLASS Generate checksums for Slice definitions into CLASS.\n"
@@ -74,6 +77,8 @@ main(int argc, char* argv[])
opts.addOpt("", "impl");
opts.addOpt("", "impl-tie");
opts.addOpt("", "depend");
+ opts.addOpt("", "depend-xml");
+ opts.addOpt("", "list-generated");
opts.addOpt("d", "debug");
opts.addOpt("", "ice");
opts.addOpt("", "checksum", IceUtilInternal::Options::NeedArg);
@@ -84,11 +89,14 @@ main(int argc, char* argv[])
vector<string>args;
try
{
+#if defined(__BCPLUSPLUS__) && (__BCPLUSPLUS__ >= 0x0600)
+ IceUtil::DummyBCC dummy;
+#endif
args = opts.parse(argc, (const char**)argv);
}
catch(const IceUtilInternal::BadOptException& e)
{
- cerr << argv[0] << ": " << e.reason << endl;
+ cerr << argv[0] << ": error: " << e.reason << endl;
usage(argv[0]);
return EXIT_FAILURE;
}
@@ -136,6 +144,7 @@ main(int argc, char* argv[])
bool implTie = opts.isSet("impl-tie");
bool depend = opts.isSet("depend");
+ bool dependxml = opts.isSet("depend-xml");
bool debug = opts.isSet("debug");
@@ -145,6 +154,8 @@ main(int argc, char* argv[])
bool stream = opts.isSet("stream");
+ bool listGenerated = opts.isSet("list-generated");
+
StringList globalMetadata;
vector<string> v = opts.argVec("meta");
copy(v.begin(), v.end(), back_inserter(globalMetadata));
@@ -162,23 +173,23 @@ main(int argc, char* argv[])
}
}
- if(java2)
+ if(java2 && !listGenerated && !depend && !dependxml)
{
- cerr << argv[0] << ": warning: The Java2 mapping is deprecated." << endl;
+ getErrorStream() << argv[0] << ": warning: The Java2 mapping is deprecated." << endl;
}
bool caseSensitive = opts.isSet("case-sensitive");
if(args.empty())
{
- cerr << argv[0] << ": no input file" << endl;
+ getErrorStream() << argv[0] << ": error: no input file" << endl;
usage(argv[0]);
return EXIT_FAILURE;
}
if(impl && implTie)
{
- cerr << argv[0] << ": cannot specify both --impl and --impl-tie" << endl;
+ getErrorStream() << argv[0] << ": error: cannot specify both --impl and --impl-tie" << endl;
usage(argv[0]);
return EXIT_FAILURE;
}
@@ -190,24 +201,39 @@ main(int argc, char* argv[])
IceUtil::CtrlCHandler ctrlCHandler;
ctrlCHandler.setCallback(interruptedCallback);
+ if(dependxml)
+ {
+ cout << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dependencies>" << endl;
+ }
+
for(i = args.begin(); i != args.end(); ++i)
{
- if(depend)
+ if(depend || dependxml)
{
Preprocessor icecpp(argv[0], *i, cppArgs);
- if(!icecpp.printMakefileDependencies(Preprocessor::Java, includePaths))
+ if(!icecpp.printMakefileDependencies(depend ? Preprocessor::Java : Preprocessor::JavaXML, includePaths))
{
return EXIT_FAILURE;
}
}
else
{
+ ostringstream os;
+ if(listGenerated)
+ {
+ Slice::setErrorStream(os);
+ }
+
+ FileTracker::instance()->setSource(*i);
+
Preprocessor icecpp(argv[0], *i, cppArgs);
FILE* cppHandle = icecpp.preprocess(false);
if(cppHandle == 0)
{
- return EXIT_FAILURE;
+ FileTracker::instance()->setOutput(os.str(), true);
+ status = EXIT_FAILURE;
+ break;
}
if(preprocess)
@@ -238,6 +264,8 @@ main(int argc, char* argv[])
if(parseStatus == EXIT_FAILURE)
{
+ p->destroy();
+ FileTracker::instance()->setOutput(os.str(), true);
status = EXIT_FAILURE;
}
else
@@ -245,11 +273,6 @@ main(int argc, char* argv[])
try
{
Gen gen(argv[0], icecpp.getBaseName(), includePaths, output);
- if(!gen)
- {
- p->destroy();
- return EXIT_FAILURE;
- }
gen.generate(p, stream);
if(tie)
{
@@ -271,15 +294,19 @@ main(int argc, char* argv[])
ChecksumMap m = createChecksums(p);
copy(m.begin(), m.end(), inserter(checksums, checksums.begin()));
}
+ FileTracker::instance()->setOutput(os.str(), false);
}
catch(const Slice::FileException& ex)
{
- // If a file could not be created, then
- // cleanup any created files.
+ //
+ // If a file could not be created then cleanup any files we've already created.
+ //
FileTracker::instance()->cleanup();
p->destroy();
- cerr << argv[0] << ": " << ex.reason() << endl;
- return EXIT_FAILURE;
+ os << argv[0] << ": error: " << ex.reason() << endl;
+ FileTracker::instance()->setOutput(os.str(), true);
+ status = EXIT_FAILURE;
+ break;
}
}
p->destroy();
@@ -291,15 +318,21 @@ main(int argc, char* argv[])
if(_interrupted)
{
- // If the translator was interrupted, then cleanup any
- // created files.
+ //
+ // If the translator was interrupted then cleanup any files we've already created.
+ //
FileTracker::instance()->cleanup();
return EXIT_FAILURE;
}
}
}
- if(!checksumClass.empty())
+ if(dependxml)
+ {
+ cout << "</dependencies>\n";
+ }
+
+ if(status == EXIT_SUCCESS && !checksumClass.empty())
{
try
{
@@ -310,10 +343,15 @@ main(int argc, char* argv[])
// If a file could not be created, then
// cleanup any created files.
FileTracker::instance()->cleanup();
- cerr << argv[0] << ": " << ex.reason() << endl;
+ getErrorStream() << argv[0] << ": error: " << ex.reason() << endl;
return EXIT_FAILURE;
}
}
+ if(listGenerated)
+ {
+ FileTracker::instance()->dumpxml();
+ }
+
return status;
}
diff --git a/cpp/src/slice2java/Makefile.mak b/cpp/src/slice2java/Makefile.mak
index 4a16bbb3b56..1382446458e 100644
--- a/cpp/src/slice2java/Makefile.mak
+++ b/cpp/src/slice2java/Makefile.mak
@@ -26,7 +26,7 @@ CPPFLAGS = -I. $(CPPFLAGS) -DWIN32_LEAN_AND_MEAN
PDBFLAGS = /pdb:$(NAME:.exe=.pdb)
!endif
-!if "$(CPP_COMPILER)" == "BCC2007"
+!if "$(BCPLUSPLUS)" == "yes"
RES_FILE = ,, Slice2Java.res
!else
RES_FILE = Slice2Java.res
@@ -46,7 +46,7 @@ install:: all
copy $(NAME) $(install_bindir)
-!if "$(CPP_COMPILER)" == "BCC2007" && "$(OPTIMIZE)" != "yes"
+!if "$(BCPLUSPLUS)" == "yes" && "$(OPTIMIZE)" != "yes"
install:: all
copy $(NAME:.exe=.tds) $(install_bindir)