summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2java/Gen.cpp')
-rw-r--r--cpp/src/slice2java/Gen.cpp601
1 files changed, 362 insertions, 239 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index ce6aaff3cbb..b15dc0d5f5a 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -66,9 +66,9 @@ sliceModeToIceMode(Operation::Mode opMode)
}
static string
-formatTypeToString(FormatType type)
+opFormatTypeToString(const OperationPtr& op)
{
- switch(type)
+ switch(op->format())
{
case DefaultFormat:
return "Ice.FormatType.DefaultFormat";
@@ -109,16 +109,52 @@ Slice::JavaVisitor::~JavaVisitor()
}
vector<string>
-Slice::JavaVisitor::getParams(const OperationPtr& op, const string& package, bool final)
+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()));
+ }
+
+ return params;
+}
+
+vector<string>
+Slice::JavaVisitor::getParamsProxy(const OperationPtr& op, const string& package, bool final)
+{
+ 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, optional);
if(final)
{
typeString = "final " + typeString;
@@ -130,18 +166,36 @@ Slice::JavaVisitor::getParams(const OperationPtr& op, const string& package, boo
}
vector<string>
-Slice::JavaVisitor::getInOutParams(const OperationPtr& op, const string& package, ParamDir paramType)
+Slice::JavaVisitor::getInOutParams(const OperationPtr& op, const string& package, ParamDir paramType, bool proxy)
{
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;
+ if((*q)->optional())
+ {
+ 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,
- metaData, true, (*q)->optional());
+ metaData, true, optional);
params.push_back(typeString + ' ' + fixKwd((*q)->name()));
}
}
@@ -152,7 +206,7 @@ Slice::JavaVisitor::getInOutParams(const OperationPtr& op, const string& package
vector<string>
Slice::JavaVisitor::getParamsAsync(const OperationPtr& op, const string& package, bool amd)
{
- vector<string> params = getInOutParams(op, package, InParam);
+ vector<string> params = getInOutParams(op, package, InParam, !amd);
string name = op->name();
ContainerPtr container = op->container();
@@ -164,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");
}
@@ -181,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()));
}
}
@@ -269,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;
@@ -289,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);
}
}
@@ -303,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 << "();";
}
@@ -326,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());
}
}
@@ -353,19 +412,22 @@ Slice::JavaVisitor::writeMarshalUnmarshalParams(Output& out, const string& packa
{
if(checkReturnType && op->returnTag() < (*pli)->tag())
{
- writeMarshalUnmarshalCode(out, package, ret, OptionalParam, op->returnTag(), "__ret", marshal, iter, false,
- op->getMetaData());
+ writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, optionalMapping, op->returnTag(),
+ "__ret", marshal, iter, false, op->getMetaData());
checkReturnType = false;
}
- writeMarshalUnmarshalCode(out, package, (*pli)->type(), OptionalParam, (*pli)->tag(),
- fixKwd((*pli)->name()), marshal, iter, false, (*pli)->getMetaData());
+ const bool holder = dispatch && (*pli)->isOutParam() && !optionalMapping;
+
+ 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, OptionalParam, op->returnTag(), "__ret", marshal, iter, false,
- op->getMetaData());
+ writeMarshalUnmarshalCode(out, package, ret, OptionalReturnParam, optionalMapping, op->returnTag(), "__ret",
+ marshal, iter, false, op->getMetaData());
}
}
@@ -522,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;
}
}
@@ -554,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;
}
@@ -848,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;
@@ -930,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"))
{
@@ -977,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();
@@ -1048,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
@@ -1062,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 << "();";
}
@@ -1077,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) << '(';
@@ -1104,15 +1171,11 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
//
// Marshal 'out' parameters and return value.
//
- FormatType format = op->format();
if(!outParams.empty() || ret)
{
- out << nl << "IceInternal.BasicStream __os = __inS.__startWriteParams();";
- if(op->returnsClasses() && format != DefaultFormat)
- {
- out << nl << "__os.format(" << formatTypeToString(format) << ");";
- }
- writeMarshalUnmarshalParams(out, package, outParams, op, iter, true, true);
+ out << nl << "IceInternal.BasicStream __os = __inS.__startWriteParams("
+ << opFormatTypeToString(op) << ");";
+ writeMarshalUnmarshalParams(out, package, outParams, op, iter, true, optionalMapping, true);
out << nl << "__inS.__endWriteParams(true);";
}
else
@@ -1133,13 +1196,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
string exS = getAbsolute(*t, package);
out << nl << "catch(" << exS << " ex)";
out << sb;
- out << nl << "IceInternal.BasicStream __os = __inS.__startWriteParams();";
- if(format != DefaultFormat)
- {
- out << nl << "__os.format(" << formatTypeToString(format) << ");";
- }
- out << nl << "__os.writeUserException(ex);";
- out << nl << "__inS.__endWriteParams(false);";
+ out << nl << "__inS.__writeUserException(ex, " << opFormatTypeToString(op) << ");";
out << nl << "return Ice.DispatchStatus.DispatchUserException;";
out << eb;
}
@@ -1173,24 +1230,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
@@ -1211,10 +1272,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 << ", ";
}
@@ -2325,7 +2389,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)
{
@@ -2337,7 +2402,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();
@@ -2496,7 +2562,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
@@ -2513,8 +2581,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;
@@ -2748,7 +2818,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())
@@ -2761,12 +2831,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();
@@ -2792,11 +2863,11 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
out << ';';
//
- // Generate asynchronous API for local operations marked with XXX metadata.
+ // Generate asynchronous API for local operations marked with "async" metadata.
//
if(p->hasMetaData("async") || op->hasMetaData("async"))
{
- vector<string> inParams = getInOutParams(op, package, InParam);
+ vector<string> inParams = getInOutParams(op, package, InParam, true);
out << sp;
writeDocCommentAMI(out, op, InParam);
@@ -2826,7 +2897,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
string cb = "Callback_" + name + "_" + opname + " __cb";
out << "Ice.AsyncResult begin_" << opname << spar << inParams << cb << epar << ';';
- vector<string> outParams = getInOutParams(op, package, OutParam);
+ vector<string> outParams = getInOutParams(op, package, OutParam, true);
out << sp;
writeDocCommentAMI(out, op, OutParam);
out << nl;
@@ -4383,9 +4454,11 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
TypePtr ret = op->returnType();
string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional());
- vector<string> params = getParams(op, package);
+ vector<string> params = getParamsProxy(op, package);
vector<string> args = getArgs(op);
+ const bool optionalMapping = useOptionalMapping(op);
+
ExceptionList throws = op->throws();
throws.sort();
throws.unique();
@@ -4477,7 +4550,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
//
// Write the asynchronous begin/end methods.
//
- vector<string> inParams = getInOutParams(op, package, InParam);
+ vector<string> inParams = getInOutParams(op, package, InParam, true);
vector<string> inArgs = getInOutArgs(op, InParam);
string callbackParam = "Ice.Callback __cb";
int iter;
@@ -4569,12 +4642,8 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
iter = 0;
if(!inArgs.empty())
{
- out << nl << "IceInternal.BasicStream __os = __result.__startWriteParams();";
- FormatType format = op->format();
- if(op->sendsClasses() && format != DefaultFormat)
- {
- out << nl << "__os.format(" << formatTypeToString(format) << ");";
- }
+ out << nl << "IceInternal.BasicStream __os = __result.__startWriteParams("
+ << opFormatTypeToString(op) << ");";
ParamDeclList pl;
for(pli = paramList.begin(); pli != paramList.end(); ++pli)
{
@@ -4583,7 +4652,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
@@ -4599,7 +4668,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
out << nl << "return __result;";
out << eb;
- vector<string> outParams = getInOutParams(op, package, OutParam);
+ vector<string> outParams = getInOutParams(op, package, OutParam, true);
//
// End method
@@ -4656,7 +4725,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
@@ -5315,7 +5384,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
TypePtr ret = p->returnType();
string retS = typeToString(ret, TypeModeReturn, package, p->getMetaData(), true, p->returnIsOptional());
- vector<string> params = getParams(p, package);
+ vector<string> params = getParamsProxy(p, package);
ExceptionList throws = p->throws();
throws.sort();
throws.unique();
@@ -5348,7 +5417,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
//
// Start with the type-unsafe begin methods.
//
- vector<string> inParams = getInOutParams(p, package, InParam);
+ vector<string> inParams = getInOutParams(p, package, InParam, true);
string callbackParam = "Ice.Callback __cb";
string callbackDoc = "@param __cb The asynchronous callback object.";
@@ -5393,7 +5462,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
out << nl << "public Ice.AsyncResult begin_" << p->name() << spar << inParams << contextParam
<< typeSafeCallbackParam << epar << ';';
- vector<string> outParams = getInOutParams(p, package, OutParam);
+ vector<string> outParams = getInOutParams(p, package, OutParam, true);
out << sp;
writeDocCommentAMI(out, p, OutParam);
@@ -5476,7 +5545,7 @@ Slice::Gen::DelegateVisitor::visitClassDefStart(const ClassDefPtr& p)
TypePtr ret = op->returnType();
string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData(), true, op->returnIsOptional());
- vector<string> params = getParams(op, package);
+ vector<string> params = getParamsProxy(op, package);
ExceptionList throws = op->throws();
throws.sort();
@@ -5530,6 +5599,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;
@@ -5564,7 +5634,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
throws.sort(Slice::DerivedToBaseCompare());
#endif
- vector<string> params = getParams(op, package);
+ vector<string> params = getParamsProxy(op, package);
out << sp;
out << nl << "public " << retS << nl << opName << spar << params << contextParam << epar;
@@ -5579,13 +5649,8 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
{
out << nl << "try";
out << sb;
- out << nl << "IceInternal.BasicStream __os = __og.startWriteParams();";
- FormatType format = op->format();
- if(op->sendsClasses() && format != DefaultFormat)
- {
- out << nl << "__os.format(" << formatTypeToString(format) << ");";
- }
- writeMarshalUnmarshalParams(out, package, inParams, 0, iter, true);
+ out << nl << "IceInternal.BasicStream __os = __og.startWriteParams(" << opFormatTypeToString(op) << ");";
+ writeMarshalUnmarshalParams(out, package, inParams, 0, iter, true, optionalMapping);
out << nl << "__og.endWriteParams();";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
@@ -5628,7 +5693,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
@@ -5710,6 +5775,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();
@@ -5729,8 +5795,7 @@ Slice::Gen::DelegateDVisitor::visitClassDefStart(const ClassDefPtr& p)
throws.sort(Slice::DerivedToBaseCompare());
#endif
- vector<string> params = getParams(op, package, true);
- vector<string> args = getArgs(op);
+ vector<string> params = getParamsProxy(op, package, true);
out << sp;
if(!deprecateReason.empty())
@@ -5787,27 +5852,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;
@@ -5941,129 +6066,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:
- {
- out << " = (short)0";
- break;
- }
- case Builtin::KindInt:
- case Builtin::KindLong:
- {
- out << " = 0";
- break;
- }
- case Builtin::KindFloat:
- {
- out << " = (float)0.0";
- break;
- }
- case Builtin::KindDouble:
+ switch(builtin->kind())
{
- 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
@@ -6072,8 +6212,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();
@@ -6118,13 +6260,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());
}
}
@@ -6181,7 +6324,7 @@ Slice::Gen::BaseImplVisitor::writeOperation(Output& out, const string& package,
//
if(ret)
{
- writeReturn(out, ret);
+ writeReturn(out, ret, optionalMapping && op->returnIsOptional());
}
out << eb;
@@ -6382,7 +6525,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);
@@ -6479,7 +6622,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);
@@ -6546,7 +6689,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());
@@ -6616,29 +6761,13 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
iter = 0;
out << nl << "if(__validateResponse(true))";
out << sb;
- FormatType format = p->format();
if(ret || !outParams.empty())
{
out << nl << "try";
out << sb;
- out << nl << "IceInternal.BasicStream __os = this.__startWriteParams();";
- if(p->returnsClasses() && format != DefaultFormat)
- {
- 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);
- }
+ out << nl << "IceInternal.BasicStream __os = this.__startWriteParams("
+ << opFormatTypeToString(p) << ");";
+ writeMarshalUnmarshalParams(out, classPkg, outParams, p, iter, true, optionalMapping, false);
out << nl << "this.__endWriteParams(true);";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
@@ -6670,13 +6799,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
out << sb;
out << nl << "if(__validateResponse(false))";
out << sb;
- out << nl << "IceInternal.BasicStream __os = __startWriteParams();";
- if(format != DefaultFormat)
- {
- out << nl << "__os.format(" << formatTypeToString(format) << ");";
- }
- out << nl << "__os.writeUserException(__ex);";
- out << nl << "__endWriteParams(false);";
+ out << nl << "__writeUserException(__ex, " << opFormatTypeToString(p) << ");";
out << nl << "__response();";
out << eb;
out << eb;