summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-03-24 11:45:18 +0100
committerBenoit Foucher <benoit@zeroc.com>2009-03-24 11:45:18 +0100
commit06a08ecf28e205277336a97a6173db7ccbed1adc (patch)
treea369a5044a63f8cdba9e7c0a461e24ae344486b4 /cpp/src/slice2java/Gen.cpp
parentMerge branch 'R3_3_branch' (diff)
parentBug 3924: slice2py missing from VC60 installer (diff)
downloadice-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.cpp102
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"