diff options
author | Mark Spruiell <mes@zeroc.com> | 2012-11-09 16:22:47 -0800 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2012-11-09 16:22:47 -0800 |
commit | 493caea19fd83663eb03b4eeaf7714f99ac07b97 (patch) | |
tree | 39f8b7dc983394288cb25961a0907ebe0b0f5847 /cpp | |
parent | ICE-4914 - Update Database/Oracle demos (diff) | |
download | ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.tar.bz2 ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.tar.xz ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.zip |
ICE-4930 - fixes for scripting languages
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Ice/Stream.h | 6 | ||||
-rw-r--r-- | cpp/include/Slice/Parser.h | 6 | ||||
-rw-r--r-- | cpp/src/Ice/Stream.cpp | 12 | ||||
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 16 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 22 | ||||
-rw-r--r-- | cpp/src/slice2cs/Gen.cpp | 16 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 20 | ||||
-rw-r--r-- | cpp/test/Ice/objects/AllTests.cpp | 2 | ||||
-rw-r--r-- | cpp/test/Ice/objects/TestI.cpp | 1 | ||||
-rw-r--r-- | cpp/test/Ice/optional/AllTests.cpp | 28 | ||||
-rw-r--r-- | cpp/test/Ice/optional/Test.ice | 5 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestI.cpp | 11 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestI.h | 4 |
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&); |