diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-02-17 19:52:54 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-02-17 19:52:54 +0000 |
commit | b983e221b855b7fbea5634c51fb698785a4f05d0 (patch) | |
tree | 81bf06ea8a4239984a304502c13d8bab43cce25a /cpp/src/slice2javae/Gen.cpp | |
parent | Fixed up project files to reduce size (diff) | |
download | ice-b983e221b855b7fbea5634c51fb698785a4f05d0.tar.bz2 ice-b983e221b855b7fbea5634c51fb698785a4f05d0.tar.xz ice-b983e221b855b7fbea5634c51fb698785a4f05d0.zip |
Got rid of the Delegate
Diffstat (limited to 'cpp/src/slice2javae/Gen.cpp')
-rw-r--r-- | cpp/src/slice2javae/Gen.cpp | 259 |
1 files changed, 87 insertions, 172 deletions
diff --git a/cpp/src/slice2javae/Gen.cpp b/cpp/src/slice2javae/Gen.cpp index b43c0f1049d..9aa17daedda 100644 --- a/cpp/src/slice2javae/Gen.cpp +++ b/cpp/src/slice2javae/Gen.cpp @@ -732,9 +732,6 @@ Slice::Gen::generate(const UnitPtr& p) ProxyVisitor proxyVisitor(_dir); p->visit(&proxyVisitor, false); - DelegateVisitor delegateVisitor(_dir); - p->visit(&delegateVisitor, false); - DispatcherVisitor dispatcherVisitor(_dir); p->visit(&dispatcherVisitor, false); } @@ -2155,15 +2152,33 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p) for(r = ops.begin(); r != ops.end(); ++r) { OperationPtr op = *r; + StringList opMetaData = op->getMetaData(); ContainerPtr container = op->container(); ClassDefPtr cl = ClassDefPtr::dynamicCast(container); string opName = fixKwd(op->name()); TypePtr ret = op->returnType(); string retS = typeToString(ret, TypeModeReturn, package, op->getMetaData()); + int iter; vector<string> params = getParams(op, package); vector<string> args = getArgs(op); + ParamDeclList inParams; + ParamDeclList outParams; + ParamDeclList paramList = op->parameters(); + ParamDeclList::const_iterator pli; + for(pli = paramList.begin(); pli != paramList.end(); ++pli) + { + if((*pli)->isOutParam()) + { + outParams.push_back(*pli); + } + else + { + inParams.push_back(*pli); + } + } + ExceptionList throws = op->throws(); throws.sort(); throws.unique(); @@ -2197,19 +2212,81 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p) { out << nl << "__checkTwowayOnly(\"" << opName << "\");"; } - out << nl << "Ice._ObjectDel __delBase = __getDelegate();"; - out << nl << '_' << name << "Del __del = (_" << name << "Del)__delBase;"; - out << nl; + out << nl << "__checkConnection();"; + out << nl << "IceInternal.Outgoing __og = _connection.getOutgoing(_reference, \"" << op->name() << "\", " + << sliceModeToIceMode(op) << ", __ctx);"; + out << nl << "try"; + out << sb; + if(!inParams.empty()) + { + out << nl << "try"; + out << sb; + out << nl << "IceInternal.BasicStream __os = __og.os();"; + iter = 0; + for(pli = inParams.begin(); pli != inParams.end(); ++pli) + { + writeMarshalUnmarshalCode(out, package, (*pli)->type(), fixKwd((*pli)->name()), true, iter, false, + (*pli)->getMetaData()); + } + out << eb; + out << nl << "catch(Ice.LocalException __ex)"; + out << sb; + out << nl << "__og.abort(__ex);"; + out << eb; + } + out << nl << "boolean __ok = __og.invoke();"; + out << nl << "try"; + out << sb; + out << nl << "IceInternal.BasicStream __is = __og.is();"; + out << nl << "if(!__ok)"; + out << sb; + out << nl << "try"; + out << sb; + out << nl << "__is.throwException();"; + out << eb; + for(ExceptionList::const_iterator t = throws.begin(); t != throws.end(); ++t) + { + out << nl << "catch(" << getAbsolute(*t, package) << " __ex)"; + out << sb; + out << nl << "throw __ex;"; + out << eb; + } + out << nl << "catch(Ice.UserException __ex)"; + out << sb; + out << nl << "Ice.UnknownUserException __uex = new Ice.UnknownUserException();"; + out << nl << "__uex.unknown = __ex.ice_name();"; + out << nl << "throw __uex;"; + out << eb; + out << eb; + for(pli = outParams.begin(); pli != outParams.end(); ++pli) + { + writeMarshalUnmarshalCode(out, package, (*pli)->type(), fixKwd((*pli)->name()), false, iter, true, + (*pli)->getMetaData()); + } if(ret) { - out << "return "; + out << nl << retS << " __ret;"; + writeMarshalUnmarshalCode(out, package, ret, "__ret", false, iter, false, opMetaData); } - out << "__del." << opName << spar << args << "__ctx" << epar << ';'; - if(!ret) + if(ret) { - out << nl << "return;"; + out << nl << "return __ret;"; } out << eb; + out << nl << "catch(Ice.LocalException __ex)"; + out << sb; + out << nl << "throw new IceInternal.NonRepeatable(__ex);"; + out << eb; + out << eb; + out << nl << "finally"; + out << sb; + out << nl << "_connection.reclaimOutgoing(__og);"; + out << eb; + if(!ret) + { + out << nl << "return ;"; + } + out << eb; out << nl << "catch(IceInternal.NonRepeatable __ex)"; out << sb; if(op->mode() == Operation::Idempotent || op->mode() == Operation::Nonmutating) @@ -2343,11 +2420,6 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p) out << nl << "return d;"; out << eb; - out << sp << nl << "protected Ice._ObjectDel" << nl << "__createDelegate()"; - out << sb; - out << nl << "return new _" << name << "Del();"; - out << eb; - out << sp << nl << "public static void" << nl << "__write(IceInternal.BasicStream __os, " << name << "Prx v)"; out << sb; out << nl << "__os.writeProxy(v);"; @@ -2744,163 +2816,6 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p) out << ';'; } -Slice::Gen::DelegateVisitor::DelegateVisitor(const string& dir) : - JavaVisitor(dir) -{ -} - -bool -Slice::Gen::DelegateVisitor::visitClassDefStart(const ClassDefPtr& p) -{ - if(p->isLocal()) - { - return false; - } - - string name = p->name(); - ClassList bases = p->bases(); - string package = getPackage(p); - string absolute = getAbsolute(p, "", "_", "Del"); - - if(!open(absolute)) - { - return false; - } - - Output& out = output(); - - out << sp << nl << "public final class _" << name << "Del extends Ice._ObjectDel"; - out << sb; - - OperationList ops = p->allOperations(); - - OperationList::const_iterator r; - for(r = ops.begin(); r != ops.end(); ++r) - { - OperationPtr op = *r; - StringList opMetaData = op->getMetaData(); - string opName = fixKwd(op->name()); - TypePtr ret = op->returnType(); - string retS = typeToString(ret, TypeModeReturn, package, opMetaData); - int iter; - - ParamDeclList inParams; - ParamDeclList outParams; - ParamDeclList paramList = op->parameters(); - ParamDeclList::const_iterator pli; - for(pli = paramList.begin(); pli != paramList.end(); ++pli) - { - if((*pli)->isOutParam()) - { - outParams.push_back(*pli); - } - else - { - inParams.push_back(*pli); - } - } - - ExceptionList throws = op->throws(); - throws.sort(); - throws.unique(); - - // - // Arrange exceptions into most-derived to least-derived order. If we don't - // do this, a base exception handler can appear before a derived exception - // handler, causing compiler warnings and resulting in the base exception - // being marshaled instead of the derived exception. - // -#if defined(__SUNPRO_CC) - throws.sort(Slice::derivedToBaseCompare); -#else - throws.sort(Slice::DerivedToBaseCompare()); -#endif - - vector<string> params = getParams(op, package); - - out << sp; - out << nl << "public " << retS << nl << opName << spar << params << "java.util.Hashtable __ctx" << epar; - writeDelegateThrowsClause(package, throws); - out << sb; - - out << nl << "IceInternal.Outgoing __og = __connection.getOutgoing(__reference, \"" << op->name() << "\", " - << sliceModeToIceMode(op) << ", __ctx);"; - out << nl << "try"; - out << sb; - if(!inParams.empty()) - { - out << nl << "try"; - out << sb; - out << nl << "IceInternal.BasicStream __os = __og.os();"; - iter = 0; - for(pli = inParams.begin(); pli != inParams.end(); ++pli) - { - writeMarshalUnmarshalCode(out, package, (*pli)->type(), fixKwd((*pli)->name()), true, iter, false, - (*pli)->getMetaData()); - } - out << eb; - out << nl << "catch(Ice.LocalException __ex)"; - out << sb; - out << nl << "__og.abort(__ex);"; - out << eb; - } - out << nl << "boolean __ok = __og.invoke();"; - out << nl << "try"; - out << sb; - out << nl << "IceInternal.BasicStream __is = __og.is();"; - out << nl << "if(!__ok)"; - out << sb; - out << nl << "try"; - out << sb; - out << nl << "__is.throwException();"; - out << eb; - for(ExceptionList::const_iterator t = throws.begin(); t != throws.end(); ++t) - { - out << nl << "catch(" << getAbsolute(*t, package) << " __ex)"; - out << sb; - out << nl << "throw __ex;"; - out << eb; - } - out << nl << "catch(Ice.UserException __ex)"; - out << sb; - out << nl << "Ice.UnknownUserException __uex = new Ice.UnknownUserException();"; - out << nl << "__uex.unknown = __ex.ice_name();"; - out << nl << "throw __uex;"; - out << eb; - out << eb; - for(pli = outParams.begin(); pli != outParams.end(); ++pli) - { - writeMarshalUnmarshalCode(out, package, (*pli)->type(), fixKwd((*pli)->name()), false, iter, true, - (*pli)->getMetaData()); - } - if(ret) - { - out << nl << retS << " __ret;"; - writeMarshalUnmarshalCode(out, package, ret, "__ret", false, iter, false, opMetaData); - } - if(ret) - { - out << nl << "return __ret;"; - } - out << eb; - out << nl << "catch(Ice.LocalException __ex)"; - out << sb; - out << nl << "throw new IceInternal.NonRepeatable(__ex);"; - out << eb; - out << eb; - out << nl << "finally"; - out << sb; - out << nl << "__connection.reclaimOutgoing(__og);"; - out << eb; - out << eb; - } - - out << eb; - close(); - - return false; -} - Slice::Gen::DispatcherVisitor::DispatcherVisitor(const string& dir) : JavaVisitor(dir) { |