summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
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"