summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cpp/Gen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rwxr-xr-xcpp/src/slice2cpp/Gen.cpp95
1 files changed, 68 insertions, 27 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index bb88118354c..d68c2f4d8c2 100755
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -2622,17 +2622,22 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
C << nl << "__og.abort(__ex);";
C << eb;
}
+
C << nl << "bool __ok = __og.invoke();";
+ if(!p->returnsData())
+ {
+ C << nl << "if(!__og.is()->b.empty())";
+ C << sb;
+ }
C << nl << "try";
C << sb;
- C << nl << "::IceInternal::BasicStream* __is = __og.is();";
C << nl << "if(!__ok)";
C << sb;
C << nl << "try";
C << sb;
- C << nl << "__is->throwException();";
+ C << nl << "__og.throwUserException();";
C << eb;
-
+
//
// Generate a catch block for each legal user exception. This is necessary
// to prevent an "impossible" user exception to be thrown if client and
@@ -2686,11 +2691,23 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
C << nl << fixKwd((*opi)->name()) << " = new " << fixKwd(st->scoped()) << ";";
}
}
- writeUnmarshalCode(C, outParams, ret, p->getMetaData());
- if(p->returnsClasses())
+
+ if(p->returnsData())
+ {
+ C << nl << "::IceInternal::BasicStream* __is = __og.is();";
+ C << nl << "__is->startReadEncaps();";
+ writeUnmarshalCode(C, outParams, ret, p->getMetaData());
+ if(p->returnsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
+ C << nl << "__is->endReadEncaps();";
+ }
+ else
{
- C << nl << "__is->readPendingObjects();";
+ C << nl << "__og.is()->skipEmptyEncaps();";
}
+
if(ret)
{
C << nl << "return __ret;";
@@ -2700,6 +2717,10 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
C << sb;
C << nl << "throw ::IceInternal::LocalExceptionWrapper(__ex, false);";
C << eb;
+ if(!p->returnsData())
+ {
+ C << eb;
+ }
C << eb;
}
@@ -3991,11 +4012,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << sp;
C << nl << "::Ice::DispatchStatus" << nl << scope.substr(2) << "___" << name
- << "(::IceInternal::Incoming&";
- if(!paramList.empty() || !p->throws().empty() || ret || amd)
- {
- C << "__inS";
- }
+ << "(::IceInternal::Incoming& __inS";
C << ", const ::Ice::Current& __current)" << (isConst ? " const" : "");
C << sb;
if(!amd)
@@ -4022,16 +4039,23 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
if(!inParams.empty())
{
C << nl << "::IceInternal::BasicStream* __is = __inS.is();";
+ C << nl << "__is->startReadEncaps();";
+ writeAllocateCode(C, inParams, 0, StringList(), _useWstring, true);
+ writeUnmarshalCode(C, inParams, 0, StringList(), true);
+ if(p->sendsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
+ C << nl << "__is->endReadEncaps();";
}
- if(ret || !outParams.empty() || !throws.empty())
+ else
{
- C << nl << "::IceInternal::BasicStream* __os = __inS.os();";
+ C << nl << "__inS.is()->skipEmptyEncaps();";
}
- writeAllocateCode(C, inParams, 0, StringList(), _useWstring, true);
- writeUnmarshalCode(C, inParams, 0, StringList(), true);
- if(p->sendsClasses())
+
+ if(ret || !outParams.empty() || !throws.empty())
{
- C << nl << "__is->readPendingObjects();";
+ C << nl << "::IceInternal::BasicStream* __os = __inS.os();";
}
writeAllocateCode(C, outParams, 0, StringList(), _useWstring);
if(!throws.empty())
@@ -4063,6 +4087,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << eb;
}
}
+
C << nl << "return ::Ice::DispatchOK;";
}
else
@@ -4072,13 +4097,20 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
if(!inParams.empty())
{
C << nl << "::IceInternal::BasicStream* __is = __inS.is();";
+ C << nl << "__is->startReadEncaps();";
+ writeAllocateCode(C, inParams, 0, StringList(), _useWstring, true);
+ writeUnmarshalCode(C, inParams, 0, StringList(), true);
+ if(p->sendsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
+ C << nl << "__is->endReadEncaps();";
}
- writeAllocateCode(C, inParams, 0, StringList(), _useWstring, true);
- writeUnmarshalCode(C, inParams, 0, StringList(), true);
- if(p->sendsClasses())
+ else
{
- C << nl << "__is->readPendingObjects();";
+ C << nl << "__inS.is()->skipEmptyEncaps();";
}
+
C << nl << classScopedAMD << '_' << name << "Ptr __cb = new IceAsync" << classScopedAMD << '_' << name
<< "(__inS);";
C << nl << "try";
@@ -5247,7 +5279,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
C << sb;
C << nl << "try";
C << sb;
- C << nl << "__is->throwException();";
+ C << nl << "__throwUserException();";
C << eb;
//
// Generate a catch block for each legal user exception.
@@ -5276,14 +5308,23 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
C << nl << "return;";
C << eb;
- writeUnmarshalCode(C, outParams, 0, StringList(), true);
- if(ret)
+ if(p->returnsData())
{
- writeMarshalUnmarshalCode(C, ret, "__ret", false, "", true, p->getMetaData(), true);
+ C << nl << "__is->startReadEncaps();";
+ writeUnmarshalCode(C, outParams, 0, StringList(), true);
+ if(ret)
+ {
+ writeMarshalUnmarshalCode(C, ret, "__ret", false, "", true, p->getMetaData(), true);
+ }
+ if(p->returnsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
+ C << nl << "__is->endReadEncaps();";
}
- if(p->returnsClasses())
+ else
{
- C << nl << "__is->readPendingObjects();";
+ C << nl << "__is->skipEmptyEncaps();";
}
C << eb;
C << nl << "catch(const ::Ice::LocalException& __ex)";