summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/include/Slice/JavaUtil.h23
-rw-r--r--cpp/src/Slice/JavaUtil.cpp284
-rwxr-xr-xcpp/src/slice2freezej/Main.cpp17
-rw-r--r--cpp/src/slice2java/Gen.cpp532
-rw-r--r--cpp/src/slice2java/Gen.h11
-rw-r--r--java/build.xml1
-rw-r--r--java/test/Ice/optional/AMDInitialI.java428
-rw-r--r--java/test/Ice/optional/AMDServer.java39
-rw-r--r--java/test/Ice/optional/InitialI.java244
-rw-r--r--java/test/Ice/optional/TestAMD.ice276
-rwxr-xr-xjava/test/Ice/optional/run.py2
11 files changed, 1342 insertions, 515 deletions
diff --git a/cpp/include/Slice/JavaUtil.h b/cpp/include/Slice/JavaUtil.h
index 7fc742b2ac3..c8bb6a71f85 100644
--- a/cpp/include/Slice/JavaUtil.h
+++ b/cpp/include/Slice/JavaUtil.h
@@ -118,9 +118,9 @@ protected:
std::string getStaticId(const TypePtr&, const std::string&) const;
//
- // Determines whether an in parameter should use the optional mapping.
+ // Determines whether an operation should use the optional mapping.
//
- bool useOptionalMapping(const ParamDeclPtr&);
+ bool useOptionalMapping(const OperationPtr&);
//
// Returns the optional type corresponding to the given Slice type.
@@ -155,22 +155,15 @@ protected:
enum OptionalMode
{
OptionalNone,
- OptionalInParamReq, // Use the required mapping.
- OptionalInParamOpt, // Use the optional mapping.
+ OptionalInParam,
OptionalOutParam,
OptionalReturnParam,
OptionalMember
};
- bool isOptionalParam(OptionalMode mode) const
- {
- return mode == OptionalInParamReq || mode == OptionalInParamOpt || mode == OptionalOutParam ||
- mode == OptionalReturnParam;
- }
-
- void writeMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const TypePtr&, OptionalMode, int,
- const std::string&, bool, int&, bool = false, const StringList& = StringList(),
- const std::string& patchParams = "");
+ void writeMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const TypePtr&, OptionalMode,
+ bool, int, const std::string&, bool, int&, bool = false,
+ const StringList& = StringList(), const std::string& patchParams = "");
//
// Generate code to marshal or unmarshal a dictionary type.
@@ -188,8 +181,8 @@ protected:
//
// Generate code to marshal or unmarshal a type using the public stream API.
//
- void writeStreamMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const TypePtr&, OptionalMode,
- int, const std::string&, bool, int&, bool = false,
+ void writeStreamMarshalUnmarshalCode(::IceUtilInternal::Output&, const std::string&, const TypePtr&, bool, int,
+ const std::string&, bool, int&, bool = false,
const StringList& = StringList(), const std::string& patchParams = "");
//
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp
index a1dabf6d6dc..781b020c0c8 100644
--- a/cpp/src/Slice/JavaUtil.cpp
+++ b/cpp/src/Slice/JavaUtil.cpp
@@ -551,33 +551,20 @@ Slice::JavaGenerator::getStaticId(const TypePtr& type, const string& package) co
}
bool
-Slice::JavaGenerator::useOptionalMapping(const ParamDeclPtr& p)
+Slice::JavaGenerator::useOptionalMapping(const OperationPtr& p)
{
- if(p->optional())
- {
- //
- // Optional in parameters can be marked with the "java:optional" metadata to force
- // the mapping to use the Ice.Optional types. The tag can also be applied to an
- // operation or its interface.
- //
- // Without the tag, in parameters use the normal (non-optional) mapping.
- //
- if(!p->isOutParam())
- {
- static const string tag = "java:optional";
-
- OperationPtr op = OperationPtr::dynamicCast(p->container());
- assert(op);
- ClassDefPtr cl = ClassDefPtr::dynamicCast(op->container());
- assert(cl);
-
- return p->hasMetaData(tag) || op->hasMetaData(tag) || cl->hasMetaData(tag);
- }
+ //
+ // The "java:optional" metadata can be applied to an operation or its
+ // interface to force the mapping to use the Ice.Optional types.
+ //
+ // Without the tag, parameters use the normal (non-optional) mapping.
+ //
+ static const string tag = "java:optional";
- return true;
- }
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container());
+ assert(cl);
- return false;
+ return p->hasMetaData(tag) || cl->hasMetaData(tag);
}
string
@@ -923,7 +910,8 @@ void
Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
const string& package,
const TypePtr& type,
- OptionalMode optional,
+ OptionalMode mode,
+ bool optionalMapping,
int tag,
const string& param,
bool marshal,
@@ -934,7 +922,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
string stream = marshal ? "__os" : "__is";
string v;
- if(holder && optional == OptionalNone)
+ if(holder)
{
v = param + ".value";
}
@@ -943,6 +931,8 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
v = param;
}
+ const bool optionalParam = mode == OptionalInParam || mode == OptionalOutParam || mode == OptionalReturnParam;
+
BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
if(builtin)
{
@@ -952,7 +942,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeByte(" << tag << ", " << v << ");";
}
@@ -963,7 +953,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readByte(" << tag << ", " << v << ");";
}
@@ -978,7 +968,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeBool(" << tag << ", " << v << ");";
}
@@ -989,7 +979,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readBool(" << tag << ", " << v << ");";
}
@@ -1004,7 +994,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeShort(" << tag << ", " << v << ");";
}
@@ -1015,7 +1005,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readShort(" << tag << ", " << v << ");";
}
@@ -1030,7 +1020,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeInt(" << tag << ", " << v << ");";
}
@@ -1041,7 +1031,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readInt(" << tag << ", " << v << ");";
}
@@ -1056,7 +1046,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeLong(" << tag << ", " << v << ");";
}
@@ -1067,7 +1057,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readLong(" << tag << ", " << v << ");";
}
@@ -1082,7 +1072,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeFloat(" << tag << ", " << v << ");";
}
@@ -1093,7 +1083,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readFloat(" << tag << ", " << v << ");";
}
@@ -1108,7 +1098,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeDouble(" << tag << ", " << v << ");";
}
@@ -1119,7 +1109,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readDouble(" << tag << ", " << v << ");";
}
@@ -1134,7 +1124,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeString(" << tag << ", " << v << ");";
}
@@ -1145,7 +1135,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readString(" << tag << ", " << v << ");";
}
@@ -1160,7 +1150,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeObject(" << tag << ", " << v << ");";
}
@@ -1171,11 +1161,11 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readObject(" << tag << ", " << param << ");";
}
- else if(holder && optional == OptionalNone)
+ else if(holder && mode == OptionalNone)
{
out << nl << stream << ".readObject(" << param << ");";
}
@@ -1197,11 +1187,11 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeProxy(" << tag << ", " << v << ");";
}
- else if(optional == OptionalMember)
+ else if(mode == OptionalMember)
{
out << nl << stream << ".startSize();";
out << nl << stream << ".writeProxy(" << v << ");";
@@ -1214,11 +1204,11 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".readProxy(" << tag << ", " << v << ");";
}
- else if(optional == OptionalMember)
+ else if(mode == OptionalMember)
{
out << nl << stream << ".skip(4);";
out << nl << v << " = " << stream << ".readProxy();";
@@ -1245,29 +1235,29 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
string typeS = typeToString(type, TypeModeIn, package);
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
- if(optional == OptionalInParamReq)
+ if(optionalMapping)
{
- out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt(" << tag
+ << ", " << getOptionalType(type) << "))";
out << sb;
out << nl << stream << ".startSize();";
- out << nl << typeS << "Helper.__write(" << stream << ", " << v << ");";
+ out << nl << typeS << "Helper.__write(" << stream << ", " << v << ".get());";
out << nl << stream << ".endSize();";
out << eb;
}
else
{
- out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt(" << tag
- << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
out << nl << stream << ".startSize();";
- out << nl << typeS << "Helper.__write(" << stream << ", " << v << ".get());";
+ out << nl << typeS << "Helper.__write(" << stream << ", " << v << ");";
out << nl << stream << ".endSize();";
out << eb;
}
}
- else if(optional == OptionalMember)
+ else if(mode == OptionalMember)
{
out << nl << stream << ".startSize();";
out << nl << typeS << "Helper.__write(" << stream << ", " << v << ");";
@@ -1280,14 +1270,14 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
out << nl << stream << ".skip(4);";
out << nl << v << ".set(" << typeS << "Helper.__read(" << stream << "));";
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1295,7 +1285,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
out << eb;
}
}
- else if(optional == OptionalMember)
+ else if(mode == OptionalMember)
{
out << nl << stream << ".skip(4);";
out << nl << v << " = " << typeS << "Helper.__read(" << stream << ");";
@@ -1313,7 +1303,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << stream << ".writeObject(" << tag << ", " << v << ");";
}
@@ -1324,7 +1314,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
string typeS = typeToString(type, TypeModeIn, package);
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
@@ -1332,7 +1322,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
out << nl << stream << ".readObject(new Ice.OptionalObject(" << v << ", " << typeS << ".class, "
<< getStaticId(type, package) << "));";
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1342,7 +1332,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
}
else
{
- if(holder && optional == OptionalNone)
+ if(holder && mode == OptionalNone)
{
out << nl << stream << ".readObject(" << param << ");";
}
@@ -1367,23 +1357,23 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(optional != OptionalNone)
+ if(optionalParam || mode == OptionalMember)
{
string val;
- if(isOptionalParam(optional))
+ if(optionalParam)
{
- if(optional == OptionalInParamReq)
- {
- out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
- val = v;
- }
- else
+ if(optionalMapping)
{
out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt("
<< tag << ", " << getOptionalType(type) << "))";
val = v + ".get()";
}
+ else
+ {
+ out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
+ val = v;
+ }
out << sb;
}
@@ -1404,7 +1394,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
out << nl << val << ".__write(" << stream << ");";
}
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << eb;
}
@@ -1418,7 +1408,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
@@ -1438,7 +1428,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1446,7 +1436,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
out << eb;
}
}
- else if(optional == OptionalMember)
+ else if(mode == OptionalMember)
{
if(st->isVariableLength())
{
@@ -1473,21 +1463,21 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
- if(optional == OptionalInParamReq)
+ if(optionalMapping)
{
- out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt(" << tag
+ << ", " << getOptionalType(type) << "))";
out << sb;
- out << nl << v << ".__write(" << stream << ");";
+ out << nl << v << ".get().__write(" << stream << ");";
out << eb;
}
else
{
- out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt(" << tag
- << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
- out << nl << v << ".get().__write(" << stream << ");";
+ out << nl << v << ".__write(" << stream << ");";
out << eb;
}
}
@@ -1500,13 +1490,13 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
out << nl << v << ".set(" << typeS << ".__read(" << stream << "));";
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1525,7 +1515,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
DictionaryPtr dict = DictionaryPtr::dynamicCast(type);
if(dict)
{
- if(optional != OptionalNone)
+ if(optionalParam || mode == OptionalMember)
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
TypePtr keyType = dict->keyType();
@@ -1533,24 +1523,24 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
- if(optional == OptionalInParamReq)
+ if(optionalMapping)
{
- out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt("
+ << tag << ", " << getOptionalType(type) << "))";
out << sb;
}
else
{
- out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt("
- << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
out << sb;
}
}
if(keyType->isVariableLength() || valueType->isVariableLength())
{
- string d = isOptionalParam(optional) && optional != OptionalInParamReq ? v + ".get()" : v;
+ string d = optionalParam && optionalMapping ? v + ".get()" : v;
out << nl << stream << ".startSize();";
writeDictionaryMarshalUnmarshalCode(out, package, dict, d, marshal, iter, true, metaData);
out << nl << stream << ".endSize();";
@@ -1559,7 +1549,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
const int wireSize = keyType->minWireSize() + valueType->minWireSize();
string tmpName;
- if(isOptionalParam(optional) && optional != OptionalInParamReq)
+ if(optionalParam && optionalMapping)
{
tmpName = "__optDict";
out << nl << "final " << typeS << ' ' << tmpName << " = " << v << ".get();";
@@ -1568,14 +1558,13 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
tmpName = v;
}
- out << nl << "final int __optSize = " << tmpName << " == null ? 0 : " << tmpName
- << ".size();";
+ out << nl << "final int __optSize = " << tmpName << " == null ? 0 : " << tmpName << ".size();";
out << nl << stream << ".writeSize(__optSize > 254 ? __optSize * " << wireSize
<< " + 5 : __optSize * " << wireSize << " + 1);";
writeDictionaryMarshalUnmarshalCode(out, package, dict, tmpName, marshal, iter, true, metaData);
}
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << eb;
}
@@ -1584,7 +1573,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
{
string tmpName;
- if(isOptionalParam(optional))
+ if(optionalParam)
{
tmpName = "__optDict";
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
@@ -1607,11 +1596,11 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
writeDictionaryMarshalUnmarshalCode(out, package, dict, tmpName, marshal, iter, true, metaData);
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << v << ".set(" << tmpName << ");";
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1631,13 +1620,13 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
SequencePtr seq = SequencePtr::dynamicCast(type);
if(seq)
{
- if(optional != OptionalNone)
+ if(optionalParam || mode == OptionalMember)
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
TypePtr elemType = seq->type();
BuiltinPtr elemBuiltin = BuiltinPtr::dynamicCast(elemType);
- if(isOptionalParam(optional) && elemBuiltin && elemBuiltin->kind() != Builtin::KindObject &&
+ if(optionalParam && elemBuiltin && elemBuiltin->kind() != Builtin::KindObject &&
elemBuiltin->kind() != Builtin::KindObjectProxy && !hasTypeMetaData(seq, metaData))
{
static const char* builtinTable[] =
@@ -1692,16 +1681,16 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
if(marshal)
{
- if(isOptionalParam(optional))
+ if(optionalParam)
{
- if(optional == OptionalInParamReq)
+ if(optionalMapping)
{
- out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt("
+ << tag << ", " << getOptionalType(type) << "))";
}
else
{
- out << nl << "if(" << v << " != null && " << v << ".isSet() && " << stream << ".writeOpt("
- << tag << ", " << getOptionalType(type) << "))";
+ out << nl << "if(" << stream << ".writeOpt(" << tag << ", " << getOptionalType(type) << "))";
}
out << sb;
@@ -1709,7 +1698,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
if(elemType->isVariableLength())
{
- string s = isOptionalParam(optional) && optional != OptionalInParamReq ? v + ".get()" : v;
+ string s = optionalParam && optionalMapping ? v + ".get()" : v;
out << nl << stream << ".startSize();";
writeSequenceMarshalUnmarshalCode(out, package, seq, s, marshal, iter, true, metaData);
out << nl << stream << ".endSize();";
@@ -1723,7 +1712,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
//
string tmpName;
- if(isOptionalParam(optional) && optional != OptionalInParamReq)
+ if(optionalParam && optionalMapping)
{
tmpName = "__optSeq";
out << nl << "final " << typeS << ' ' << tmpName << " = " << v << ".get();";
@@ -1760,7 +1749,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
//
// This just writes a byte sequence.
//
- string s = isOptionalParam(optional) && optional != OptionalInParamReq ? v + ".get()" : v;
+ string s = optionalParam && optionalMapping ? v + ".get()" : v;
writeSequenceMarshalUnmarshalCode(out, package, seq, s, marshal, iter, true, metaData);
}
else
@@ -1770,7 +1759,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
//
string tmpName;
- if(isOptionalParam(optional) && optional != OptionalInParamReq)
+ if(optionalParam && optionalMapping)
{
tmpName = "__optSeq";
out << nl << "final " << typeS << ' ' << tmpName << " = " << v << ".get();";
@@ -1803,7 +1792,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
writeSequenceMarshalUnmarshalCode(out, package, seq, tmpName, marshal, iter, true, metaData);
}
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << eb;
}
@@ -1811,7 +1800,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
else
{
string tmpName;
- if(isOptionalParam(optional))
+ if(optionalParam)
{
tmpName = "__optSeq";
out << nl << "if(" << stream << ".readOpt(" << tag << ", " << getOptionalType(type) << "))";
@@ -1853,11 +1842,11 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out,
writeSequenceMarshalUnmarshalCode(out, package, seq, tmpName, marshal, iter, true, metaData);
- if(isOptionalParam(optional))
+ if(optionalParam)
{
out << nl << v << ".set(" << tmpName << ");";
out << eb;
- if(optional == OptionalOutParam)
+ if(mode == OptionalOutParam)
{
out << nl << "else";
out << sb;
@@ -1982,7 +1971,7 @@ Slice::JavaGenerator::writeDictionaryMarshalUnmarshalCode(Output& out,
arg = "__e.getValue()";
type = value;
}
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, true, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, arg, true, iter, false);
}
out << eb;
out << eb;
@@ -2016,14 +2005,15 @@ Slice::JavaGenerator::writeDictionaryMarshalUnmarshalCode(Output& out,
{
string keyTypeStr = typeToObjectString(key, TypeModeIn, package);
string valueTypeStr = typeToObjectString(value, TypeModeIn, package);
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, false, iter, false, StringList(),
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, arg, false, iter, false,
+ StringList(),
"new IceInternal.DictionaryPatcher<" + keyTypeStr + ", " + valueTypeStr +
">(" + v + ", " + typeS + ".class, \"" + type->typeId() + "\", __key)");
}
else
{
out << nl << typeS << ' ' << arg << ';';
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, false, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, arg, false, iter, false);
}
}
BuiltinPtr builtin = BuiltinPtr::dynamicCast(value);
@@ -2190,7 +2180,7 @@ Slice::JavaGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
string typeS = typeToString(type, TypeModeIn, package);
out << nl << "for(" << typeS << " __elem : " << v << ')';
out << sb;
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", true, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, "__elem", true, iter, false);
out << eb;
out << eb; // else
}
@@ -2237,13 +2227,13 @@ Slice::JavaGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
ostringstream patchParams;
patchParams << "new IceInternal.ListPatcher<" << origContentS << ">(" << v << ", " << origContentS
<< ".class, __type" << iter << ", __i" << iter << ')';
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", false, iter, false,
- StringList(), patchParams.str());
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, "__elem", false, iter,
+ false, StringList(), patchParams.str());
}
else
{
out << nl << cont << " __elem;";
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", false, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, "__elem", false, iter, false);
}
if(!isObject)
{
@@ -2382,7 +2372,7 @@ Slice::JavaGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
ostringstream o;
o << v << "[__i" << iter << "]";
iter++;
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), true, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, o.str(), true, iter, false);
out << eb;
out << eb;
}
@@ -2467,12 +2457,12 @@ Slice::JavaGenerator::writeSequenceMarshalUnmarshalCode(Output& out,
{
patchParams << "new IceInternal.SequencePatcher(" << v << ", " << origContentS
<< ".class, __type" << iter << ", __i" << iter << ')';
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), false, iter, false,
- StringList(), patchParams.str());
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, o.str(), false, iter,
+ false, StringList(), patchParams.str());
}
else
{
- writeMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), false, iter, false);
+ writeMarshalUnmarshalCode(out, package, type, OptionalNone, false, 0, o.str(), false, iter, false);
}
out << eb;
iter++;
@@ -2485,7 +2475,7 @@ void
Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
const string& package,
const TypePtr& type,
- OptionalMode optional,
+ bool optional,
int tag,
const string& param,
bool marshal,
@@ -2494,11 +2484,9 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
const StringList& metaData,
const string& patchParams)
{
- assert(optional == OptionalNone || optional == OptionalMember); // Stream API doesn't support Ice.Optional<>.
-
string stream = marshal ? "__outS" : "__inS";
string v;
- if(holder && optional == OptionalNone)
+ if(holder && !optional)
{
v = param + ".value";
}
@@ -2616,7 +2604,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
}
else
{
- if(holder && optional == OptionalNone)
+ if(holder && !optional)
{
out << nl << stream << ".readObject(" << param << ");";
}
@@ -2638,7 +2626,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(optional == OptionalMember)
+ if(optional)
{
out << nl << stream << ".startSize();";
out << nl << stream << ".writeProxy(" << v << ");";
@@ -2651,7 +2639,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
}
else
{
- if(optional == OptionalMember)
+ if(optional)
{
out << nl << stream << ".skip(4);";
}
@@ -2674,7 +2662,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
string typeS = typeToString(type, TypeModeIn, package);
if(marshal)
{
- if(optional == OptionalMember)
+ if(optional)
{
out << nl << stream << ".startSize();";
out << nl << typeS << "Helper.write(" << stream << ", " << v << ");";
@@ -2687,7 +2675,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
}
else
{
- if(optional == OptionalMember)
+ if(optional)
{
out << nl << stream << ".skip(4);";
}
@@ -2705,7 +2693,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
}
else
{
- if(holder && optional == OptionalNone)
+ if(holder && !optional)
{
out << nl << stream << ".readObject(" << param << ");";
}
@@ -2729,7 +2717,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
{
if(marshal)
{
- if(optional != OptionalNone)
+ if(optional)
{
if(st->isVariableLength())
{
@@ -2751,7 +2739,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
else
{
string typeS = typeToString(type, TypeModeIn, package);
- if(optional == OptionalMember)
+ if(optional)
{
if(st->isVariableLength())
{
@@ -2791,7 +2779,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
DictionaryPtr dict = DictionaryPtr::dynamicCast(type);
if(dict)
{
- if(optional != OptionalNone)
+ if(optional)
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
TypePtr keyType = dict->keyType();
@@ -2838,7 +2826,7 @@ Slice::JavaGenerator::writeStreamMarshalUnmarshalCode(Output& out,
SequencePtr seq = SequencePtr::dynamicCast(type);
if(seq)
{
- if(optional != OptionalNone)
+ if(optional)
{
string typeS = typeToString(type, TypeModeIn, package, metaData);
TypePtr elemType = seq->type();
@@ -3066,7 +3054,7 @@ Slice::JavaGenerator::writeStreamDictionaryMarshalUnmarshalCode(Output& out,
arg = "__e.getValue()";
type = value;
}
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, true, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, arg, true, iter, false);
}
out << eb;
out << eb;
@@ -3101,7 +3089,7 @@ Slice::JavaGenerator::writeStreamDictionaryMarshalUnmarshalCode(Output& out,
{
string keyTypeStr = typeToObjectString(key, TypeModeIn, package);
string valueTypeStr = typeToObjectString(value, TypeModeIn, package);
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, false, iter, false,
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, arg, false, iter, false,
StringList(), "new IceInternal.DictionaryPatcher<" + keyTypeStr +
", " + valueTypeStr + ">(" + v + ", " + s + ".class, \"" +
type->typeId() + "\", __key)");
@@ -3109,7 +3097,7 @@ Slice::JavaGenerator::writeStreamDictionaryMarshalUnmarshalCode(Output& out,
else
{
out << nl << s << ' ' << arg << ';';
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, arg, false, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, arg, false, iter, false);
}
}
BuiltinPtr builtin = BuiltinPtr::dynamicCast(value);
@@ -3275,7 +3263,7 @@ Slice::JavaGenerator::writeStreamSequenceMarshalUnmarshalCode(Output& out,
string typeS = typeToString(type, TypeModeIn, package);
out << nl << "for(" << typeS << " __elem : " << v << ')';
out << sb;
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", true, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, "__elem", true, iter, false);
out << eb;
out << eb; // else
}
@@ -3322,13 +3310,13 @@ Slice::JavaGenerator::writeStreamSequenceMarshalUnmarshalCode(Output& out,
ostringstream patchParams;
patchParams << "new IceInternal.ListPatcher<" << origContentS << ">(" << v << ", " << origContentS
<< ".class, __type" << iter << ", __i" << iter << ')';
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", false, iter, false,
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, "__elem", false, iter, false,
StringList(), patchParams.str());
}
else
{
out << nl << cont << " __elem;";
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, "__elem", false, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, "__elem", false, iter, false);
}
if(!isObject)
{
@@ -3467,7 +3455,7 @@ Slice::JavaGenerator::writeStreamSequenceMarshalUnmarshalCode(Output& out,
ostringstream o;
o << v << "[__i" << iter << "]";
iter++;
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), true, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, o.str(), true, iter, false);
out << eb;
out << eb;
}
@@ -3552,12 +3540,12 @@ Slice::JavaGenerator::writeStreamSequenceMarshalUnmarshalCode(Output& out,
{
patchParams << "new IceInternal.SequencePatcher(" << v << ", " << origContentS
<< ".class, __type" << iter << ", __i" << iter << ')';
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), false, iter, false,
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, o.str(), false, iter, false,
StringList(), patchParams.str());
}
else
{
- writeStreamMarshalUnmarshalCode(out, package, type, OptionalNone, 0, o.str(), false, iter, false);
+ writeStreamMarshalUnmarshalCode(out, package, type, false, 0, o.str(), false, iter, false);
}
out << eb;
iter++;
diff --git a/cpp/src/slice2freezej/Main.cpp b/cpp/src/slice2freezej/Main.cpp
index 4a90ca266d0..9f85a9f5536 100755
--- a/cpp/src/slice2freezej/Main.cpp
+++ b/cpp/src/slice2freezej/Main.cpp
@@ -903,7 +903,7 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
out << nl << "__os.startWriteEncaps();";
}
iter = 0;
- writeMarshalUnmarshalCode(out, "", type, OptionalNone, 0, valS, true, iter, false);
+ writeMarshalUnmarshalCode(out, "", type, OptionalNone, false, 0, valS, true, iter, false);
if(type->usesClasses())
{
out << nl << "__os.writePendingObjects();";
@@ -996,7 +996,7 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
case Builtin::KindObjectProxy:
case Builtin::KindLocalObject:
{
- writeMarshalUnmarshalCode(out, "", type, OptionalNone, 0, "__r", false, iter, false, metaData,
+ writeMarshalUnmarshalCode(out, "", type, OptionalNone, false, 0, "__r", false, iter, false, metaData,
patchParams);
break;
}
@@ -1004,7 +1004,8 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
}
else
{
- writeMarshalUnmarshalCode(out, "", type, OptionalNone, 0, "__r", false, iter, false, metaData, patchParams);
+ writeMarshalUnmarshalCode(out, "", type, OptionalNone, false, 0, "__r", false, iter, false, metaData,
+ patchParams);
}
if(type->usesClasses())
{
@@ -1069,7 +1070,7 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
out << nl << "IceInternal.BasicStream __os = "
<< "new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator), encoding, true, false);";
int iter = 0;
- writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, 0, keyS, true, iter, false);
+ writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, false, 0, keyS, true, iter, false);
assert(!indexTypes[i]->usesClasses());
out << nl << "IceInternal.Buffer buf = __os.prepareWrite();";
@@ -1153,7 +1154,7 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
case Builtin::KindObjectProxy:
case Builtin::KindLocalObject:
{
- writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, 0, "r", false, iter, false,
+ writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, false, 0, "r", false, iter, false,
metaData, patchParams);
break;
}
@@ -1161,8 +1162,8 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
}
else
{
- writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, 0, "r", false, iter, false, metaData,
- patchParams);
+ writeMarshalUnmarshalCode(out, "", indexTypes[i], OptionalNone, false, 0, "r", false, iter, false,
+ metaData, patchParams);
}
out << nl << "return r;";
}
@@ -1409,7 +1410,7 @@ FreezeGenerator::generate(UnitPtr& u, const Index& index)
out << nl << "IceInternal.BasicStream __os = "
<< "new IceInternal.BasicStream(IceInternal.Util.getInstance(communicator()), encoding(), true, false);";
int iter = 0;
- writeMarshalUnmarshalCode(out, "", dataMember->type(), OptionalNone, 0, valueS, true, iter, false);
+ writeMarshalUnmarshalCode(out, "", dataMember->type(), OptionalNone, false, 0, valueS, true, iter, false);
if(type->usesClasses())
{
out << nl << "__os.writePendingObjects();";
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index 37879c13ca7..1327e24fb14 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -109,16 +109,23 @@ Slice::JavaVisitor::~JavaVisitor()
}
vector<string>
-Slice::JavaVisitor::getParams(const OperationPtr& op, const string& package)
+Slice::JavaVisitor::getParams(const OperationPtr& op, const string& package, bool local)
{
vector<string> params;
+ const bool optionalMapping = useOptionalMapping(op);
+
ParamDeclList paramList = op->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
StringList metaData = (*q)->getMetaData();
+ bool optional = (*q)->optional();
+ if(optional && (local || (*q)->isOutParam()))
+ {
+ optional = optionalMapping;
+ }
string typeString = typeToString((*q)->type(), (*q)->isOutParam() ? TypeModeOut : TypeModeIn, package,
- metaData, true, (*q)->optional());
+ metaData, true, optional);
params.push_back(typeString + ' ' + fixKwd((*q)->name()));
}
@@ -130,12 +137,24 @@ Slice::JavaVisitor::getParamsProxy(const OperationPtr& op, const string& package
{
vector<string> params;
+ const bool optionalMapping = useOptionalMapping(op);
+
ParamDeclList paramList = op->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
+ bool optional;
+ if((*q)->optional())
+ {
+ optional = (*q)->isOutParam() ? true : optionalMapping;
+ }
+ else
+ {
+ optional = false;
+ }
+
StringList metaData = (*q)->getMetaData();
string typeString = typeToString((*q)->type(), (*q)->isOutParam() ? TypeModeOut : TypeModeIn, package,
- metaData, true, useOptionalMapping(*q));
+ metaData, true, optional);
if(final)
{
typeString = "final " + typeString;
@@ -151,15 +170,28 @@ Slice::JavaVisitor::getInOutParams(const OperationPtr& op, const string& package
{
vector<string> params;
+ const bool optionalMapping = useOptionalMapping(op);
+
ParamDeclList paramList = op->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
if((*q)->isOutParam() == (paramType == OutParam))
{
- bool optional = (*q)->optional();
- if(optional && proxy)
+ bool optional;
+ if((*q)->optional())
{
- optional = useOptionalMapping(*q);
+ if(proxy)
+ {
+ optional = paramType == InParam ? optionalMapping : true;
+ }
+ else
+ {
+ optional = true;
+ }
+ }
+ else
+ {
+ optional = false;
}
StringList metaData = (*q)->getMetaData();
string typeString = typeToString((*q)->type(), paramType == InParam ? TypeModeIn : TypeModeOut, package,
@@ -186,14 +218,17 @@ Slice::JavaVisitor::getParamsAsync(const OperationPtr& op, const string& package
}
vector<string>
-Slice::JavaVisitor::getParamsAsyncCB(const OperationPtr& op, const string& package)
+Slice::JavaVisitor::getParamsAsyncCB(const OperationPtr& op, const string& package, bool amd)
{
vector<string> params;
+ const bool optionalMapping = amd ? useOptionalMapping(op) : true;
+
TypePtr ret = op->returnType();
if(ret)
{
- string retS = typeToString(ret, TypeModeIn, package, op->getMetaData(), true, op->returnIsOptional());
+ string retS = typeToString(ret, TypeModeIn, package, op->getMetaData(), true,
+ optionalMapping && op->returnIsOptional());
params.push_back(retS + " __ret");
}
@@ -203,7 +238,7 @@ Slice::JavaVisitor::getParamsAsyncCB(const OperationPtr& op, const string& packa
if((*q)->isOutParam())
{
string typeString = typeToString((*q)->type(), TypeModeIn, package, (*q)->getMetaData(), true,
- (*q)->optional());
+ optionalMapping && (*q)->optional());
params.push_back(typeString + ' ' + fixKwd((*q)->name()));
}
}
@@ -291,7 +326,8 @@ Slice::JavaVisitor::getArgsAsyncCB(const OperationPtr& op)
void
Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& package, const ParamDeclList& params,
- const OperationPtr& op, int& iter, bool marshal, bool dispatch)
+ const OperationPtr& op, int& iter, bool marshal, bool optionalMapping,
+ bool dispatch)
{
ParamDeclList optionals;
ParamDeclList::const_iterator pli;
@@ -311,8 +347,8 @@ Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& packa
{
patchParams = paramName;
}
- writeMarshalUnmarshalCode(out, package, (*pli)->type(), OptionalNone, 0, paramName, marshal, iter, holder,
- (*pli)->getMetaData(), patchParams);
+ writeMarshalUnmarshalCode(out, package, (*pli)->type(), OptionalNone, false, 0, paramName, marshal,
+ iter, holder, (*pli)->getMetaData(), patchParams);
}
}
@@ -325,13 +361,14 @@ Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& packa
BuiltinPtr builtin = BuiltinPtr::dynamicCast(ret);
ClassDeclPtr cl = ClassDeclPtr::dynamicCast(ret);
returnsObject = (builtin && builtin->kind() == Builtin::KindObject) || cl;
+ const bool optional = optionalMapping && op->returnIsOptional();
- string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional());
+ string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, optional);
bool holder = false;
if(!marshal)
{
- if(op->returnIsOptional())
+ if(optional)
{
out << nl << retS << " __ret = new " << retS << "();";
}
@@ -348,7 +385,7 @@ Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& packa
if(!op->returnIsOptional())
{
- writeMarshalUnmarshalCode(out, package, ret, OptionalNone, 0, "__ret", marshal, iter, holder,
+ writeMarshalUnmarshalCode(out, package, ret, OptionalNone, false, 0, "__ret", marshal, iter, holder,
op->getMetaData());
}
}
@@ -375,29 +412,22 @@ Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& packa
{
if(checkReturnType && op->returnTag() < (*pli)->tag())
{
- writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, op->returnTag(), "__ret", marshal, iter,
- false, op->getMetaData());
+ writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, optionalMapping, op->returnTag(),
+ "__ret", marshal, iter, false, op->getMetaData());
checkReturnType = false;
}
- OptionalMode mode;
- if((*pli)->isOutParam())
- {
- mode = OptionalOutParam;
- }
- else
- {
- mode = useOptionalMapping(*pli) ? OptionalInParamOpt : OptionalInParamReq;
- }
+ const bool holder = dispatch && (*pli)->isOutParam() && !optionalMapping;
- writeMarshalUnmarshalCode(out, package, (*pli)->type(), mode, (*pli)->tag(), fixKwd((*pli)->name()), marshal,
- iter, false, (*pli)->getMetaData());
+ writeMarshalUnmarshalCode(out, package, (*pli)->type(),
+ (*pli)->isOutParam() ? OptionalOutParam : OptionalInParam, optionalMapping,
+ (*pli)->tag(), fixKwd((*pli)->name()), marshal, iter, holder, (*pli)->getMetaData());
}
if(checkReturnType)
{
- writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, op->returnTag(), "__ret", marshal, iter,
- false, op->getMetaData());
+ writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, optionalMapping, op->returnTag(), "__ret",
+ marshal, iter, false, op->getMetaData());
}
}
@@ -554,16 +584,16 @@ Slice::JavaVisitor::writeMarshalDataMember(Output& out, const string& package, c
{
if(!member->optional())
{
- writeMarshalUnmarshalCode(out, package, member->type(), OptionalNone, 0, fixKwd(member->name()), true, iter,
- false, member->getMetaData());
+ writeMarshalUnmarshalCode(out, package, member->type(), OptionalNone, false, 0, fixKwd(member->name()),
+ true, iter, false, member->getMetaData());
}
else
{
out << nl << "if(__has_" << member->name() << " && __os.writeOpt(" << member->tag() << ", "
<< getOptionalType(member->type()) << "))";
out << sb;
- writeMarshalUnmarshalCode(out, package, member->type(), OptionalMember, 0, fixKwd(member->name()), true, iter,
- false, member->getMetaData());
+ writeMarshalUnmarshalCode(out, package, member->type(), OptionalMember, false, 0, fixKwd(member->name()), true,
+ iter, false, member->getMetaData());
out << eb;
}
}
@@ -586,15 +616,15 @@ Slice::JavaVisitor::writeUnmarshalDataMember(Output& out, const string& package,
if(!member->optional())
{
- writeMarshalUnmarshalCode(out, package, member->type(), OptionalNone, 0, fixKwd(member->name()), false, iter,
- false, member->getMetaData(), patchParams);
+ writeMarshalUnmarshalCode(out, package, member->type(), OptionalNone, false, 0, fixKwd(member->name()), false,
+ iter, false, member->getMetaData(), patchParams);
}
else
{
out << nl << "if(__has_" << member->name() << " = __is.readOpt(" << member->tag() << ", "
<< getOptionalType(member->type()) << "))";
out << sb;
- writeMarshalUnmarshalCode(out, package, member->type(), OptionalMember, 0, fixKwd(member->name()), false,
+ writeMarshalUnmarshalCode(out, package, member->type(), OptionalMember, false, 0, fixKwd(member->name()), false,
iter, false, member->getMetaData(), patchParams);
out << eb;
}
@@ -880,7 +910,8 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
string deprecateReason = getDeprecateReason(op, cl, "operation");
- bool amd = cl->hasMetaData("amd") || op->hasMetaData("amd");
+ const bool amd = cl->hasMetaData("amd") || op->hasMetaData("amd");
+ const bool optionalMapping = useOptionalMapping(op);
vector<string> params;
vector<string> args;
@@ -962,7 +993,8 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
writeDocComment(out, op, deprecateReason);
}
out << nl << "public final "
- << typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional())
+ << typeToString(ret, TypeModeReturn, package, op->getMetaData(), true,
+ optionalMapping && op->returnIsOptional())
<< nl << opName << spar << params << epar;
if(op->hasMetaData("UserException"))
{
@@ -1009,7 +1041,9 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
<< " __obj, IceInternal.Incoming __inS, Ice.Current __current)";
out << sb;
- bool amd = cl->hasMetaData("amd") || op->hasMetaData("amd");
+ const bool amd = cl->hasMetaData("amd") || op->hasMetaData("amd");
+ const bool optionalMapping = useOptionalMapping(op);
+
if(!amd)
{
TypePtr ret = op->returnType();
@@ -1080,7 +1114,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
}
}
iter = 0;
- writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true);
+ writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
out << nl << "__inS.endReadParams();";
}
else
@@ -1094,7 +1128,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
for(pli = outParams.begin(); pli != outParams.end(); ++pli)
{
string typeS = typeToString((*pli)->type(), TypeModeOut, package, (*pli)->getMetaData(), true,
- (*pli)->optional());
+ optionalMapping && (*pli)->optional());
out << nl << typeS << ' ' << fixKwd((*pli)->name()) << " = new " << typeS << "();";
}
@@ -1109,7 +1143,8 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
out << nl;
if(ret)
{
- string retS = typeToString(ret, TypeModeReturn, package, opMetaData, true, op->returnIsOptional());
+ string retS = typeToString(ret, TypeModeReturn, package, opMetaData, true,
+ optionalMapping && op->returnIsOptional());
out << retS << " __ret = ";
}
out << "__obj." << fixKwd(opName) << '(';
@@ -1144,7 +1179,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
{
out << nl << "__os.format(" << formatTypeToString(format) << ");";
}
- writeMarshalUnmarshalParams(out, package, outParams, op, iter, true, true);
+ writeMarshalUnmarshalParams(out, package, outParams, op, iter, true, optionalMapping, true);
out << nl << "__inS.__endWriteParams(true);";
}
else
@@ -1205,24 +1240,28 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
iter = 0;
for(pli = inParams.begin(); pli != inParams.end(); ++pli)
{
- StringList metaData = (*pli)->getMetaData();
TypePtr paramType = (*pli)->type();
string paramName = fixKwd((*pli)->name());
- string typeS = typeToString(paramType, TypeModeIn, package, metaData);
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(paramType);
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(paramType))
+ string typeS = typeToString(paramType, TypeModeIn, package, (*pli)->getMetaData(),
+ true, (*pli)->optional());
+ if((*pli)->optional())
{
- out << nl << typeS << "Holder " << paramName << " = new " << typeS << "Holder();";
- writeMarshalUnmarshalCode(out, package, paramType, OptionalNone, 0, paramName, false, iter,
- true, metaData, string());
+ out << nl << typeS << ' ' << paramName << " = new " << typeS << "();";
}
else
{
- out << nl << typeS << ' ' << paramName << ';';
- writeMarshalUnmarshalCode(out, package, paramType, OptionalNone, 0, paramName, false, iter,
- false, metaData);
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(paramType);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(paramType))
+ {
+ out << nl << typeS << "Holder " << paramName << " = new " << typeS << "Holder();";
+ }
+ else
+ {
+ out << nl << typeS << ' ' << paramName << ';';
+ }
}
}
+ writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
out << nl << "__inS.endReadParams();";
}
else
@@ -1243,10 +1282,13 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
{
TypePtr paramType = (*pli)->type();
out << fixKwd((*pli)->name());
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(paramType);
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(paramType))
+ if(!(*pli)->optional())
{
- out << ".value";
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(paramType);
+ if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(paramType))
+ {
+ out << ".value";
+ }
}
out << ", ";
}
@@ -2357,7 +2399,8 @@ Slice::Gen::OpsVisitor::writeOperations(const ClassDefPtr& p, bool noCurrent)
TypePtr ret;
vector<string> params;
- bool amd = !p->isLocal() && (cl->hasMetaData("amd") || op->hasMetaData("amd"));
+ const bool amd = !p->isLocal() && (cl->hasMetaData("amd") || op->hasMetaData("amd"));
+ const bool optionalMapping = useOptionalMapping(op);
if(amd)
{
@@ -2369,7 +2412,8 @@ Slice::Gen::OpsVisitor::writeOperations(const ClassDefPtr& p, bool noCurrent)
ret = op->returnType();
}
- string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional());
+ string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true,
+ optionalMapping && op->returnIsOptional());
ExceptionList throws = op->throws();
throws.sort();
throws.unique();
@@ -2528,7 +2572,9 @@ Slice::Gen::TieVisitor::visitClassDefStart(const ClassDefPtr& p)
{
ContainerPtr container = (*r)->container();
ClassDefPtr cl = ClassDefPtr::dynamicCast(container);
- bool hasAMD = cl->hasMetaData("amd") || (*r)->hasMetaData("amd");
+ const bool hasAMD = cl->hasMetaData("amd") || (*r)->hasMetaData("amd");
+ const bool optionalMapping = useOptionalMapping(*r);
+
#if defined(__SUNPRO_CC) && (__SUNPRO_CC==0x550)
//
// Work around for Sun CC 5.5 bug #4853566
@@ -2545,8 +2591,10 @@ Slice::Gen::TieVisitor::visitClassDefStart(const ClassDefPtr& p)
#else
string opName = hasAMD ? (*r)->name() + "_async" : fixKwd((*r)->name());
#endif
+
TypePtr ret = (*r)->returnType();
- string retS = typeToString(ret, TypeModeReturn, package, (*r)->getMetaData());
+ string retS = typeToString(ret, TypeModeReturn, package, (*r)->getMetaData(), true,
+ optionalMapping && (*r)->returnIsOptional());
vector<string> params;
vector<string> args;
@@ -2780,7 +2828,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
//
// For local classes and interfaces, we don't use the OperationsNC interface.
- // Instead, we generated the operation signatures directly into the class
+ // Instead, we generate the operation signatures directly into the class
// or interface.
//
if(p->isLocal())
@@ -2793,12 +2841,13 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
ContainerPtr container = op->container();
ClassDefPtr cl = ClassDefPtr::dynamicCast(container);
string opname = op->name();
+ const bool optionalMapping = useOptionalMapping(op);
- TypePtr ret;
- vector<string> params = getParams(op, package);
- ret = op->returnType();
+ TypePtr ret = op->returnType();
+ vector<string> params = getParams(op, package, true);
- string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData());
+ string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true,
+ optionalMapping && op->returnIsOptional());
ExceptionList throws = op->throws();
throws.sort();
throws.unique();
@@ -4418,6 +4467,8 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
vector<string> params = getParamsProxy(op, package);
vector<string> args = getArgs(op);
+ const bool optionalMapping = useOptionalMapping(op);
+
ExceptionList throws = op->throws();
throws.sort();
throws.unique();
@@ -4615,7 +4666,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
pl.push_back(*pli);
}
}
- writeMarshalUnmarshalParams(out, package, pl, 0, iter, true);
+ writeMarshalUnmarshalParams(out, package, pl, 0, iter, true, optionalMapping);
out << nl << "__result.__endWriteParams();";
}
else
@@ -4688,7 +4739,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
pl.push_back(*pli);
}
}
- writeMarshalUnmarshalParams(out, package, pl, op, iter, false);
+ writeMarshalUnmarshalParams(out, package, pl, op, iter, false, true);
out << nl << "__result.__endReadParams();";
}
else
@@ -5562,6 +5613,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
string opName = fixKwd(op->name());
TypePtr ret = op->returnType();
string retS = typeToString(ret, TypeModeReturn, package, opMetaData, true, op->returnIsOptional());
+ const bool optionalMapping = useOptionalMapping(op);
int iter = 0;
ParamDeclList inParams;
@@ -5617,7 +5669,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
{
out << nl << "__os.format(" << formatTypeToString(format) << ");";
}
- writeMarshalUnmarshalParams(out, package, inParams, 0, iter, true);
+ writeMarshalUnmarshalParams(out, package, inParams, 0, iter, true, optionalMapping);
out << nl << "__og.endWriteParams();";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
@@ -5660,7 +5712,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
if(ret || !outParams.empty())
{
out << nl << "IceInternal.BasicStream __is = __og.startReadParams();";
- writeMarshalUnmarshalParams(out, package, outParams, op, iter, false);
+ writeMarshalUnmarshalParams(out, package, outParams, op, iter, false, true);
out << nl << "__og.endReadParams();";
}
else
@@ -5742,6 +5794,7 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p)
ClassDefPtr cl = ClassDefPtr::dynamicCast(container);
string opName = fixKwd(op->name());
TypePtr ret = op->returnType();
+ const bool optionalMapping = useOptionalMapping(op);
string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional());
ExceptionList throws = op->throws();
@@ -5763,25 +5816,6 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p)
vector<string> params = getParamsProxy(op, package, true);
- //
- // Collect the arguments that will be passed to the servant.
- //
- // Note that for optional in parameters, we may have to wrap a value
- // in an Optional object to be compatible with the servant's signature.
- //
- vector<string> args;
- ParamDeclList paramList = op->parameters();
- for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
- {
- string param = fixKwd((*q)->name());
- if(!(*q)->isOutParam() && (*q)->optional() && !useOptionalMapping(*q))
- {
- string typeString = typeToString((*q)->type(), TypeModeIn, package, (*q)->getMetaData(), true, true);
- param = "new " + typeString + "(" + param + ")";
- }
- args.push_back(param);
- }
-
out << sp;
if(!deprecateReason.empty())
{
@@ -5837,27 +5871,87 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sb;
}
+ //
+ // Collect the arguments that will be passed to the servant.
+ //
+ vector<string> args;
+ ParamDeclList paramList = op->parameters();
+ ParamDeclList::const_iterator q;
+ for(q = paramList.begin(); q != paramList.end(); ++q)
+ {
+ string param = fixKwd((*q)->name());
+ //
+ // For optional parameters, the proxy mapping can differ from the servant
+ // mapping, depending on whether the optional mapping is being used.
+ //
+ if((*q)->optional() && !optionalMapping)
+ {
+ if((*q)->isOutParam())
+ {
+ param = "__" + (*q)->name();
+ string typeS = typeToString((*q)->type(), TypeModeOut, package, (*q)->getMetaData());
+ out << nl << typeS << ' ' << param << " = new " << typeS << "();";
+ }
+ else
+ {
+ string typeS = typeToString((*q)->type(), TypeModeIn, package, (*q)->getMetaData(), true, true);
+ param = "new " + typeS + "(" + param + ")";
+ }
+ }
+ args.push_back(param);
+ }
+
out << nl;
if(ret)
{
if(op->returnIsOptional())
{
- out << resultType << " __r = ";
+ if(optionalMapping)
+ {
+ out << resultType << " __r = ";
+ }
+ else
+ {
+ out << typeToString(ret, TypeModeIn, package, op->getMetaData()) << " __r = ";
+ }
}
else
{
out << "__result.value = ";
}
}
+
out << "__servant." << opName << spar << args << "__current" << epar << ';';
- if(op->returnIsOptional())
+
+ for(q = paramList.begin(); q != paramList.end(); ++q)
{
- out << nl << "if(__r != null && __r.isSet())";
- out << sb;
- out << nl << "__result.set(__r.get());";
- out << eb;
+ //
+ // For optional parameters, the proxy mapping can differ from the servant
+ // mapping, depending on whether the optional mapping is being used.
+ //
+ if((*q)->optional() && !optionalMapping && (*q)->isOutParam())
+ {
+ out << nl << fixKwd((*q)->name()) << ".set(__" << (*q)->name() << ".value);";
+ }
+ }
+
+ if(ret && op->returnIsOptional())
+ {
+ if(optionalMapping)
+ {
+ out << nl << "if(__r != null && __r.isSet())";
+ out << sb;
+ out << nl << "__result.set(__r.get());";
+ out << eb;
+ }
+ else
+ {
+ out << nl << "__result.set(__r);";
+ }
}
+
out << nl << "return Ice.DispatchStatus.DispatchOK;";
+
if(!throws.empty())
{
out << eb;
@@ -5991,129 +6085,144 @@ Slice::Gen::BaseImplVisitor::BaseImplVisitor(const string& dir) :
void
Slice::Gen::BaseImplVisitor::writeDecl(Output& out, const string& package, const string& name, const TypePtr& type,
- const StringList& metaData)
+ const StringList& metaData, bool optional)
{
- out << nl << typeToString(type, TypeModeIn, package, metaData) << ' ' << name;
+ string typeS = typeToString(type, TypeModeIn, package, metaData, true, optional);
+ out << nl << typeS << ' ' << name;
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
- if(builtin)
+ if(optional)
{
- switch(builtin->kind())
+ out << " = new " << typeS << "();";
+ }
+ else
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if(builtin)
{
- case Builtin::KindBool:
- {
- out << " = false";
- break;
- }
- case Builtin::KindByte:
- {
- out << " = (byte)0";
- break;
- }
- case Builtin::KindShort:
+ switch(builtin->kind())
{
- out << " = (short)0";
- break;
- }
- case Builtin::KindInt:
- case Builtin::KindLong:
- {
- out << " = 0";
- break;
- }
- case Builtin::KindFloat:
- {
- out << " = (float)0.0";
- break;
- }
- case Builtin::KindDouble:
- {
- out << " = 0.0";
- break;
+ case Builtin::KindBool:
+ {
+ out << " = false";
+ break;
+ }
+ case Builtin::KindByte:
+ {
+ out << " = (byte)0";
+ break;
+ }
+ case Builtin::KindShort:
+ {
+ out << " = (short)0";
+ break;
+ }
+ case Builtin::KindInt:
+ case Builtin::KindLong:
+ {
+ out << " = 0";
+ break;
+ }
+ case Builtin::KindFloat:
+ {
+ out << " = (float)0.0";
+ break;
+ }
+ case Builtin::KindDouble:
+ {
+ out << " = 0.0";
+ break;
+ }
+ case Builtin::KindString:
+ {
+ out << " = \"\"";
+ break;
+ }
+ case Builtin::KindObject:
+ case Builtin::KindObjectProxy:
+ case Builtin::KindLocalObject:
+ {
+ out << " = null";
+ break;
+ }
}
- case Builtin::KindString:
+ }
+ else
+ {
+ EnumPtr en = EnumPtr::dynamicCast(type);
+ if(en)
{
- out << " = \"\"";
- break;
+ EnumeratorList enumerators = en->getEnumerators();
+ out << " = " << getAbsolute(en, package) << '.' << fixKwd(enumerators.front()->name());
}
- case Builtin::KindObject:
- case Builtin::KindObjectProxy:
- case Builtin::KindLocalObject:
+ else
{
out << " = null";
- break;
}
}
- }
- else
- {
- EnumPtr en = EnumPtr::dynamicCast(type);
- if(en)
- {
- EnumeratorList enumerators = en->getEnumerators();
- out << " = " << getAbsolute(en, package) << '.' << fixKwd(enumerators.front()->name());
- }
- else
- {
- out << " = null";
- }
- }
- out << ';';
+ out << ';';
+ }
}
void
-Slice::Gen::BaseImplVisitor::writeReturn(Output& out, const TypePtr& type)
+Slice::Gen::BaseImplVisitor::writeReturn(Output& out, const TypePtr& type, bool optional)
{
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
- if(builtin)
+ if(optional)
{
- switch(builtin->kind())
+ out << nl << "return null;";
+ }
+ else
+ {
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
+ if(builtin)
{
- case Builtin::KindBool:
- {
- out << nl << "return false;";
- break;
- }
- case Builtin::KindByte:
+ switch(builtin->kind())
{
- out << nl << "return (byte)0;";
- break;
- }
- case Builtin::KindShort:
- {
- out << nl << "return (short)0;";
- break;
- }
- case Builtin::KindInt:
- case Builtin::KindLong:
- {
- out << nl << "return 0;";
- break;
- }
- case Builtin::KindFloat:
- {
- out << nl << "return (float)0.0;";
- break;
- }
- case Builtin::KindDouble:
- {
- out << nl << "return 0.0;";
- break;
- }
- case Builtin::KindString:
- case Builtin::KindObject:
- case Builtin::KindObjectProxy:
- case Builtin::KindLocalObject:
- {
- out << nl << "return null;";
- break;
+ case Builtin::KindBool:
+ {
+ out << nl << "return false;";
+ break;
+ }
+ case Builtin::KindByte:
+ {
+ out << nl << "return (byte)0;";
+ break;
+ }
+ case Builtin::KindShort:
+ {
+ out << nl << "return (short)0;";
+ break;
+ }
+ case Builtin::KindInt:
+ case Builtin::KindLong:
+ {
+ out << nl << "return 0;";
+ break;
+ }
+ case Builtin::KindFloat:
+ {
+ out << nl << "return (float)0.0;";
+ break;
+ }
+ case Builtin::KindDouble:
+ {
+ out << nl << "return 0.0;";
+ break;
+ }
+ case Builtin::KindString:
+ case Builtin::KindObject:
+ case Builtin::KindObjectProxy:
+ case Builtin::KindLocalObject:
+ {
+ out << nl << "return null;";
+ break;
+ }
}
+ return;
}
- return;
- }
- out << nl << "return null;";
+ out << nl << "return null;";
+ }
}
void
@@ -6122,8 +6231,10 @@ Slice::Gen::BaseImplVisitor::writeOperation(Output& out, const string& package,
string opName = op->name();
TypePtr ret = op->returnType();
+ const bool optionalMapping = useOptionalMapping(op);
StringList opMetaData = op->getMetaData();
- string retS = typeToString(ret, TypeModeReturn, package, opMetaData);
+ string retS = typeToString(ret, TypeModeReturn, package, opMetaData, true,
+ optionalMapping && op->returnIsOptional());
vector<string> params = getParams(op, package);
ContainerPtr container = op->container();
@@ -6168,13 +6279,14 @@ Slice::Gen::BaseImplVisitor::writeOperation(Output& out, const string& package,
}
if(ret)
{
- writeDecl(out, package, result, ret, opMetaData);
+ writeDecl(out, package, result, ret, opMetaData, optionalMapping && op->returnIsOptional());
}
for(q = paramList.begin(); q != paramList.end(); ++q)
{
if((*q)->isOutParam())
{
- writeDecl(out, package, fixKwd((*q)->name()), (*q)->type(), (*q)->getMetaData());
+ writeDecl(out, package, fixKwd((*q)->name()), (*q)->type(), (*q)->getMetaData(),
+ optionalMapping && (*q)->optional());
}
}
@@ -6231,7 +6343,7 @@ Slice::Gen::BaseImplVisitor::writeOperation(Output& out, const string& package,
//
if(ret)
{
- writeReturn(out, ret);
+ writeReturn(out, ret, optionalMapping && op->returnIsOptional());
}
out << eb;
@@ -6432,7 +6544,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
ExceptionList throws = p->throws();
- vector<string> params = getParamsAsyncCB(p, classPkg);
+ vector<string> params = getParamsAsyncCB(p, classPkg, false);
vector<string> args = getInOutArgs(p, OutParam);
writeDocCommentOp(out, p);
@@ -6529,7 +6641,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
ExceptionList throws = p->throws();
- vector<string> params = getParamsAsyncCB(p, classPkg);
+ vector<string> params = getParamsAsyncCB(p, classPkg, false);
vector<string> args = getInOutArgs(p, OutParam);
writeDocCommentOp(out, p);
@@ -6596,7 +6708,9 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
string classNameAMDI = "_AMD_" + cl->name();
string absoluteAMDI = getAbsolute(cl, "", "_AMD_", "_" + name);
- vector<string> paramsAMD = getParamsAsyncCB(p, classPkg);
+ vector<string> paramsAMD = getParamsAsyncCB(p, classPkg, true);
+
+ const bool optionalMapping = useOptionalMapping(p);
{
open(absoluteAMD, p->file());
@@ -6676,19 +6790,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
{
out << nl << "__os.format(" << formatTypeToString(format) << ");";
}
- for(pli = outParams.begin(); pli != outParams.end(); ++pli)
- {
- StringList metaData = (*pli)->getMetaData();
- string typeS = typeToString((*pli)->type(), TypeModeIn, classPkg, metaData);
- writeMarshalUnmarshalCode(out, classPkg, (*pli)->type(), OptionalNone, 0, fixKwd((*pli)->name()),
- true, iter, false, metaData);
- }
- if(ret)
- {
- string retS = typeToString(ret, TypeModeIn, classPkg, opMetaData);
- writeMarshalUnmarshalCode(out, classPkg, ret, OptionalNone, 0, "__ret", true, iter, false,
- opMetaData);
- }
+ writeMarshalUnmarshalParams(out, classPkg, outParams, p, iter, true, optionalMapping, false);
out << nl << "this.__endWriteParams(true);";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
diff --git a/cpp/src/slice2java/Gen.h b/cpp/src/slice2java/Gen.h
index 5cfeae3714a..94f0dc95a2d 100644
--- a/cpp/src/slice2java/Gen.h
+++ b/cpp/src/slice2java/Gen.h
@@ -32,11 +32,11 @@ protected:
//
// Compose the parameter lists for an operation.
//
- std::vector<std::string> getParams(const OperationPtr&, const std::string&);
+ std::vector<std::string> getParams(const OperationPtr&, const std::string&, bool = false);
std::vector<std::string> getParamsProxy(const OperationPtr&, const std::string&, bool = false);
std::vector<std::string> getInOutParams(const OperationPtr&, const std::string&, ParamDir, bool);
std::vector<std::string> getParamsAsync(const OperationPtr&, const std::string&, bool);
- std::vector<std::string> getParamsAsyncCB(const OperationPtr&, const std::string&);
+ std::vector<std::string> getParamsAsyncCB(const OperationPtr&, const std::string&, bool);
//
// Compose the argument lists for an operation.
@@ -47,7 +47,7 @@ protected:
std::vector<std::string> getArgsAsyncCB(const OperationPtr&);
void writeMarshalUnmarshalParams(::IceUtilInternal::Output&, const std::string&, const ParamDeclList&,
- const OperationPtr&, int&, bool, bool = false);
+ const OperationPtr&, int&, bool, bool, bool = false);
//
// Generate a throws clause containing only non-local exceptions.
@@ -290,12 +290,13 @@ private:
// Generate code to emit a local variable declaration and initialize it
// if necessary.
//
- void writeDecl(::IceUtilInternal::Output&, const std::string&, const std::string&, const TypePtr&, const StringList&);
+ void writeDecl(::IceUtilInternal::Output&, const std::string&, const std::string&, const TypePtr&,
+ const StringList&, bool);
//
// Generate code to return a value.
//
- void writeReturn(::IceUtilInternal::Output&, const TypePtr&);
+ void writeReturn(::IceUtilInternal::Output&, const TypePtr&, bool);
//
// Generate an operation.
diff --git a/java/build.xml b/java/build.xml
index abb6569e399..4164c47b28d 100644
--- a/java/build.xml
+++ b/java/build.xml
@@ -577,6 +577,7 @@
</fileset>
<fileset dir="test/Ice/optional">
<include name="Test.ice" />
+ <include name="TestAMD.ice" />
</fileset>
<fileset dir="test/Ice/stream">
<include name="Test.ice" />
diff --git a/java/test/Ice/optional/AMDInitialI.java b/java/test/Ice/optional/AMDInitialI.java
new file mode 100644
index 00000000000..732b0152b46
--- /dev/null
+++ b/java/test/Ice/optional/AMDInitialI.java
@@ -0,0 +1,428 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2012 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package test.Ice.optional;
+
+import test.Ice.optional.AMD.Test.*;
+
+public final class AMDInitialI extends Initial
+{
+ public void
+ shutdown_async(AMD_Initial_shutdown cb, Ice.Current current)
+ {
+ current.adapter.getCommunicator().shutdown();
+ cb.ice_response();
+ }
+
+ public void
+ pingPong_async(AMD_Initial_pingPong cb, Ice.Object obj, Ice.Current current)
+ {
+ cb.ice_response(obj);
+ }
+
+ public void
+ opOptionalException_async(AMD_Initial_opOptionalException cb, Ice.IntOptional a, Ice.Optional<String> b,
+ Ice.Optional<OneOptional> o, Ice.Current current)
+ throws OptionalException
+ {
+ OptionalException ex = new OptionalException();
+ if(a.isSet())
+ {
+ ex.setA(a.get());
+ }
+ else
+ {
+ ex.clearA(); // The member "a" has a default value.
+ }
+ if(b.isSet())
+ {
+ ex.setB(b.get());
+ }
+ if(o.isSet())
+ {
+ ex.setO(o.get());
+ }
+ cb.ice_exception(ex);
+ }
+
+ public void
+ opByte_async(AMD_Initial_opByte cb, Ice.ByteOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opByteOpt_async(AMD_Initial_opByteOpt cb, Ice.ByteOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opBool_async(AMD_Initial_opBool cb, Ice.BooleanOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opBoolOpt_async(AMD_Initial_opBoolOpt cb, Ice.BooleanOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opShort_async(AMD_Initial_opShort cb, Ice.ShortOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opShortOpt_async(AMD_Initial_opShortOpt cb, Ice.ShortOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opInt_async(AMD_Initial_opInt cb, Ice.IntOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opIntOpt_async(AMD_Initial_opIntOpt cb, Ice.IntOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opLong_async(AMD_Initial_opLong cb, Ice.LongOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opLongOpt_async(AMD_Initial_opLongOpt cb, Ice.LongOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opFloat_async(AMD_Initial_opFloat cb, Ice.FloatOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opFloatOpt_async(AMD_Initial_opFloatOpt cb, Ice.FloatOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opDouble_async(AMD_Initial_opDouble cb, Ice.DoubleOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opDoubleOpt_async(AMD_Initial_opDoubleOpt cb, Ice.DoubleOptional p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opString_async(AMD_Initial_opString cb, Ice.Optional<String> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opStringOpt_async(AMD_Initial_opStringOpt cb, Ice.Optional<String> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opMyEnum_async(AMD_Initial_opMyEnum cb, Ice.Optional<MyEnum> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opMyEnumOpt_async(AMD_Initial_opMyEnumOpt cb, Ice.Optional<MyEnum> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opSmallStruct_async(AMD_Initial_opSmallStruct cb, Ice.Optional<SmallStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opSmallStructOpt_async(AMD_Initial_opSmallStructOpt cb, Ice.Optional<SmallStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opFixedStruct_async(AMD_Initial_opFixedStruct cb, Ice.Optional<FixedStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opFixedStructOpt_async(AMD_Initial_opFixedStructOpt cb, Ice.Optional<FixedStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opVarStruct_async(AMD_Initial_opVarStruct cb, Ice.Optional<VarStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opVarStructOpt_async(AMD_Initial_opVarStructOpt cb, Ice.Optional<VarStruct> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opOneOptional_async(AMD_Initial_opOneOptional cb, Ice.Optional<OneOptional> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opOneOptionalOpt_async(AMD_Initial_opOneOptionalOpt cb, Ice.Optional<OneOptional> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opOneOptionalProxy_async(AMD_Initial_opOneOptionalProxy cb, Ice.Optional<OneOptionalPrx> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opOneOptionalProxyOpt_async(AMD_Initial_opOneOptionalProxyOpt cb, Ice.Optional<OneOptionalPrx> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opByteSeq_async(AMD_Initial_opByteSeq cb, Ice.Optional<byte[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opByteSeqOpt_async(AMD_Initial_opByteSeqOpt cb, Ice.Optional<byte[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opBoolSeq_async(AMD_Initial_opBoolSeq cb, Ice.Optional<boolean[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opBoolSeqOpt_async(AMD_Initial_opBoolSeqOpt cb, Ice.Optional<boolean[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opShortSeq_async(AMD_Initial_opShortSeq cb, Ice.Optional<short[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opShortSeqOpt_async(AMD_Initial_opShortSeqOpt cb, Ice.Optional<short[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opIntSeq_async(AMD_Initial_opIntSeq cb, Ice.Optional<int[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opIntSeqOpt_async(AMD_Initial_opIntSeqOpt cb, Ice.Optional<int[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opLongSeq_async(AMD_Initial_opLongSeq cb, Ice.Optional<long[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opLongSeqOpt_async(AMD_Initial_opLongSeqOpt cb, Ice.Optional<long[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opFloatSeq_async(AMD_Initial_opFloatSeq cb, Ice.Optional<float[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opFloatSeqOpt_async(AMD_Initial_opFloatSeqOpt cb, Ice.Optional<float[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opDoubleSeq_async(AMD_Initial_opDoubleSeq cb, Ice.Optional<double[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opDoubleSeqOpt_async(AMD_Initial_opDoubleSeqOpt cb, Ice.Optional<double[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opStringSeq_async(AMD_Initial_opStringSeq cb, Ice.Optional<String[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opStringSeqOpt_async(AMD_Initial_opStringSeqOpt cb, Ice.Optional<String[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opSmallStructSeq_async(AMD_Initial_opSmallStructSeq cb, Ice.Optional<SmallStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opSmallStructSeqOpt_async(AMD_Initial_opSmallStructSeqOpt cb, Ice.Optional<SmallStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opSmallStructList_async(AMD_Initial_opSmallStructList cb, Ice.Optional<java.util.List<SmallStruct>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opSmallStructListOpt_async(AMD_Initial_opSmallStructListOpt cb, Ice.Optional<java.util.List<SmallStruct>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opFixedStructSeq_async(AMD_Initial_opFixedStructSeq cb, Ice.Optional<FixedStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opFixedStructSeqOpt_async(AMD_Initial_opFixedStructSeqOpt cb, Ice.Optional<FixedStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opFixedStructList_async(AMD_Initial_opFixedStructList cb, Ice.Optional<java.util.List<FixedStruct>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opFixedStructListOpt_async(AMD_Initial_opFixedStructListOpt cb, Ice.Optional<java.util.List<FixedStruct>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opVarStructSeq_async(AMD_Initial_opVarStructSeq cb, Ice.Optional<VarStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opVarStructSeqOpt_async(AMD_Initial_opVarStructSeqOpt cb, Ice.Optional<VarStruct[]> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opSerializable_async(AMD_Initial_opSerializable cb, Ice.Optional<SerializableClass> p1, Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opSerializableOpt_async(AMD_Initial_opSerializableOpt cb, Ice.Optional<SerializableClass> p1, Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opIntIntDict_async(AMD_Initial_opIntIntDict cb, Ice.Optional<java.util.Map<Integer, Integer>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opIntIntDictOpt_async(AMD_Initial_opIntIntDictOpt cb, Ice.Optional<java.util.Map<Integer, Integer>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opStringIntDict_async(AMD_Initial_opStringIntDict cb, Ice.Optional<java.util.Map<String, Integer>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1.get(), p1.get());
+ }
+
+ public void
+ opStringIntDictOpt_async(AMD_Initial_opStringIntDictOpt cb, Ice.Optional<java.util.Map<String, Integer>> p1,
+ Ice.Current current)
+ {
+ cb.ice_response(p1, p1);
+ }
+
+ public void
+ opClassAndUnknownOptional_async(AMD_Initial_opClassAndUnknownOptional cb, A p, Ice.Current current)
+ {
+ cb.ice_response();
+ }
+}
diff --git a/java/test/Ice/optional/AMDServer.java b/java/test/Ice/optional/AMDServer.java
new file mode 100644
index 00000000000..df5550d0544
--- /dev/null
+++ b/java/test/Ice/optional/AMDServer.java
@@ -0,0 +1,39 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2012 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package test.Ice.optional;
+
+public class AMDServer extends test.Util.Application
+{
+ public int run(String[] args)
+ {
+ communicator().getProperties().setProperty("TestAdapter.Endpoints", "default -p 12010:udp");
+ Ice.ObjectAdapter adapter = communicator().createObjectAdapter("TestAdapter");
+ adapter.add(new AMDInitialI(), communicator().stringToIdentity("initial"));
+ adapter.activate();
+ return WAIT;
+ }
+
+ protected Ice.InitializationData getInitData(Ice.StringSeqHolder argsH)
+ {
+ Ice.InitializationData initData = new Ice.InitializationData();
+ initData.properties = Ice.Util.createProperties(argsH);
+ initData.properties.setProperty("Ice.Package.Test", "test.Ice.optional.AMD");
+ return initData;
+ }
+
+ public static void main(String[] args)
+ {
+ AMDServer c = new AMDServer();
+ int status = c.main("Server", args);
+
+ System.gc();
+ System.exit(status);
+ }
+}
diff --git a/java/test/Ice/optional/InitialI.java b/java/test/Ice/optional/InitialI.java
index 31df8707394..2acba8b6158 100644
--- a/java/test/Ice/optional/InitialI.java
+++ b/java/test/Ice/optional/InitialI.java
@@ -50,11 +50,11 @@ public final class InitialI extends Initial
throw ex;
}
- public Ice.ByteOptional
- opByte(Ice.ByteOptional p1, Ice.ByteOptional p3, Ice.Current current)
+ public byte
+ opByte(Ice.ByteOptional p1, Ice.ByteHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.ByteOptional
@@ -64,11 +64,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.BooleanOptional
- opBool(Ice.BooleanOptional p1, Ice.BooleanOptional p3, Ice.Current current)
+ public boolean
+ opBool(Ice.BooleanOptional p1, Ice.BooleanHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.BooleanOptional
@@ -78,11 +78,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.ShortOptional
- opShort(Ice.ShortOptional p1, Ice.ShortOptional p3, Ice.Current current)
+ public short
+ opShort(Ice.ShortOptional p1, Ice.ShortHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.ShortOptional
@@ -92,11 +92,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.IntOptional
- opInt(Ice.IntOptional p1, Ice.IntOptional p3, Ice.Current current)
+ public int
+ opInt(Ice.IntOptional p1, Ice.IntHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.IntOptional
@@ -106,11 +106,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.LongOptional
- opLong(Ice.LongOptional p1, Ice.LongOptional p3, Ice.Current current)
+ public long
+ opLong(Ice.LongOptional p1, Ice.LongHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.LongOptional
@@ -120,11 +120,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.FloatOptional
- opFloat(Ice.FloatOptional p1, Ice.FloatOptional p3, Ice.Current current)
+ public float
+ opFloat(Ice.FloatOptional p1, Ice.FloatHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.FloatOptional
@@ -134,11 +134,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.DoubleOptional
- opDouble(Ice.DoubleOptional p1, Ice.DoubleOptional p3, Ice.Current current)
+ public double
+ opDouble(Ice.DoubleOptional p1, Ice.DoubleHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.DoubleOptional
@@ -148,11 +148,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<String>
- opString(Ice.Optional<String> p1, Ice.Optional<String> p3, Ice.Current current)
+ public String
+ opString(Ice.Optional<String> p1, Ice.StringHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<String>
@@ -162,11 +162,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<MyEnum>
- opMyEnum(Ice.Optional<MyEnum> p1, Ice.Optional<MyEnum> p3, Ice.Current current)
+ public MyEnum
+ opMyEnum(Ice.Optional<MyEnum> p1, MyEnumHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<MyEnum>
@@ -176,11 +176,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<SmallStruct>
- opSmallStruct(Ice.Optional<SmallStruct> p1, Ice.Optional<SmallStruct> p3, Ice.Current current)
+ public SmallStruct
+ opSmallStruct(Ice.Optional<SmallStruct> p1, SmallStructHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<SmallStruct>
@@ -190,11 +190,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<FixedStruct>
- opFixedStruct(Ice.Optional<FixedStruct> p1, Ice.Optional<FixedStruct> p3, Ice.Current current)
+ public FixedStruct
+ opFixedStruct(Ice.Optional<FixedStruct> p1, FixedStructHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<FixedStruct>
@@ -204,11 +204,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<VarStruct>
- opVarStruct(Ice.Optional<VarStruct> p1, Ice.Optional<VarStruct> p3, Ice.Current current)
+ public VarStruct
+ opVarStruct(Ice.Optional<VarStruct> p1, VarStructHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<VarStruct>
@@ -218,11 +218,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<OneOptional>
- opOneOptional(Ice.Optional<OneOptional> p1, Ice.Optional<OneOptional> p3, Ice.Current current)
+ public OneOptional
+ opOneOptional(Ice.Optional<OneOptional> p1, OneOptionalHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<OneOptional>
@@ -232,11 +232,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<OneOptionalPrx>
- opOneOptionalProxy(Ice.Optional<OneOptionalPrx> p1, Ice.Optional<OneOptionalPrx> p3, Ice.Current current)
+ public OneOptionalPrx
+ opOneOptionalProxy(Ice.Optional<OneOptionalPrx> p1, OneOptionalPrxHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<OneOptionalPrx>
@@ -246,11 +246,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<byte[]>
- opByteSeq(Ice.Optional<byte[]> p1, Ice.Optional<byte[]> p3, Ice.Current current)
+ public byte[]
+ opByteSeq(Ice.Optional<byte[]> p1, ByteSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<byte[]>
@@ -260,11 +260,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<boolean[]>
- opBoolSeq(Ice.Optional<boolean[]> p1, Ice.Optional<boolean[]> p3, Ice.Current current)
+ public boolean[]
+ opBoolSeq(Ice.Optional<boolean[]> p1, BoolSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<boolean[]>
@@ -274,11 +274,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<short[]>
- opShortSeq(Ice.Optional<short[]> p1, Ice.Optional<short[]> p3, Ice.Current current)
+ public short[]
+ opShortSeq(Ice.Optional<short[]> p1, ShortSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<short[]>
@@ -288,11 +288,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<int[]>
- opIntSeq(Ice.Optional<int[]> p1, Ice.Optional<int[]> p3, Ice.Current current)
+ public int[]
+ opIntSeq(Ice.Optional<int[]> p1, IntSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<int[]>
@@ -302,11 +302,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<long[]>
- opLongSeq(Ice.Optional<long[]> p1, Ice.Optional<long[]> p3, Ice.Current current)
+ public long[]
+ opLongSeq(Ice.Optional<long[]> p1, LongSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<long[]>
@@ -316,11 +316,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<float[]>
- opFloatSeq(Ice.Optional<float[]> p1, Ice.Optional<float[]> p3, Ice.Current current)
+ public float[]
+ opFloatSeq(Ice.Optional<float[]> p1, FloatSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<float[]>
@@ -330,11 +330,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<double[]>
- opDoubleSeq(Ice.Optional<double[]> p1, Ice.Optional<double[]> p3, Ice.Current current)
+ public double[]
+ opDoubleSeq(Ice.Optional<double[]> p1, DoubleSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<double[]>
@@ -344,11 +344,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<String[]>
- opStringSeq(Ice.Optional<String[]> p1, Ice.Optional<String[]> p3, Ice.Current current)
+ public String[]
+ opStringSeq(Ice.Optional<String[]> p1, StringSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<String[]>
@@ -358,11 +358,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<SmallStruct[]>
- opSmallStructSeq(Ice.Optional<SmallStruct[]> p1, Ice.Optional<SmallStruct[]> p3, Ice.Current current)
+ public SmallStruct[]
+ opSmallStructSeq(Ice.Optional<SmallStruct[]> p1, SmallStructSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<SmallStruct[]>
@@ -372,12 +372,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<java.util.List<SmallStruct>>
- opSmallStructList(Ice.Optional<java.util.List<SmallStruct>> p1,
- Ice.Optional<java.util.List<SmallStruct>> p3, Ice.Current current)
+ public java.util.List<SmallStruct>
+ opSmallStructList(Ice.Optional<java.util.List<SmallStruct>> p1, SmallStructListHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<java.util.List<SmallStruct>>
@@ -388,11 +387,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<FixedStruct[]>
- opFixedStructSeq(Ice.Optional<FixedStruct[]> p1, Ice.Optional<FixedStruct[]> p3, Ice.Current current)
+ public FixedStruct[]
+ opFixedStructSeq(Ice.Optional<FixedStruct[]> p1, FixedStructSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<FixedStruct[]>
@@ -402,12 +401,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<java.util.List<FixedStruct>>
- opFixedStructList(Ice.Optional<java.util.List<FixedStruct>> p1,
- Ice.Optional<java.util.List<FixedStruct>> p3, Ice.Current current)
+ public java.util.List<FixedStruct>
+ opFixedStructList(Ice.Optional<java.util.List<FixedStruct>> p1, FixedStructListHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<java.util.List<FixedStruct>>
@@ -418,11 +416,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<VarStruct[]>
- opVarStructSeq(Ice.Optional<VarStruct[]> p1, Ice.Optional<VarStruct[]> p3, Ice.Current current)
+ public VarStruct[]
+ opVarStructSeq(Ice.Optional<VarStruct[]> p1, VarStructSeqHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<VarStruct[]>
@@ -432,11 +430,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<SerializableClass>
- opSerializable(Ice.Optional<SerializableClass> p1, Ice.Optional<SerializableClass> p3, Ice.Current current)
+ public SerializableClass
+ opSerializable(Ice.Optional<SerializableClass> p1, Ice.Holder<SerializableClass> p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<SerializableClass>
@@ -446,12 +444,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<java.util.Map<Integer, Integer>>
- opIntIntDict(Ice.Optional<java.util.Map<Integer, Integer>> p1,
- Ice.Optional<java.util.Map<Integer, Integer>> p3, Ice.Current current)
+ public java.util.Map<Integer, Integer>
+ opIntIntDict(Ice.Optional<java.util.Map<Integer, Integer>> p1, IntIntDictHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<java.util.Map<Integer, Integer>>
@@ -462,12 +459,11 @@ public final class InitialI extends Initial
return p1;
}
- public Ice.Optional<java.util.Map<String, Integer>>
- opStringIntDict(Ice.Optional<java.util.Map<String, Integer>> p1,
- Ice.Optional<java.util.Map<String, Integer>> p3, Ice.Current current)
+ public java.util.Map<String, Integer>
+ opStringIntDict(Ice.Optional<java.util.Map<String, Integer>> p1, StringIntDictHolder p3, Ice.Current current)
{
- p3.set(p1);
- return p1;
+ p3.value = p1.get();
+ return p1.get();
}
public Ice.Optional<java.util.Map<String, Integer>>
diff --git a/java/test/Ice/optional/TestAMD.ice b/java/test/Ice/optional/TestAMD.ice
new file mode 100644
index 00000000000..42209e9ee1e
--- /dev/null
+++ b/java/test/Ice/optional/TestAMD.ice
@@ -0,0 +1,276 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2012 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#pragma once
+
+[["java:package:test.Ice.optional.AMD"]]
+module Test
+{
+
+class OneOptional
+{
+ optional(1) int a;
+};
+
+enum MyEnum
+{
+ MyEnumMember
+};
+
+struct SmallStruct
+{
+ byte m;
+};
+
+struct FixedStruct
+{
+ int m;
+};
+
+struct VarStruct
+{
+ string m;
+};
+
+struct ClassVarStruct
+{
+ int a;
+};
+
+sequence<byte> ByteSeq;
+sequence<bool> BoolSeq;
+sequence<short> ShortSeq;
+sequence<int> IntSeq;
+sequence<long> LongSeq;
+sequence<float> FloatSeq;
+sequence<double> DoubleSeq;
+sequence<string> StringSeq;
+sequence<MyEnum> MyEnumSeq;
+sequence<SmallStruct> SmallStructSeq;
+["java:type:java.util.ArrayList<SmallStruct>"] sequence<SmallStruct> SmallStructList;
+sequence<FixedStruct> FixedStructSeq;
+["java:type:java.util.ArrayList<FixedStruct>"] sequence<FixedStruct> FixedStructList;
+sequence<VarStruct> VarStructSeq;
+sequence<OneOptional> OneOptionalSeq;
+sequence<OneOptional*> OneOptionalPrxSeq;
+
+["java:serializable:test.Ice.optional.SerializableClass"] sequence<byte> Serializable;
+
+dictionary<int, int> IntIntDict;
+dictionary<string, int> StringIntDict;
+dictionary<int, MyEnum> IntEnumDict;
+dictionary<int, FixedStruct> IntFixedStructDict;
+dictionary<int, VarStruct> IntVarStructDict;
+dictionary<int, OneOptional> IntOneOptionalDict;
+dictionary<int, OneOptional*> IntOneOptionalPrxDict;
+
+class MultiOptional
+{
+ optional(1) byte a;
+ optional(2) bool b;
+ optional(3) short c;
+ optional(4) int d;
+ optional(5) long e;
+ optional(6) float f;
+ optional(7) double g;
+ optional(8) string h;
+ optional(9) MyEnum i;
+ optional(10) MultiOptional* j;
+ optional(11) MultiOptional k;
+ optional(12) ByteSeq bs;
+ optional(13) StringSeq ss;
+ optional(14) IntIntDict iid;
+ optional(15) StringIntDict sid;
+ optional(16) FixedStruct fs;
+ optional(17) VarStruct vs;
+
+ optional(18) ShortSeq shs;
+ optional(19) MyEnumSeq es;
+ optional(20) FixedStructSeq fss;
+ optional(21) VarStructSeq vss;
+ optional(22) OneOptionalSeq oos;
+ optional(23) OneOptionalPrxSeq oops;
+
+ optional(24) IntEnumDict ied;
+ optional(25) IntFixedStructDict ifsd;
+ optional(26) IntVarStructDict ivsd;
+ optional(27) IntOneOptionalDict iood;
+ optional(28) IntOneOptionalPrxDict ioopd;
+
+ optional(29) BoolSeq bos;
+};
+
+class A
+{
+ int requiredA;
+ optional(1) int ma;
+ optional(50) int mb;
+ optional(500) int mc;
+};
+
+["preserve-slice"]
+class B extends A
+{
+ int requiredB;
+ optional(10) int md;
+};
+
+class C extends B
+{
+ string ss;
+ optional(890) string ms;
+};
+
+class WD
+{
+ optional(1) int a = 5;
+ optional(2) string s = "test";
+};
+
+exception OptionalException
+{
+ optional(1) int a = 5;
+ optional(2) string b;
+ optional(50) OneOptional o;
+};
+
+exception DerivedException extends OptionalException
+{
+ optional(600) string ss = "test";
+ optional(601) OneOptional o2;
+};
+
+exception RequiredException extends OptionalException
+{
+ string ss = "test";
+ OneOptional o2;
+};
+
+class OptionalWithCustom
+{
+ ["java:type:java.util.ArrayList<Byte>"] optional(1) ByteSeq bs;
+ optional(2) ClassVarStruct s;
+};
+
+["ami", "amd"]
+class Initial
+{
+ void shutdown();
+
+ Object pingPong(Object o);
+
+ ["java:optional"]
+ void opOptionalException(optional(1) int a, optional(2) string b, optional(3) OneOptional o)
+ throws OptionalException;
+
+ optional(1) byte opByte(optional(2) byte p1, out optional(3) byte p3);
+ ["java:optional"] optional(1) byte opByteOpt(optional(2) byte p1, out optional(3) byte p3);
+
+ optional(1) bool opBool(optional(2) bool p1, out optional(3) bool p3);
+ ["java:optional"] optional(1) bool opBoolOpt(optional(2) bool p1, out optional(3) bool p3);
+
+ optional(1) short opShort(optional(2) short p1, out optional(3) short p3);
+ ["java:optional"] optional(1) short opShortOpt(optional(2) short p1, out optional(3) short p3);
+
+ optional(1) int opInt(optional(2) int p1, out optional(3) int p3);
+ ["java:optional"] optional(1) int opIntOpt(optional(2) int p1, out optional(3) int p3);
+
+ optional(1) long opLong(optional(2) long p1, out optional(3) long p3);
+ ["java:optional"] optional(1) long opLongOpt(optional(2) long p1, out optional(3) long p3);
+
+ optional(1) float opFloat(optional(2) float p1, out optional(3) float p3);
+ ["java:optional"] optional(1) float opFloatOpt(optional(2) float p1, out optional(3) float p3);
+
+ optional(1) double opDouble(optional(2) double p1, out optional(3) double p3);
+ ["java:optional"] optional(1) double opDoubleOpt(optional(2) double p1, out optional(3) double p3);
+
+ optional(1) string opString(optional(2) string p1, out optional(3) string p3);
+ ["java:optional"] optional(1) string opStringOpt(optional(2) string p1, out optional(3) string p3);
+
+ optional(1) MyEnum opMyEnum(optional(2) MyEnum p1, out optional(3) MyEnum p3);
+ ["java:optional"] optional(1) MyEnum opMyEnumOpt(optional(2) MyEnum p1, out optional(3) MyEnum p3);
+
+ optional(1) SmallStruct opSmallStruct(optional(2) SmallStruct p1, out optional(3) SmallStruct p3);
+ ["java:optional"] optional(1) SmallStruct opSmallStructOpt(optional(2) SmallStruct p1,
+ out optional(3) SmallStruct p3);
+
+ optional(1) FixedStruct opFixedStruct(optional(2) FixedStruct p1, out optional(3) FixedStruct p3);
+ ["java:optional"] optional(1) FixedStruct opFixedStructOpt(optional(2) FixedStruct p1,
+ out optional(3) FixedStruct p3);
+
+ optional(1) VarStruct opVarStruct(optional(2) VarStruct p1, out optional(3) VarStruct p3);
+ ["java:optional"] optional(1) VarStruct opVarStructOpt(optional(2) VarStruct p1, out optional(3) VarStruct p3);
+
+ optional(1) OneOptional opOneOptional(optional(2) OneOptional p1, out optional(3) OneOptional p3);
+ ["java:optional"] optional(1) OneOptional opOneOptionalOpt(optional(2) OneOptional p1,
+ out optional(3) OneOptional p3);
+
+ optional(1) OneOptional* opOneOptionalProxy(optional(2) OneOptional* p1, out optional(3) OneOptional* p3);
+ ["java:optional"] optional(1) OneOptional* opOneOptionalProxyOpt(optional(2) OneOptional* p1,
+ out optional(3) OneOptional* p3);
+
+ optional(1) ByteSeq opByteSeq(optional(2) ByteSeq p1, out optional(3) ByteSeq p3);
+ ["java:optional"] optional(1) ByteSeq opByteSeqOpt(optional(2) ByteSeq p1, out optional(3) ByteSeq p3);
+
+ optional(1) BoolSeq opBoolSeq(optional(2) BoolSeq p1, out optional(3) BoolSeq p3);
+ ["java:optional"] optional(1) BoolSeq opBoolSeqOpt(optional(2) BoolSeq p1, out optional(3) BoolSeq p3);
+
+ optional(1) ShortSeq opShortSeq(optional(2) ShortSeq p1, out optional(3) ShortSeq p3);
+ ["java:optional"] optional(1) ShortSeq opShortSeqOpt(optional(2) ShortSeq p1, out optional(3) ShortSeq p3);
+
+ optional(1) IntSeq opIntSeq(optional(2) IntSeq p1, out optional(3) IntSeq p3);
+ ["java:optional"] optional(1) IntSeq opIntSeqOpt(optional(2) IntSeq p1, out optional(3) IntSeq p3);
+
+ optional(1) LongSeq opLongSeq(optional(2) LongSeq p1, out optional(3) LongSeq p3);
+ ["java:optional"] optional(1) LongSeq opLongSeqOpt(optional(2) LongSeq p1, out optional(3) LongSeq p3);
+
+ optional(1) FloatSeq opFloatSeq(optional(2) FloatSeq p1, out optional(3) FloatSeq p3);
+ ["java:optional"] optional(1) FloatSeq opFloatSeqOpt(optional(2) FloatSeq p1, out optional(3) FloatSeq p3);
+
+ optional(1) DoubleSeq opDoubleSeq(optional(2) DoubleSeq p1, out optional(3) DoubleSeq p3);
+ ["java:optional"] optional(1) DoubleSeq opDoubleSeqOpt(optional(2) DoubleSeq p1, out optional(3) DoubleSeq p3);
+
+ optional(1) StringSeq opStringSeq(optional(2) StringSeq p1, out optional(3) StringSeq p3);
+ ["java:optional"] optional(1) StringSeq opStringSeqOpt(optional(2) StringSeq p1, out optional(3) StringSeq p3);
+
+ optional(1) SmallStructSeq opSmallStructSeq(optional(2) SmallStructSeq p1, out optional(3) SmallStructSeq p3);
+ ["java:optional"] optional(1) SmallStructSeq opSmallStructSeqOpt(optional(2) SmallStructSeq p1,
+ out optional(3) SmallStructSeq p3);
+
+ optional(1) SmallStructList opSmallStructList(optional(2) SmallStructList p1, out optional(3) SmallStructList p3);
+ ["java:optional"] optional(1) SmallStructList opSmallStructListOpt(optional(2) SmallStructList p1,
+ out optional(3) SmallStructList p3);
+
+ optional(1) FixedStructSeq opFixedStructSeq(optional(2) FixedStructSeq p1, out optional(3) FixedStructSeq p3);
+ ["java:optional"] optional(1) FixedStructSeq opFixedStructSeqOpt(optional(2) FixedStructSeq p1,
+ out optional(3) FixedStructSeq p3);
+
+ optional(1) FixedStructList opFixedStructList(optional(2) FixedStructList p1, out optional(3) FixedStructList p3);
+ ["java:optional"] optional(1) FixedStructList opFixedStructListOpt(optional(2) FixedStructList p1,
+ out optional(3) FixedStructList p3);
+
+ optional(1) VarStructSeq opVarStructSeq(optional(2) VarStructSeq p1, out optional(3) VarStructSeq p3);
+ ["java:optional"] optional(1) VarStructSeq opVarStructSeqOpt(optional(2) VarStructSeq p1,
+ out optional(3) VarStructSeq p3);
+
+ optional(1) Serializable opSerializable(optional(2) Serializable p1, out optional(3) Serializable p3);
+ ["java:optional"] optional(1) Serializable opSerializableOpt(optional(2) Serializable p1,
+ out optional(3) Serializable p3);
+
+ optional(1) IntIntDict opIntIntDict(optional(2) IntIntDict p1, out optional(3) IntIntDict p3);
+ ["java:optional"] optional(1) IntIntDict opIntIntDictOpt(optional(2) IntIntDict p1, out optional(3) IntIntDict p3);
+
+ optional(1) StringIntDict opStringIntDict(optional(2) StringIntDict p1, out optional(3) StringIntDict p3);
+ ["java:optional"] optional(1) StringIntDict opStringIntDictOpt(optional(2) StringIntDict p1,
+ out optional(3) StringIntDict p3);
+
+ void opClassAndUnknownOptional(A p);
+};
+
+};
diff --git a/java/test/Ice/optional/run.py b/java/test/Ice/optional/run.py
index 6ab39a07d80..1faa524d762 100755
--- a/java/test/Ice/optional/run.py
+++ b/java/test/Ice/optional/run.py
@@ -24,3 +24,5 @@ print("Running test with compact (default) format.")
TestUtil.clientServerTest()
print("Running test with sliced format.")
TestUtil.clientServerTest(additionalClientOptions="--Ice.Default.SlicedFormat", additionalServerOptions="--Ice.Default.SlicedFormat")
+print("Running test with AMD server.")
+TestUtil.clientServerTest(server="test.Ice.optional.AMDServer")