diff options
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r-- | cpp/src/slice2java/.depend | 4 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 102 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.h | 2 | ||||
-rw-r--r-- | cpp/src/slice2java/Main.cpp | 80 | ||||
-rw-r--r-- | cpp/src/slice2java/Makefile.mak | 4 |
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)
|