diff options
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 220 |
1 files changed, 175 insertions, 45 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 30f7f1504b7..7da79f99a8b 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -2850,6 +2850,55 @@ Slice::Gen::ImplVisitor::ImplVisitor(Output& h, Output& c, } void +Slice::Gen::ImplVisitor::writeDecl(Output& out, const string& name, const TypePtr& type) +{ + out << nl << typeToString(type) << ' ' << name; + + BuiltinPtr builtin = BuiltinPtr::dynamicCast(type); + if(builtin) + { + switch(builtin->kind()) + { + case Builtin::KindBool: + { + out << " = false"; + break; + } + case Builtin::KindByte: + case Builtin::KindShort: + case Builtin::KindInt: + case Builtin::KindLong: + { + out << " = 0"; + break; + } + case Builtin::KindFloat: + case Builtin::KindDouble: + { + out << " = 0.0"; + break; + } + case Builtin::KindString: + case Builtin::KindObject: + case Builtin::KindObjectProxy: + case Builtin::KindLocalObject: + { + break; + } + } + } + + EnumPtr en = EnumPtr::dynamicCast(type); + if(en) + { + EnumeratorList enumerators = en->getEnumerators(); + out << " = " << fixKwd(en->scope()) << fixKwd(enumerators.front()->name()); + } + + out << ';'; +} + +void Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type) { BuiltinPtr builtin = BuiltinPtr::dynamicCast(type); @@ -2967,6 +3016,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) string scope = fixKwd(p->scope()); string scoped = fixKwd(p->scoped()); string cls = scope.substr(2) + name + "I"; + string classScopedAMD = scope + "AMD_" + name; ClassList bases = p->bases(); ClassDefPtr base; @@ -3005,67 +3055,147 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p) TypePtr ret = op->returnType(); string retS = returnTypeToString(ret); - H << sp << nl << "virtual " << retS << ' ' << opName << '('; - H.useCurrentPosAsIndent(); - ParamDeclList paramList = op->parameters(); - ParamDeclList::const_iterator q; - for(q = paramList.begin(); q != paramList.end(); ++q) + if(!p->isLocal() && (p->hasMetaData("amd") || op->hasMetaData("amd"))) { - if(q != paramList.begin()) + H << sp << nl << "virtual void " << opName << "_async("; + H.useCurrentPosAsIndent(); + H << "const " << classScopedAMD << '_' << opName << "Ptr&"; + ParamDeclList paramList = op->parameters(); + ParamDeclList::const_iterator q; + for(q = paramList.begin(); q != paramList.end(); ++q) + { + if(!(*q)->isOutParam()) + { + H << ',' << nl << inputTypeToString((*q)->type()); + } + } + H << ',' << nl << "const Ice::Current&"; + H.restoreIndent(); + + bool nonmutating = op->mode() == Operation::Nonmutating; + + H << ")" << (nonmutating ? " const" : "") << ";"; + + C << sp << nl << "void" << nl << scoped.substr(2) << "I::" << opName << "_async("; + C.useCurrentPosAsIndent(); + C << "const " << classScopedAMD << '_' << opName << "Ptr& " << opName << "CB"; + for(q = paramList.begin(); q != paramList.end(); ++q) + { + if(!(*q)->isOutParam()) + { + C << ',' << nl << inputTypeToString((*q)->type()) << ' ' << fixKwd((*q)->name()); + } + } + C << ',' << nl << "const Ice::Current& current"; + C.restoreIndent(); + C << ")" << (nonmutating ? " const" : ""); + C << sb; + + string result = "r"; + for(q = paramList.begin(); q != paramList.end(); ++q) + { + if((*q)->name() == result) + { + result = "_" + result; + break; + } + } + if(ret) + { + writeDecl(C, result, ret); + } + for(q = paramList.begin(); q != paramList.end(); ++q) { - H << ',' << nl; + if((*q)->isOutParam()) + { + writeDecl(C, fixKwd((*q)->name()), (*q)->type()); + } } - string typeString = (*q)->isOutParam() ? - outputTypeToString((*q)->type()) : inputTypeToString((*q)->type()); - H << typeString; + + C << nl << opName << "CB->ice_response("; + if(ret) + { + C << result; + } + for(q = paramList.begin(); q != paramList.end(); ++q) + { + if((*q)->isOutParam()) + { + if(ret || q != paramList.begin()) + { + C << ", "; + } + C << fixKwd((*q)->name()); + } + } + C << ");"; + + C << eb; } - if(!p->isLocal()) + else { - if(!paramList.empty()) + H << sp << nl << "virtual " << retS << ' ' << opName << '('; + H.useCurrentPosAsIndent(); + ParamDeclList paramList = op->parameters(); + ParamDeclList::const_iterator q; + for(q = paramList.begin(); q != paramList.end(); ++q) { - H << ',' << nl; + if(q != paramList.begin()) + { + H << ',' << nl; + } + string typeString = (*q)->isOutParam() ? + outputTypeToString((*q)->type()) : inputTypeToString((*q)->type()); + H << typeString; } - H << "const Ice::Current&"; - } - H.restoreIndent(); + if(!p->isLocal()) + { + if(!paramList.empty()) + { + H << ',' << nl; + } + H << "const Ice::Current&"; + } + H.restoreIndent(); - bool nonmutating = op->mode() == Operation::Nonmutating; + bool nonmutating = op->mode() == Operation::Nonmutating; - H << ")" << (nonmutating ? " const" : "") << ";"; + H << ")" << (nonmutating ? " const" : "") << ";"; - C << sp << nl << retS << nl << scoped.substr(2) << "I::" << opName << '('; - C.useCurrentPosAsIndent(); - for(q = paramList.begin(); q != paramList.end(); ++q) - { - if(q != paramList.begin()) + C << sp << nl << retS << nl << scoped.substr(2) << "I::" << opName << '('; + C.useCurrentPosAsIndent(); + for(q = paramList.begin(); q != paramList.end(); ++q) { - C << ',' << nl; + if(q != paramList.begin()) + { + C << ',' << nl; + } + string typeString = (*q)->isOutParam() ? + outputTypeToString((*q)->type()) : inputTypeToString((*q)->type()); + C << typeString << ' ' << fixKwd((*q)->name()); } - string typeString = (*q)->isOutParam() ? - outputTypeToString((*q)->type()) : inputTypeToString((*q)->type()); - C << typeString << ' ' << fixKwd((*q)->name()); - } - if(!p->isLocal()) - { - if(!paramList.empty()) + if(!p->isLocal()) { - C << ',' << nl; + if(!paramList.empty()) + { + C << ',' << nl; + } + C << "const Ice::Current& current"; + } + C.restoreIndent(); + C << ")" << (nonmutating ? " const" : ""); + C << sb; + + // + // Return value + // + if(ret) + { + writeReturn(C, ret); } - C << "const Ice::Current& current"; - } - C.restoreIndent(); - C << ")" << (nonmutating ? " const" : ""); - C << sb; - // - // Return value - // - if(ret) - { - writeReturn(C, ret); + C << eb; } - - C << eb; } H << eb << ';'; |