summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Stream.h6
-rw-r--r--cpp/include/Slice/Parser.h6
-rw-r--r--cpp/src/Ice/Stream.cpp12
-rw-r--r--cpp/src/Slice/Parser.cpp16
-rw-r--r--cpp/src/slice2cpp/Gen.cpp22
-rw-r--r--cpp/src/slice2cs/Gen.cpp16
-rw-r--r--cpp/src/slice2java/Gen.cpp20
-rw-r--r--cpp/test/Ice/objects/AllTests.cpp2
-rw-r--r--cpp/test/Ice/objects/TestI.cpp1
-rw-r--r--cpp/test/Ice/optional/AllTests.cpp28
-rw-r--r--cpp/test/Ice/optional/Test.ice5
-rw-r--r--cpp/test/Ice/optional/TestI.cpp11
-rw-r--r--cpp/test/Ice/optional/TestI.h4
13 files changed, 107 insertions, 42 deletions
diff --git a/cpp/include/Ice/Stream.h b/cpp/include/Ice/Stream.h
index b9119787ecb..67dd4610343 100644
--- a/cpp/include/Ice/Stream.h
+++ b/cpp/include/Ice/Stream.h
@@ -63,6 +63,7 @@ public:
~UserExceptionReader() throw();
virtual void read(const InputStreamPtr&) const = 0;
+ virtual bool usesClasses() const = 0;
virtual ::std::string ice_name() const = 0;
virtual UserException* ice_clone() const = 0;
@@ -71,6 +72,8 @@ public:
virtual void __write(IceInternal::BasicStream*) const;
virtual void __read(IceInternal::BasicStream*);
+ virtual bool __usesClasses() const;
+
#ifdef __SUNPRO_CC
using UserException::__read;
using UserException::__write;
@@ -402,6 +405,7 @@ public:
~UserExceptionWriter() throw();
virtual void write(const OutputStreamPtr&) const = 0;
+ virtual bool usesClasses() const = 0;
virtual ::std::string ice_name() const = 0;
virtual UserException* ice_clone() const = 0;
@@ -410,6 +414,8 @@ public:
virtual void __write(IceInternal::BasicStream*) const;
virtual void __read(IceInternal::BasicStream*);
+ virtual bool __usesClasses() const;
+
#ifdef __SUNPRO_CC
using UserException::__read;
using UserException::__write;
diff --git a/cpp/include/Slice/Parser.h b/cpp/include/Slice/Parser.h
index 3c24cdcf520..38c27bd3b14 100644
--- a/cpp/include/Slice/Parser.h
+++ b/cpp/include/Slice/Parser.h
@@ -601,8 +601,8 @@ public:
void setExceptionList(const ExceptionList&);
virtual ContainedType containedType() const;
virtual bool uses(const ContainedPtr&) const;
- bool sendsClasses() const;
- bool returnsClasses() const;
+ bool sendsClasses(bool) const;
+ bool returnsClasses(bool) const;
bool returnsData() const;
int attributes() const;
FormatType format() const;
@@ -723,7 +723,7 @@ public:
virtual bool isLocal() const;
virtual ContainedType containedType() const;
virtual bool uses(const ContainedPtr&) const;
- bool usesClasses() const;
+ bool usesClasses(bool) const;
bool hasDefaultValues() const;
bool inheritsMetaData(const std::string&) const;
virtual std::string kindOf() const;
diff --git a/cpp/src/Ice/Stream.cpp b/cpp/src/Ice/Stream.cpp
index 58d98324113..c483a261a56 100644
--- a/cpp/src/Ice/Stream.cpp
+++ b/cpp/src/Ice/Stream.cpp
@@ -28,6 +28,12 @@ Ice::UserExceptionReader::__readImpl(::IceInternal::BasicStream*)
assert(false); // Should never be called.
}
+bool
+Ice::UserExceptionReader::__usesClasses() const
+{
+ return usesClasses();
+}
+
void
Ice::UserExceptionWriter::__writeImpl(::IceInternal::BasicStream*) const
{
@@ -39,3 +45,9 @@ Ice::UserExceptionWriter::__readImpl(::IceInternal::BasicStream*)
{
assert(false); // Should never be called.
}
+
+bool
+Ice::UserExceptionWriter::__usesClasses() const
+{
+ return usesClasses();
+}
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index a0855fc7771..673a9a0d222 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -3969,19 +3969,19 @@ Slice::Exception::uses(const ContainedPtr&) const
}
bool
-Slice::Exception::usesClasses() const
+Slice::Exception::usesClasses(bool includeOptional) const
{
DataMemberList dml = dataMembers();
for(DataMemberList::const_iterator i = dml.begin(); i != dml.end(); ++i)
{
- if((*i)->type()->usesClasses())
+ if((*i)->type()->usesClasses() && (includeOptional || !(*i)->optional()))
{
return true;
}
}
if(_base)
{
- return _base->usesClasses();
+ return _base->usesClasses(includeOptional);
}
return false;
}
@@ -5131,12 +5131,12 @@ Slice::Operation::uses(const ContainedPtr& contained) const
}
bool
-Slice::Operation::sendsClasses() const
+Slice::Operation::sendsClasses(bool includeOptional) const
{
ParamDeclList pdl = parameters();
for(ParamDeclList::const_iterator i = pdl.begin(); i != pdl.end(); ++i)
{
- if(!(*i)->isOutParam() && (*i)->type()->usesClasses())
+ if(!(*i)->isOutParam() && (*i)->type()->usesClasses() && (includeOptional || !(*i)->optional()))
{
return true;
}
@@ -5145,17 +5145,17 @@ Slice::Operation::sendsClasses() const
}
bool
-Slice::Operation::returnsClasses() const
+Slice::Operation::returnsClasses(bool includeOptional) const
{
TypePtr t = returnType();
- if(t && t->usesClasses())
+ if(t && t->usesClasses() && (includeOptional || !_returnIsOptional))
{
return true;
}
ParamDeclList pdl = parameters();
for(ParamDeclList::const_iterator i = pdl.begin(); i != pdl.end(); ++i)
{
- if((*i)->isOutParam() && (*i)->type()->usesClasses())
+ if((*i)->isOutParam() && (*i)->type()->usesClasses() && (includeOptional || !(*i)->optional()))
{
return true;
}
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index f7e0f4b615f..c9463b8c32a 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -877,9 +877,9 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p)
C << nl << "throw *this;";
C << eb;
- if(!p->isLocal() && p->usesClasses())
+ if(!p->isLocal() && p->usesClasses(false))
{
- if(!base || (base && !base->usesClasses()))
+ if(!base || (base && !base->usesClasses(false)))
{
H << sp << nl << "virtual bool __usesClasses() const;";
@@ -2170,7 +2170,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __os = __result->__startWriteParams(" << opFormatTypeToString(p) <<");";
writeMarshalCode(C, inParams, 0, TypeContextInParam);
- if(p->sendsClasses())
+ if(p->sendsClasses(false))
{
C << nl << "__os->writePendingObjects();";
}
@@ -2237,7 +2237,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __result->__startReadParams();";
writeUnmarshalCode(C, outParams, p, _useWstring | TypeContextAMIEnd);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
C << nl << "__is->readPendingObjects();";
}
@@ -2307,7 +2307,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __result->__startReadParams();";
writeUnmarshalCode(C, outParams, p, _useWstring | TypeContextAMIPrivateEnd);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
C << nl << "__is->readPendingObjects();";
}
@@ -2729,7 +2729,7 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
C << sb;
C << nl<< "::IceInternal::BasicStream* __os = __og.startWriteParams(" << opFormatTypeToString(p) << ");";
writeMarshalCode(C, inParams, 0, TypeContextInParam);
- if(p->sendsClasses())
+ if(p->sendsClasses(false))
{
C << nl << "__os->writePendingObjects();";
}
@@ -2815,7 +2815,7 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "::IceInternal::BasicStream* __is = __og.startReadParams();";
writeUnmarshalCode(C, outParams, p);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
C << nl << "__is->readPendingObjects();";
}
@@ -4272,7 +4272,7 @@ 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())
+ if(p->sendsClasses(false))
{
C << nl << "__is->readPendingObjects();";
}
@@ -4300,7 +4300,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __os = __inS.__startWriteParams("
<< opFormatTypeToString(p) << ");";
writeMarshalCode(C, outParams, p);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
C << nl << "__os->writePendingObjects();";
}
@@ -4334,7 +4334,7 @@ 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())
+ if(p->sendsClasses(false))
{
C << nl << "__is->readPendingObjects();";
}
@@ -5929,7 +5929,7 @@ Slice::Gen::AsyncImplVisitor::visitOperation(const OperationPtr& p)
C << sb;
C << nl << "::IceInternal::BasicStream* __os = __startWriteParams(" << opFormatTypeToString(p) << ");";
writeMarshalCode(C, outParams, p, TypeContextInParam);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
C << nl << "__os->writePendingObjects();";
}
diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp
index 3e6290ad7c8..c910332a141 100644
--- a/cpp/src/slice2cs/Gen.cpp
+++ b/cpp/src/slice2cs/Gen.cpp
@@ -870,7 +870,7 @@ Slice::CsVisitor::writeDispatchAndMarshalling(const ClassDefPtr& p, bool stream)
}
}
writeMarshalUnmarshalParams(inParams, 0, false);
- if(op->sendsClasses())
+ if(op->sendsClasses(false))
{
_out << nl << "is__.readPendingObjects();";
}
@@ -944,7 +944,7 @@ Slice::CsVisitor::writeDispatchAndMarshalling(const ClassDefPtr& p, bool stream)
_out << nl << "IceInternal.BasicStream os__ = inS__.startWriteParams__("
<< opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(outParams, op, true);
- if(op->returnsClasses())
+ if(op->returnsClasses(false))
{
_out << nl << "os__.writePendingObjects();";
}
@@ -3608,7 +3608,7 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
_out << eb;
}
- if((!base || (base && !base->usesClasses())) && p->usesClasses())
+ if((!base || (base && !base->usesClasses(false))) && p->usesClasses(false))
{
_out << sp;
emitGeneratedCodeAttribute();
@@ -4993,7 +4993,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(outParams, op, false);
- if(op->returnsClasses())
+ if(op->returnsClasses(false))
{
_out << nl << "is__.readPendingObjects();";
}
@@ -5060,7 +5060,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
_out << nl << "IceInternal.BasicStream os__ = result__.startWriteParams__("
<< opFormatTypeToString(op) << ");";
writeMarshalUnmarshalParams(inParams, 0, true);
- if(op->sendsClasses())
+ if(op->sendsClasses(false))
{
_out << nl << "os__.writePendingObjects();";
}
@@ -5947,7 +5947,7 @@ 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())
+ if(op->sendsClasses(false))
{
_out << nl << "os__.writePendingObjects();";
}
@@ -6049,7 +6049,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(outParams, op, false);
- if(op->returnsClasses())
+ if(op->returnsClasses(false))
{
_out << nl << "is__.readPendingObjects();";
}
@@ -6573,7 +6573,7 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
_out << sb;
_out << nl << "IceInternal.BasicStream os__ = startWriteParams__(" << opFormatTypeToString(p) << ");";
writeMarshalUnmarshalParams(outParams, p, true);
- if(p->returnsClasses())
+ if(p->returnsClasses(false))
{
_out << nl << "os__.writePendingObjects();";
}
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index e5dc96633cc..5d8c60fad01 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -991,7 +991,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
}
iter = 0;
writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
- if(op->sendsClasses())
+ if(op->sendsClasses(false))
{
out << nl << "__is.readPendingObjects();";
}
@@ -1056,7 +1056,7 @@ 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())
+ if(op->returnsClasses(false))
{
out << nl << "__os.writePendingObjects();";
}
@@ -1134,7 +1134,7 @@ Slice::JavaVisitor::writeDispatchAndMarshalling(Output& out, const ClassDefPtr&
}
}
writeMarshalUnmarshalParams(out, package, inParams, 0, iter, false, true, true);
- if(op->sendsClasses())
+ if(op->sendsClasses(false))
{
out << nl << "__is.readPendingObjects();";
}
@@ -3366,9 +3366,9 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
out << eb;
}
- if(p->usesClasses())
+ if(p->usesClasses(false))
{
- if(!base || (base && !base->usesClasses()))
+ if(!base || (base && !base->usesClasses(false)))
{
out << sp << nl << "public boolean" << nl << "__usesClasses()";
out << sb;
@@ -4473,7 +4473,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(out, package, pl, 0, iter, true, optionalMapping);
- if(op->sendsClasses())
+ if(op->sendsClasses(false))
{
out << nl << "__os.writePendingObjects();";
}
@@ -4552,7 +4552,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
}
}
writeMarshalUnmarshalParams(out, package, pl, op, iter, false, true);
- if(op->returnsClasses())
+ if(op->returnsClasses(false))
{
out << nl << "__is.readPendingObjects();";
}
@@ -5485,7 +5485,7 @@ 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())
+ if(op->sendsClasses(false))
{
out << nl << "__os.writePendingObjects();";
}
@@ -5532,7 +5532,7 @@ 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())
+ if(op->returnsClasses(false))
{
out << nl << "__is.readPendingObjects();";
}
@@ -6602,7 +6602,7 @@ 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())
+ if(p->returnsClasses(false))
{
out << nl << "__os.writePendingObjects();";
}
diff --git a/cpp/test/Ice/objects/AllTests.cpp b/cpp/test/Ice/objects/AllTests.cpp
index 04b56d01a83..c4522b7a5e0 100644
--- a/cpp/test/Ice/objects/AllTests.cpp
+++ b/cpp/test/Ice/objects/AllTests.cpp
@@ -215,7 +215,7 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
initial->setI(h);
cout << "ok" << endl;
- cout << "testing sequences..." << flush;
+ cout << "testing sequences... " << flush;
BaseSeq inS, outS, retS;
retS = initial->opBaseSeq(inS, outS);
diff --git a/cpp/test/Ice/objects/TestI.cpp b/cpp/test/Ice/objects/TestI.cpp
index 246864b2019..12cd0e1915c 100644
--- a/cpp/test/Ice/objects/TestI.cpp
+++ b/cpp/test/Ice/objects/TestI.cpp
@@ -210,7 +210,6 @@ InitialI::setI(const IPtr&, const Ice::Current&)
{
}
-
BaseSeq
InitialI::opBaseSeq(const BaseSeq& inSeq, BaseSeq& outSeq, const Ice::Current&)
{
diff --git a/cpp/test/Ice/optional/AllTests.cpp b/cpp/test/Ice/optional/AllTests.cpp
index 22c0d3cdb3c..6719dca601e 100644
--- a/cpp/test/Ice/optional/AllTests.cpp
+++ b/cpp/test/Ice/optional/AllTests.cpp
@@ -548,6 +548,19 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
in->endEncapsulation();
test(obj && dynamic_cast<TestObjectReader*>(obj.get()));
factory->setEnabled(false);
+
+ //
+ // Use the 1.0 encoding with operations whose only class parameters are optional.
+ //
+ IceUtil::Optional<OneOptionalPtr> oo(new OneOptional(53));
+ initial->sendOptionalClass(true, oo);
+ initial->ice_encodingVersion(Ice::Encoding_1_0)->sendOptionalClass(true, oo);
+
+ initial->returnOptionalClass(true, oo);
+ test(oo);
+ initial->ice_encodingVersion(Ice::Encoding_1_0)->returnOptionalClass(true, oo);
+ test(!oo);
+
cout << "ok" << endl;
cout << "testing marshalling of large containers with fixed size elements..." << flush;
@@ -1092,6 +1105,21 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
test(ex.b == string("test"));
test((*ex.o)->a = 53);
}
+
+ try
+ {
+ //
+ // Use the 1.0 encoding with an exception whose only class members are optional.
+ //
+ initial->ice_encodingVersion(Ice::Encoding_1_0)->
+ opOptionalException(30, string("test"), OneOptionalPtr(new OneOptional(53)));
+ }
+ catch(const OptionalException& ex)
+ {
+ test(!ex.a);
+ test(!ex.b);
+ test(!ex.o);
+ }
}
cout << "ok" << endl;
diff --git a/cpp/test/Ice/optional/Test.ice b/cpp/test/Ice/optional/Test.ice
index baea70cb293..d693ae649a2 100644
--- a/cpp/test/Ice/optional/Test.ice
+++ b/cpp/test/Ice/optional/Test.ice
@@ -138,6 +138,7 @@ class WD
exception OptionalException
{
+ bool req = false;
optional(1) int a = 5;
optional(2) string b;
optional(50) OneOptional o;
@@ -253,6 +254,10 @@ class Initial
void opClassAndUnknownOptional(A p);
+ void sendOptionalClass(bool req, optional(1) OneOptional o);
+
+ void returnOptionalClass(bool req, out optional(1) OneOptional o);
+
bool supportsRequiredParams();
bool supportsJavaSerializable();
diff --git a/cpp/test/Ice/optional/TestI.cpp b/cpp/test/Ice/optional/TestI.cpp
index b40ee6cf67d..f26194e934a 100644
--- a/cpp/test/Ice/optional/TestI.cpp
+++ b/cpp/test/Ice/optional/TestI.cpp
@@ -344,6 +344,17 @@ InitialI::opClassAndUnknownOptional(const APtr& a, const Ice::Current&)
{
}
+void
+InitialI::sendOptionalClass(bool, const Optional<OneOptionalPtr>&, const Ice::Current&)
+{
+}
+
+void
+InitialI::returnOptionalClass(bool, Optional<OneOptionalPtr>& o, const Ice::Current&)
+{
+ o = new OneOptional(53);
+}
+
bool
InitialI::supportsRequiredParams(const Ice::Current&)
{
diff --git a/cpp/test/Ice/optional/TestI.h b/cpp/test/Ice/optional/TestI.h
index 2114639de63..aab81137006 100644
--- a/cpp/test/Ice/optional/TestI.h
+++ b/cpp/test/Ice/optional/TestI.h
@@ -172,6 +172,10 @@ public:
virtual void opClassAndUnknownOptional(const Test::APtr&, const Ice::Current&);
+ virtual void sendOptionalClass(bool, const IceUtil::Optional<Test::OneOptionalPtr>&, const Ice::Current&);
+
+ virtual void returnOptionalClass(bool, IceUtil::Optional<Test::OneOptionalPtr>&, const Ice::Current&);
+
virtual bool supportsRequiredParams(const Ice::Current&);
virtual bool supportsJavaSerializable(const Ice::Current&);