diff options
author | Benoit Foucher <benoit@zeroc.com> | 2009-03-24 11:45:18 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2009-03-24 11:45:18 +0100 |
commit | 06a08ecf28e205277336a97a6173db7ccbed1adc (patch) | |
tree | a369a5044a63f8cdba9e7c0a461e24ae344486b4 /cpp/src/slice2java/Gen.cpp | |
parent | Merge branch 'R3_3_branch' (diff) | |
parent | Bug 3924: slice2py missing from VC60 installer (diff) | |
download | ice-06a08ecf28e205277336a97a6173db7ccbed1adc.tar.bz2 ice-06a08ecf28e205277336a97a6173db7ccbed1adc.tar.xz ice-06a08ecf28e205277336a97a6173db7ccbed1adc.zip |
Merge commit 'origin/R3_3_branch'
Conflicts:
CHANGES
cpp/demo/Freeze/backup/.depend
cpp/demo/Freeze/bench/.depend
cpp/demo/Freeze/casino/.depend
cpp/demo/Freeze/customEvictor/.depend
cpp/demo/Freeze/library/.depend
cpp/demo/Freeze/phonebook/.depend
cpp/demo/Freeze/transform/.depend
cpp/demo/Glacier2/callback/.depend
cpp/demo/Glacier2/chat/.depend
cpp/demo/Ice/async/.depend
cpp/demo/Ice/bidir/.depend
cpp/demo/Ice/callback/.depend
cpp/demo/Ice/converter/.depend
cpp/demo/Ice/hello/.depend
cpp/demo/Ice/invoke/.depend
cpp/demo/Ice/latency/.depend
cpp/demo/Ice/minimal/.depend
cpp/demo/Ice/multicast/.depend
cpp/demo/Ice/nested/.depend
cpp/demo/Ice/nrvo/.depend
cpp/demo/Ice/session/.depend
cpp/demo/Ice/throughput/.depend
cpp/demo/Ice/value/.depend
cpp/demo/IceBox/hello/.depend
cpp/demo/IceGrid/allocate/.depend
cpp/demo/IceGrid/icebox/.depend
cpp/demo/IceGrid/replication/.depend
cpp/demo/IceGrid/sessionActivation/.depend
cpp/demo/IceGrid/simple/.depend
cpp/demo/IceStorm/clock/.depend
cpp/demo/IceStorm/counter/.depend
cpp/demo/IceStorm/replicated/.depend
cpp/demo/IceStorm/replicated2/.depend
cpp/demo/book/freeze_filesystem/.depend
cpp/demo/book/lifecycle/.depend
cpp/demo/book/printer/.depend
cpp/demo/book/simple_filesystem/.depend
cpp/src/Freeze/.depend
cpp/src/FreezeScript/.depend
cpp/src/Ice/.depend
cpp/src/Ice/UdpTransceiver.cpp
cpp/src/Ice/UdpTransceiver.h
cpp/src/IceBox/.depend
cpp/src/IceGrid/.depend
cpp/src/IceGridLib/.depend
cpp/src/IcePatch2/.depend
cpp/src/IceStorm/.depend
cpp/src/slice2freeze/.depend
cpp/test/Freeze/complex/.depend
cpp/test/Freeze/dbmap/.depend
cpp/test/Freeze/evictor/.depend
cpp/test/Freeze/oldevictor/.depend
cpp/test/FreezeScript/dbmap/.depend
cpp/test/FreezeScript/evictor/.depend
cpp/test/Glacier2/attack/.depend
cpp/test/Glacier2/dynamicFiltering/.depend
cpp/test/Glacier2/router/.depend
cpp/test/Glacier2/sessionControl/.depend
cpp/test/Glacier2/ssl/.depend
cpp/test/Glacier2/staticFiltering/.depend
cpp/test/Ice/adapterDeactivation/.depend
cpp/test/Ice/background/.depend
cpp/test/Ice/binding/.depend
cpp/test/Ice/checksum/.depend
cpp/test/Ice/checksum/server/.depend
cpp/test/Ice/custom/.depend
cpp/test/Ice/exceptions/.depend
cpp/test/Ice/facets/.depend
cpp/test/Ice/faultTolerance/.depend
cpp/test/Ice/gc/.depend
cpp/test/Ice/hold/.depend
cpp/test/Ice/inheritance/.depend
cpp/test/Ice/interceptor/.depend
cpp/test/Ice/location/.depend
cpp/test/Ice/objects/.depend
cpp/test/Ice/operations/.depend
cpp/test/Ice/proxy/.depend
cpp/test/Ice/retry/.depend
cpp/test/Ice/servantLocator/.depend
cpp/test/Ice/slicing/exceptions/.depend
cpp/test/Ice/slicing/objects/.depend
cpp/test/Ice/stream/.depend
cpp/test/Ice/stringConverter/.depend
cpp/test/Ice/timeout/.depend
cpp/test/Ice/udp/.depend
cpp/test/IceBox/configuration/.depend
cpp/test/IceGrid/activation/.depend
cpp/test/IceGrid/allocation/.depend
cpp/test/IceGrid/deployer/.depend
cpp/test/IceGrid/distribution/.depend
cpp/test/IceGrid/replicaGroup/.depend
cpp/test/IceGrid/replication/.depend
cpp/test/IceGrid/session/.depend
cpp/test/IceGrid/simple/.depend
cpp/test/IceGrid/update/.depend
cpp/test/IceSSL/configuration/.depend
cpp/test/IceStorm/federation/.depend
cpp/test/IceStorm/federation2/.depend
cpp/test/IceStorm/rep1/.depend
cpp/test/IceStorm/repgrid/.depend
cpp/test/IceStorm/repstress/.depend
cpp/test/IceStorm/single/.depend
cpp/test/IceStorm/stress/.depend
cpp/test/Slice/keyword/.depend
cs/src/Ice/Instance.cs
cs/src/IceSSL/ConnectorI.cs
java/demo/book/simple_filesystem/Filesystem/DirectoryI.java
java/demo/book/simple_filesystem/Filesystem/FileI.java
java/src/IceInternal/TcpConnector.java
java/src/IceSSL/ConnectorI.java
py/modules/IcePy/.depend
rb/src/IceRuby/.depend
Diffstat (limited to 'cpp/src/slice2java/Gen.cpp')
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 102 |
1 files changed, 58 insertions, 44 deletions
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" |