summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-11-09 09:11:10 +0100
committerBenoit Foucher <benoit@zeroc.com>2012-11-09 09:11:10 +0100
commit184da87329e27c001fdebdaa88511aa71826f4c6 (patch)
tree8b8de8d493936961de56cdb449ef015c860834ad /cpp/src
parentFixed ICE-4928 - GUI Login issues (diff)
downloadice-184da87329e27c001fdebdaa88511aa71826f4c6.tar.bz2
ice-184da87329e27c001fdebdaa88511aa71826f4c6.tar.xz
ice-184da87329e27c001fdebdaa88511aa71826f4c6.zip
Java and C# fix for ICE-4930, invalid 1.0 marhsaling of pending objects
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/slice2cpp/Gen.cpp20
-rw-r--r--cpp/src/slice2cs/Gen.cpp38
-rw-r--r--cpp/src/slice2java/Gen.cpp43
3 files changed, 101 insertions, 0 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index ac7058fc64b..f7e0f4b615f 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -2237,6 +2237,10 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __result->__startReadParams();";
writeUnmarshalCode(C, outParams, p, _useWstring | TypeContextAMIEnd);
+ if(p->returnsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
C << nl << "__result->__endReadParams();";
}
else
@@ -2303,6 +2307,10 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __result->__startReadParams();";
writeUnmarshalCode(C, outParams, p, _useWstring | TypeContextAMIPrivateEnd);
+ if(p->returnsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
C << nl << "__result->__endReadParams();";
}
else
@@ -2807,6 +2815,10 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __og.startReadParams();";
writeUnmarshalCode(C, outParams, p);
+ if(p->returnsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
C << nl << "__og.endReadParams();";
}
else
@@ -4260,6 +4272,10 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __is = __inS.startReadParams();";
writeAllocateCode(C, inParams, 0, _useWstring | TypeContextInParam);
writeUnmarshalCode(C, inParams, 0, TypeContextInParam);
+ if(p->sendsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
C << nl << "__inS.endReadParams();";
}
else
@@ -4318,6 +4334,10 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __is = __inS.startReadParams();";
writeAllocateCode(C, inParams, 0, _useWstring | TypeContextInParam);
writeUnmarshalCode(C, inParams, 0, TypeContextInParam);
+ if(p->sendsClasses())
+ {
+ C << nl << "__is->readPendingObjects();";
+ }
C << nl << "__inS.endReadParams();";
}
else
diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp
index b32125284b9..3e6290ad7c8 100644
--- a/cpp/src/slice2cs/Gen.cpp
+++ b/cpp/src/slice2cs/Gen.cpp
@@ -870,6 +870,10 @@ Slice::CsVisitor::writeDispatchAndMarshalling(const ClassDefPtr& p, bool stream)
}
}
writeMarshalUnmarshalParams(inParams, 0, false);
+ if(op->sendsClasses())
+ {
+ _out << nl << "is__.readPendingObjects();";
+ }
_out << nl << "inS__.endReadParams();";
}
else
@@ -940,6 +944,10 @@ Slice::CsVisitor::writeDispatchAndMarshalling(const ClassDefPtr& p, bool stream)
_out << nl << "IceInternal.BasicStream os__ = inS__.startWriteParams__("
<< opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(outParams, op, true);
+ if(op->returnsClasses())
+ {
+ _out << nl << "os__.writePendingObjects();";
+ }
_out << nl << "inS__.endWriteParams__(true);";
}
else
@@ -3600,6 +3608,16 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
_out << eb;
}
+ if((!base || (base && !base->usesClasses())) && p->usesClasses())
+ {
+ _out << sp;
+ emitGeneratedCodeAttribute();
+ _out << nl << "public override bool usesClasses__()";
+ _out << sb;
+ _out << nl << "return true;";
+ _out << eb;
+ }
+
if(preserved && !basePreserved)
{
_out << sp << nl << "protected Ice.SlicedData slicedData__;";
@@ -4975,6 +4993,10 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(outParams, op, false);
+ if(op->returnsClasses())
+ {
+ _out << nl << "is__.readPendingObjects();";
+ }
_out << nl << "outAsync__.endReadParams__();";
writePostUnmarshalParams(outParams, op);
if(ret)
@@ -5038,6 +5060,10 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
_out << nl << "IceInternal.BasicStream os__ = result__.startWriteParams__("
<< opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(inParams, 0, true);
+ if(op->sendsClasses())
+ {
+ _out << nl << "os__.writePendingObjects();";
+ }
_out << nl << "result__.endWriteParams__();";
}
else
@@ -5921,6 +5947,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
_out << sb;
_out << nl << "IceInternal.BasicStream os__ = og__.startWriteParams(" << opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(inParams, 0, true);
+ if(op->sendsClasses())
+ {
+ _out << nl << "os__.writePendingObjects();";
+ }
_out << nl << "og__.endWriteParams();";
_out << eb;
_out << nl << "catch(Ice.LocalException ex__)";
@@ -6019,6 +6049,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(outParams, op, false);
+ if(op->returnsClasses())
+ {
+ _out << nl << "is__.readPendingObjects();";
+ }
_out << nl << "og__.endReadParams();";
writePostUnmarshalParams(outParams, op);
}
@@ -6539,6 +6573,10 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
_out << sb;
_out << nl << "IceInternal.BasicStream os__ = startWriteParams__(" << opFormatTypeToString(p) << ");";
writeMarshalUnmarshalParams(outParams, p, true);
+ if(p->returnsClasses())
+ {
+ _out << nl << "os__.writePendingObjects();";
+ }
_out << nl << "endWriteParams__(true);";
_out << eb;
_out << nl << "catch(Ice.LocalException ex__)";
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index 521b6cc2a93..e5dc96633cc 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -991,6 +991,10 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
}
iter = 0;
writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
+ if(op->sendsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
out << nl << "__inS.endReadParams();";
}
else
@@ -1052,6 +1056,10 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
out << nl << "IceInternal.BasicStream __os = __inS.__startWriteParams("
<< opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(out, package, outParams, op, iter, true, optionalMapping, true);
+ if(op->returnsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "__inS.__endWriteParams(true);";
}
else
@@ -1126,6 +1134,10 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
}
}
writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
+ if(op->sendsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
out << nl << "__inS.endReadParams();";
}
else
@@ -3354,6 +3366,17 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
out << eb;
}
+ if(p->usesClasses())
+ {
+ if(!base || (base && !base->usesClasses()))
+ {
+ out << sp << nl << "public boolean" << nl << "__usesClasses()";
+ out << sb;
+ out << nl << "return true;";
+ out << eb;
+ }
+ }
+
if(preserved && !basePreserved)
{
out << sp << nl << "protected Ice.SlicedData __slicedData;";
@@ -4450,6 +4473,10 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(out, package, pl, 0, iter, true, optionalMapping);
+ if(op->sendsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "__result.__endWriteParams();";
}
else
@@ -4525,6 +4552,10 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(out, package, pl, op, iter, false, true);
+ if(op->returnsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
out << nl << "__result.__endReadParams();";
}
else
@@ -5454,6 +5485,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
out << sb;
out << nl << "IceInternal.BasicStream __os = __og.startWriteParams(" << opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(out, package, inParams, 0, iter, true, optionalMapping);
+ if(op->sendsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "__og.endWriteParams();";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";
@@ -5497,6 +5532,10 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
{
out << nl << "IceInternal.BasicStream __is = __og.startReadParams();";
writeMarshalUnmarshalParams(out, package, outParams, op, iter, false, true);
+ if(op->returnsClasses())
+ {
+ out << nl << "__is.readPendingObjects();";
+ }
out << nl << "__og.endReadParams();";
}
else
@@ -6563,6 +6602,10 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
out << nl << "IceInternal.BasicStream __os = this.__startWriteParams("
<< opFormatTypeToString(p) << ");";
writeMarshalUnmarshalParams(out, classPkg, outParams, p, iter, true, optionalMapping, false);
+ if(p->returnsClasses())
+ {
+ out << nl << "__os.writePendingObjects();";
+ }
out << nl << "this.__endWriteParams(true);";
out << eb;
out << nl << "catch(Ice.LocalException __ex)";