diff options
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 182 |
1 files changed, 157 insertions, 25 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 1a57af21eb3..3423e08224a 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -246,6 +246,9 @@ Slice::Gen::generate(const UnitPtr& unit) AsyncVisitor asyncVisitor(H, C, _dllExport); unit->visit(&asyncVisitor); + AsyncImplVisitor asyncImplVisitor(H, C, _dllExport); + unit->visit(&asyncImplVisitor); + ProxyVisitor proxyVisitor(H, C, _dllExport); unit->visit(&proxyVisitor); @@ -1240,12 +1243,12 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p) ContainerPtr container = p->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); - string className = "AMI_" + fixKwd(cl->name()); + string classNameAMI = "AMI_" + fixKwd(cl->name()); string classScope = fixKwd(cl->scope()); - string classScoped = classScope + className; + string classScopedAMI = classScope + classNameAMI; - string paramsAMI = "(const " + classScoped + '_' + name + "Ptr&, "; - string paramsDeclAMI = "(const " + classScoped + '_' + name + "Ptr& __cb, "; // With declarators + string paramsAMI = "(const " + classScopedAMI + '_' + name + "Ptr&, "; + string paramsDeclAMI = "(const " + classScopedAMI + '_' + name + "Ptr& __cb, "; // With declarators string argsAMI = "(__cb, "; ParamDeclList paramList = p->parameters(); @@ -1455,11 +1458,11 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p) ContainerPtr container = p->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); - string className = "AMI_" + fixKwd(cl->name()); + string classNameAMI = "AMI_" + fixKwd(cl->name()); string classScope = fixKwd(cl->scope()); - string classScoped = classScope + className; + string classScopedAMI = classScope + classNameAMI; - string paramsAMI = "(const " + classScoped + '_' + name + "Ptr&, "; + string paramsAMI = "(const " + classScopedAMI + '_' + name + "Ptr&, "; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) @@ -1594,12 +1597,12 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p) ContainerPtr container = p->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); - string className = "AMI_" + fixKwd(cl->name()); + string classNameAMI = "AMI_" + fixKwd(cl->name()); string classScope = fixKwd(cl->scope()); - string classScoped = classScope + className; + string classScopedAMI = classScope + classNameAMI; - string paramsAMI = "(const " + classScoped + '_' + name + "Ptr&, "; - string paramsDeclAMI = "(const " + classScoped + '_' + name + "Ptr& __cb, "; // With declarators + string paramsAMI = "(const " + classScopedAMI + '_' + name + "Ptr&, "; + string paramsDeclAMI = "(const " + classScopedAMI + '_' + name + "Ptr& __cb, "; // With declarators TypeStringList inParams; TypeStringList outParams; @@ -1834,11 +1837,11 @@ Slice::Gen::DelegateDVisitor::visitOperation(const OperationPtr& p) ContainerPtr container = p->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); - string className = "AMI_" + fixKwd(cl->name()); + string classNameAMI = "AMI_" + fixKwd(cl->name()); string classScope = fixKwd(cl->scope()); - string classScoped = classScope + className; + string classScopedAMI = classScope + classNameAMI; - string paramsAMI = "(const " + classScoped + '_' + name + "Ptr&, "; + string paramsAMI = "(const " + classScopedAMI + '_' + name + "Ptr&, "; ParamDeclList paramList = p->parameters(); for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) @@ -2361,12 +2364,12 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) ContainerPtr container = p->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); - string className = "AMD_" + fixKwd(cl->name()); + string classNameAMD = "AMD_" + fixKwd(cl->name()); string classScope = fixKwd(cl->scope()); - string classScoped = classScope + className; + string classScopedAMD = classScope + classNameAMD; - string paramsAMD = "(const " + classScoped + '_' + name + "Ptr&, "; - string paramsDeclAMD = "(const " + classScoped + '_' + name + "Ptr& __cb, "; // With declarators + string paramsAMD = "(const " + classScopedAMD + '_' + name + "Ptr&, "; + string paramsDeclAMD = "(const " + classScopedAMD + '_' + name + "Ptr& __cb, "; // With declarators string argsAMD = "(__cb, "; TypeStringList inParams; @@ -2523,7 +2526,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p) } writeAllocateCode(C, inParams, 0); writeUnmarshalCode(C, inParams, 0); - C << nl << classScoped << '_' << name << "Ptr __cb = new " << classScoped << '_' << name << "(__in);"; + C << nl << classScopedAMD << '_' << name << "Ptr __cb = new ::IceAsync" << classScopedAMD << '_' << name + << "(__in);"; C << nl << name << "_async" << argsAMD << ';'; C << nl << "return ::IceInternal::DispatchAsync;"; } @@ -3242,7 +3246,136 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) if(cl->hasMetaData("amd") || p->hasMetaData("amd")) { H << sp << nl << "class " << _dllExport << classNameAMD << '_' << name - << " : public ::IceInternal::IncomingAsync"; + << " : virtual public ::IceUtil::Shared"; + H << sb; + H.dec(); + H << nl << "public:"; + H.inc(); + H << sp; + H << nl << "virtual void ice_response(" << params << ") = 0;"; + H << nl << "virtual void ice_exception(const ::Ice::Exception&) = 0;"; + H << eb << ';'; + H << sp << nl << "typedef ::IceUtil::Handle< " << classScopedAMD << '_' << name << "> " + << classNameAMD << '_' << name << "Ptr;"; + } +} + +Slice::Gen::AsyncImplVisitor::AsyncImplVisitor(Output& h, Output& c, const string& dllExport) : + H(h), C(c), _dllExport(dllExport) +{ +} + +bool +Slice::Gen::AsyncImplVisitor::visitUnitStart(const UnitPtr& p) +{ + if(!p->hasNonLocalClassDecls() || (/*!p->hasContentsWithMetaData("ami") &&*/ !p->hasContentsWithMetaData("amd"))) + { + return false; + } + + H << sp << nl << "namespace IceAsync" << nl << '{'; + + return true; +} + +void +Slice::Gen::AsyncImplVisitor::visitUnitEnd(const UnitPtr& p) +{ + H << sp << nl << '}'; +} + +bool +Slice::Gen::AsyncImplVisitor::visitModuleStart(const ModulePtr& p) +{ + if(!p->hasNonLocalClassDecls() || (!p->hasContentsWithMetaData("ami") && !p->hasContentsWithMetaData("ami"))) + { + return false; + } + + string name = fixKwd(p->name()); + + H << sp << nl << "namespace " << name << nl << '{'; + + return true; +} + +void +Slice::Gen::AsyncImplVisitor::visitModuleEnd(const ModulePtr& p) +{ + H << sp << nl << '}'; +} + +void +Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p) +{ + ContainerPtr container = p->container(); + ClassDefPtr cl = ClassDefPtr::dynamicCast(container); + + if(cl->isLocal() || + (/*!cl->hasMetaData("ami") && !p->hasMetaData("ami") &&*/ !cl->hasMetaData("amd") && !p->hasMetaData("amd"))) + { + return; + } + + string name = fixKwd(p->name()); + +// string classNameAMI = "AMI_" + fixKwd(cl->name()); + string classNameAMD = "AMD_" + fixKwd(cl->name()); + string classScope = fixKwd(cl->scope()); +// string classScopedAMI = classScope + classNameAMI; + string classScopedAMD = classScope + classNameAMD; + + string params; + string paramsDecl; // With declarators + string args; + + ExceptionList throws = p->throws(); + throws.sort(); + throws.unique(); + + TypePtr ret = p->returnType(); + string retS = inputTypeToString(ret); + + if(ret) + { + params += retS; + paramsDecl += retS; + paramsDecl += ' '; + paramsDecl += "__ret"; + args += "__ret"; + } + + TypeStringList outParams; + ParamDeclList paramList = p->parameters(); + for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q) + { + if((*q)->isOutParam()) + { + string name = fixKwd((*q)->name()); + TypePtr type = (*q)->type(); + string typeString = inputTypeToString(type); + + if(ret || !outParams.empty()) + { + params += ", "; + paramsDecl += ", "; + args += ", "; + } + + params += typeString; + paramsDecl += typeString; + paramsDecl += ' '; + paramsDecl += name; + args += name; + + outParams.push_back(make_pair(type, name)); + } + } + + if(cl->hasMetaData("amd") || p->hasMetaData("amd")) + { + H << sp << nl << "class " << _dllExport << classNameAMD << '_' << name + << " : public " << classScopedAMD << '_' << name << ", public ::IceInternal::IncomingAsync"; H << sb; H.dec(); H << nl << "public:"; @@ -3253,10 +3386,8 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) H << nl << "virtual void ice_response(" << params << ");"; H << nl << "virtual void ice_exception(const ::Ice::Exception&);"; H << eb << ';'; - H << sp << nl << "typedef ::IceUtil::Handle< " << classScopedAMD << '_' << name << "> " - << classNameAMD << '_' << name << "Ptr;"; - C << sp << nl << classScopedAMD << '_' << name << "::" << classNameAMD << '_' << name + C << sp << nl << "::IceAsync" << classScopedAMD << '_' << name << "::" << classNameAMD << '_' << name << "(::IceInternal::Incoming& in) :"; C.inc(); C << nl << "IncomingAsync(in)"; @@ -3264,7 +3395,8 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) C << sb; C << eb; - C << sp << nl << "void" << nl << classScopedAMD << '_' << name << "::ice_response(" << paramsDecl << ')'; + C << sp << nl << "void" << nl << "::IceAsync" << classScopedAMD << '_' << name << "::ice_response(" + << paramsDecl << ')'; C << sb; if(ret || !outParams.empty()) { @@ -3282,7 +3414,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p) C << nl << "__response(true);"; C << eb; - C << sp << nl << "void" << nl << classScopedAMD << '_' << name + C << sp << nl << "void" << nl << "::IceAsync" << classScopedAMD << '_' << name << "::ice_exception(const ::Ice::Exception& ex)"; C << sb; if(throws.empty()) |