diff options
47 files changed, 511 insertions, 98 deletions
diff --git a/CHANGELOG-3.7.md b/CHANGELOG-3.7.md index 50bd34e57be..503abaff2cd 100644 --- a/CHANGELOG-3.7.md +++ b/CHANGELOG-3.7.md @@ -26,8 +26,8 @@ These are the changes since the Ice 3.6 release or snapshot described in ## General Changes -- Added `ice_getSlicedData` method to the `Value` base class. This method can - be used to obtain the sliced data when available. +- Added `ice_getSlicedData` method to the `Value` and `UserException` base + classes. This method can be used to obtain the sliced data when available. - Defining operations on non-local classes is now deprecated: operations should be defined only on interfaces and local classes. Likewise, having a class diff --git a/cpp/include/Ice/Exception.h b/cpp/include/Ice/Exception.h index cb50bd2a9c1..8c5803b9d24 100644 --- a/cpp/include/Ice/Exception.h +++ b/cpp/include/Ice/Exception.h @@ -16,6 +16,7 @@ #include <Ice/Handle.h> #include <Ice/ObjectF.h> #include <Ice/ValueF.h> +#include <Ice/SlicedDataF.h> namespace Ice { @@ -57,19 +58,20 @@ class ICE_API UserException : public IceUtil::Exception { public: - virtual void _write(::Ice::OutputStream*) const; - virtual void _read(::Ice::InputStream*); - - virtual bool _usesClasses() const; - #ifdef ICE_CPP11_MAPPING std::unique_ptr<UserException> ice_clone() const; #else virtual UserException* ice_clone() const = 0; #endif + virtual Ice::SlicedDataPtr ice_getSlicedData() const; static const std::string& ice_staticId(); + virtual void _write(::Ice::OutputStream*) const; + virtual void _read(::Ice::InputStream*); + + virtual bool _usesClasses() const; + protected: virtual void _writeImpl(::Ice::OutputStream*) const {} diff --git a/cpp/include/Ice/SlicedData.h b/cpp/include/Ice/SlicedData.h index bd3761840d9..b4837274b19 100644 --- a/cpp/include/Ice/SlicedData.h +++ b/cpp/include/Ice/SlicedData.h @@ -99,11 +99,8 @@ public: UnknownSlicedValue(const std::string&); - const std::string& getUnknownTypeId() const; - #ifdef ICE_CPP11_MAPPING virtual SlicedDataPtr ice_getSlicedData() const override; - virtual std::string ice_id() const override; std::shared_ptr<UnknownSlicedValue> ice_clone() const; @@ -115,6 +112,7 @@ protected: virtual std::shared_ptr<Value> _iceCloneImpl() const override; #else virtual SlicedDataPtr ice_getSlicedData() const; + virtual const std::string& ice_id(const Current& = Ice::emptyCurrent) const; virtual void _iceGcVisitMembers(IceInternal::GCVisitor&); virtual void _iceWrite(::Ice::OutputStream*) const; diff --git a/cpp/src/Ice/Exception.cpp b/cpp/src/Ice/Exception.cpp index 9faa0bddc71..968f9d3edbc 100644 --- a/cpp/src/Ice/Exception.cpp +++ b/cpp/src/Ice/Exception.cpp @@ -77,7 +77,7 @@ throwUOE(const string& expectedType, const ValuePtr& v) UnknownSlicedValue* usv = dynamic_cast<UnknownSlicedValue*>(v.get()); if(usv) { - throw NoValueFactoryException(__FILE__, __LINE__, "", usv->getUnknownTypeId()); + throw NoValueFactoryException(__FILE__, __LINE__, "", usv->ice_id()); } string type = v->ice_id(); @@ -127,6 +127,12 @@ Ice::UserException::ice_clone() const } #endif +Ice::SlicedDataPtr +Ice::UserException::ice_getSlicedData() const +{ + return ICE_NULLPTR; +} + void Ice::UserException::_write(::Ice::OutputStream* os) const { diff --git a/cpp/src/Ice/SlicedData.cpp b/cpp/src/Ice/SlicedData.cpp index 56b10f6aba1..ced50e1211c 100644 --- a/cpp/src/Ice/SlicedData.cpp +++ b/cpp/src/Ice/SlicedData.cpp @@ -72,12 +72,6 @@ Ice::UnknownSlicedValue::UnknownSlicedValue(const string& unknownTypeId) : _unkn { } -const string& -Ice::UnknownSlicedValue::getUnknownTypeId() const -{ - return _unknownTypeId; -} - SlicedDataPtr Ice::UnknownSlicedValue::ice_getSlicedData() const { @@ -106,6 +100,12 @@ Ice::UnknownSlicedValue::_iceCloneImpl() const #else +const string& +Ice::UnknownSlicedValue::ice_id(const Current&) const +{ + return _unknownTypeId; +} + void Ice::UnknownSlicedValue::_iceGcVisitMembers(IceInternal::GCVisitor& _v) { diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index f017ad66b4b..81b0ef1dcc5 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -1193,7 +1193,11 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) if(preserved && !basePreserved) { - H << sp << nl << "virtual void _write(::Ice::OutputStream*) const;"; + H << sp; + H << nl << "virtual ::Ice::SlicedDataPtr ice_getSlicedData() const;"; + + H << sp; + H << nl << "virtual void _write(::Ice::OutputStream*) const;"; H << nl << "virtual void _read(::Ice::InputStream*);"; string baseName = base ? fixKwd(base->scoped()) : string("::Ice::UserException"); @@ -1215,6 +1219,12 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) H << sp << nl << "::Ice::SlicedDataPtr _slicedData;"; + C << sp; + C << nl << "::Ice::SlicedDataPtr" << nl << scoped.substr(2) << "::ice_getSlicedData() const"; + C << sb; + C << nl << "return _slicedData;"; + C << eb; + C << sp << nl << "void" << nl << scoped.substr(2) << "::_write(::Ice::OutputStream* ostr) const"; C << sb; C << nl << "ostr->startException(_slicedData);"; @@ -5576,11 +5586,20 @@ Slice::Gen::Cpp11TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) if(preserved && !basePreserved) { - H << sp << nl << _dllMemberExport << "virtual void _write(::Ice::OutputStream*) const override;"; + H << sp; + H << nl << _dllMemberExport << "virtual ::std::shared_ptr<::Ice::SlicedData> ice_getSlicedData() const override;"; + H << sp; + H << nl << _dllMemberExport << "virtual void _write(::Ice::OutputStream*) const override;"; H << nl << _dllMemberExport << "virtual void _read(::Ice::InputStream*) override;"; H << sp << nl << "::std::shared_ptr<::Ice::SlicedData> _slicedData;"; + C << sp; + C << nl << "::std::shared_ptr<::Ice::SlicedData>" << nl << scoped.substr(2) << "::ice_getSlicedData() const"; + C << sb; + C << nl << "return _slicedData;"; + C << eb; + C << sp << nl << "void" << nl << scoped.substr(2) << "::_write(::Ice::OutputStream* ostr) const"; C << sb; C << nl << "ostr->startException(_slicedData);"; diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp index 1d8f88797e3..b70aae7be01 100644 --- a/cpp/src/slice2cs/Gen.cpp +++ b/cpp/src/slice2cs/Gen.cpp @@ -2797,6 +2797,13 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) { _out << sp; emitGeneratedCodeAttribute(); + _out << nl << "public override Ice.SlicedData ice_getSlicedData()"; + _out << sb; + _out << nl << "return slicedData_;"; + _out << eb; + + _out << sp; + emitGeneratedCodeAttribute(); _out << nl << "public override void iceWrite(Ice.OutputStream ostr_)"; _out << sb; _out << nl << "ostr_.startException(slicedData_);"; diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index 15b2a939e23..e6a225a11a6 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -3136,6 +3136,13 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) { out << sp; out << nl << "@Override"; + out << nl << "public com.zeroc.Ice.SlicedData ice_getSlicedData()"; + out << sb; + out << nl << "return _slicedData;"; + out << eb; + + out << sp; + out << nl << "@Override"; out << nl << "public void _write(com.zeroc.Ice.OutputStream ostr)"; out << sb; out << nl << "ostr.startException(_slicedData);"; diff --git a/cpp/src/slice2java/GenCompat.cpp b/cpp/src/slice2java/GenCompat.cpp index 14279536038..e09db4c6c3b 100644 --- a/cpp/src/slice2java/GenCompat.cpp +++ b/cpp/src/slice2java/GenCompat.cpp @@ -3422,6 +3422,12 @@ Slice::GenCompat::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) if(preserved && !basePreserved) { + out << sp; + out << nl << "public Ice.SlicedData " << nl << "ice_getSlicedData()"; + out << sb; + out << nl << "return _slicedData;"; + out << eb; + out << sp << nl << "public void" << nl << "_write(Ice.OutputStream ostr)"; out << sb; out << nl << "ostr.startException(_slicedData);"; diff --git a/cpp/src/slice2objc/Gen.cpp b/cpp/src/slice2objc/Gen.cpp index 3aba530c16b..6e34a182f54 100644 --- a/cpp/src/slice2objc/Gen.cpp +++ b/cpp/src/slice2objc/Gen.cpp @@ -1157,7 +1157,7 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p) { _M << nl << "-(id<ICESlicedData>) ice_getSlicedData"; _M << sb; - _M << nl << "return iceSlicedData_;"; + _M << nl << "return ICE_AUTORELEASE(ICE_RETAIN(iceSlicedData_));"; _M << eb; _M << nl << "-(void) iceWrite:(id<ICEOutputStream>)ostr"; @@ -1404,6 +1404,11 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p) if(preserved && !basePreserved) { + _M << nl << nl << "-(id<ICESlicedData>) ice_getSlicedData"; + _M << sb; + _M << nl << "return ICE_AUTORELEASE(ICE_RETAIN(slicedData_));"; + _M << eb; + _M << nl << nl << "-(void) iceWrite:(id<ICEOutputStream>)ostr"; _M << sb; _M << nl << "[ostr startException:slicedData_];"; diff --git a/cpp/test/Ice/optional/AllTests.cpp b/cpp/test/Ice/optional/AllTests.cpp index ba90f0a95a4..3b6963a0544 100644 --- a/cpp/test/Ice/optional/AllTests.cpp +++ b/cpp/test/Ice/optional/AllTests.cpp @@ -64,7 +64,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; @@ -101,7 +101,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; @@ -141,7 +141,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; @@ -194,7 +194,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; @@ -248,7 +248,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; @@ -294,7 +294,7 @@ public: protected: - virtual std::shared_ptr<Value> cloneImpl() const + virtual std::shared_ptr<Value> _iceCloneImpl() const { assert(0); // not used return nullptr; diff --git a/cpp/test/Ice/slicing/exceptions/AllTests.cpp b/cpp/test/Ice/slicing/exceptions/AllTests.cpp index abc1692e45c..3a428d30440 100644 --- a/cpp/test/Ice/slicing/exceptions/AllTests.cpp +++ b/cpp/test/Ice/slicing/exceptions/AllTests.cpp @@ -1040,6 +1040,67 @@ allTests(const Ice::CommunicatorPtr& communicator) cout << "ok" << endl; cout << "preserved exceptions... " << flush; + try + { + test->unknownPreservedAsBase(); + test(false); + } + catch(const Base& ex) + { + if(test->ice_getEncodingVersion() == Ice::Encoding_1_0) + { + test(!ex.ice_getSlicedData()); + } + else + { + Ice::SlicedDataPtr slicedData = ex.ice_getSlicedData(); + test(slicedData); + test(slicedData->slices.size() == 2); + test(slicedData->slices[1]->typeId == "::Test::SPreserved1"); + test(slicedData->slices[0]->typeId == "::Test::SPreserved2"); + } + } + catch(const Ice::LocalException& ex) + { + cerr << ex << endl; + test(false); + } + catch(...) + { + test(false); + } + + try + { + test->unknownPreservedAsKnownPreserved(); + test(false); + } + catch(const KnownPreserved& ex) + { + test(ex.kp == "preserved"); + if(test->ice_getEncodingVersion() == Ice::Encoding_1_0) + { + test(!ex.ice_getSlicedData()); + } + else + { + Ice::SlicedDataPtr slicedData = ex.ice_getSlicedData(); + test(slicedData); + test(slicedData->slices.size() == 2); + test(slicedData->slices[1]->typeId == "::Test::SPreserved1"); + test(slicedData->slices[0]->typeId == "::Test::SPreserved2"); + } + } + catch(const Ice::LocalException& ex) + { + cerr << ex << endl; + test(false); + } + catch(...) + { + test(false); + } + Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter(""); RelayPrxPtr relay = ICE_UNCHECKED_CAST(RelayPrx, adapter->addWithUUID(ICE_MAKE_SHARED(RelayI))); adapter->activate(); diff --git a/cpp/test/Ice/slicing/objects/AllTests.cpp b/cpp/test/Ice/slicing/objects/AllTests.cpp index 1ebd464f721..d2ca27a998f 100644 --- a/cpp/test/Ice/slicing/objects/AllTests.cpp +++ b/cpp/test/Ice/slicing/objects/AllTests.cpp @@ -130,7 +130,7 @@ public: response_SUnknownAsObject11(const Ice::ObjectPtr& o) { test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)); - test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)->getUnknownTypeId() == "::Test::SUnknown"); + test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)->ice_id() == "::Test::SUnknown"); called(); } @@ -578,7 +578,7 @@ testUOO(const TestIntfPrxPtr& test) o = test->SUnknownAsObject(); test(test->ice_getEncodingVersion() != Ice::Encoding_1_0); test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)); - test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)->getUnknownTypeId() == "::Test::SUnknown"); + test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)->ice_id() == "::Test::SUnknown"); test(ICE_DYNAMIC_CAST(Ice::UnknownSlicedValue, o)->ice_getSlicedData()); test->checkSUnknown(o); } @@ -938,7 +938,7 @@ allTests(const Ice::CommunicatorPtr& communicator) { shared_ptr<Ice::Value> v = f.get(); test(dynamic_pointer_cast<Ice::UnknownSlicedValue>(v)); - test(dynamic_pointer_cast<Ice::UnknownSlicedValue>(v)->getUnknownTypeId() == "::Test::SUnknown"); + test(dynamic_pointer_cast<Ice::UnknownSlicedValue>(v)->ice_id() == "::Test::SUnknown"); } catch(...) { diff --git a/csharp/src/Ice/Exception.cs b/csharp/src/Ice/Exception.cs index 8937d1b6a67..08545c84f5c 100644 --- a/csharp/src/Ice/Exception.cs +++ b/csharp/src/Ice/Exception.cs @@ -26,7 +26,7 @@ namespace IceInternal if(v is Ice.UnknownSlicedValue) { Ice.UnknownSlicedValue usv = (Ice.UnknownSlicedValue)v; - throw new Ice.NoValueFactoryException("", usv.getUnknownTypeId()); + throw new Ice.NoValueFactoryException("", usv.ice_id()); } string type = v.ice_id(); @@ -226,6 +226,16 @@ namespace Ice /// <param name="context">Contains contextual information about the source or destination.</param> protected UserException(SerializationInfo info, StreamingContext context) : base(info, context) {} + /// <summary> + /// Returns the sliced data if the exception has a preserved-slice base class and has been sliced during + /// un-marshaling, null is returned otherwise. + /// </summary> + /// <returns>The sliced data or null.</returns> + public virtual Ice.SlicedData ice_getSlicedData() + { + return null; + } + public virtual void iceWrite(OutputStream ostr) { ostr.startException(null); diff --git a/csharp/src/Ice/UnknownSlicedValue.cs b/csharp/src/Ice/UnknownSlicedValue.cs index 82180cb4e7d..a2ab3116271 100644 --- a/csharp/src/Ice/UnknownSlicedValue.cs +++ b/csharp/src/Ice/UnknownSlicedValue.cs @@ -24,15 +24,6 @@ namespace Ice } /// <summary> - /// Determine the Slice type ID associated with this object. - /// </summary> - /// <returns>The type ID.</returns> - public string getUnknownTypeId() - { - return _unknownTypeId; - } - - /// <summary> /// Returns the sliced data if the value has a preserved-slice base class and has been sliced during /// un-marshaling of the value, null is returned otherwise. /// </summary> @@ -42,6 +33,15 @@ namespace Ice return _slicedData; } + /// <summary> + /// Returns the Slice type ID associated with this object. + /// </summary> + /// <returns>The type ID.</returns> + public override string ice_id() + { + return _unknownTypeId; + } + public override void iceWrite(OutputStream ostr) { ostr.startValue(_slicedData); diff --git a/csharp/test/Ice/slicing/exceptions/AllTests.cs b/csharp/test/Ice/slicing/exceptions/AllTests.cs index c579618f4e5..4333d656b15 100644 --- a/csharp/test/Ice/slicing/exceptions/AllTests.cs +++ b/csharp/test/Ice/slicing/exceptions/AllTests.cs @@ -1115,6 +1115,49 @@ public class AllTests : TestCommon.AllTests Write("preserved exceptions... "); Flush(); { + try + { + testPrx.unknownPreservedAsBase(); + test(false); + } + catch(Base ex) + { + if(testPrx.ice_getEncodingVersion().Equals(Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.Length == 2); + test(slicedData.slices[1].typeId.Equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.Equals("::Test::SPreserved2")); + } + } + + try + { + testPrx.unknownPreservedAsKnownPreserved(); + test(false); + } + catch(KnownPreserved ex) + { + test(ex.kp.Equals("preserved")); + if(testPrx.ice_getEncodingVersion().Equals(Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.Length == 2); + test(slicedData.slices[1].typeId.Equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.Equals("::Test::SPreserved2")); + } + } + Ice.ObjectAdapter adapter = communicator.createObjectAdapter(""); RelayPrx relay = RelayPrxHelper.uncheckedCast(adapter.addWithUUID(new RelayI())); adapter.activate(); diff --git a/csharp/test/Ice/slicing/objects/AllTests.cs b/csharp/test/Ice/slicing/objects/AllTests.cs index f50514153bb..67c6dc52b5c 100644 --- a/csharp/test/Ice/slicing/objects/AllTests.cs +++ b/csharp/test/Ice/slicing/objects/AllTests.cs @@ -400,7 +400,7 @@ public class AllTests : TestCommon.AllTests Ice.Value o = testPrx.SUnknownAsObject(); test(!testPrx.ice_getEncodingVersion().Equals(Ice.Util.Encoding_1_0)); test(o is Ice.UnknownSlicedValue); - test((o as Ice.UnknownSlicedValue).getUnknownTypeId().Equals("::Test::SUnknown")); + test((o as Ice.UnknownSlicedValue).ice_id().Equals("::Test::SUnknown")); test((o as Ice.UnknownSlicedValue).ice_getSlicedData() != null); testPrx.checkSUnknown(o); } @@ -459,7 +459,7 @@ public class AllTests : TestCommon.AllTests (Ice.Value o) => { test(o is Ice.UnknownSlicedValue); - test((o as Ice.UnknownSlicedValue).getUnknownTypeId().Equals("::Test::SUnknown")); + test((o as Ice.UnknownSlicedValue).ice_id().Equals("::Test::SUnknown")); cb.called(); }, (Ice.Exception ex) => @@ -472,7 +472,7 @@ public class AllTests : TestCommon.AllTests { var o = testPrx.SUnknownAsObjectAsync().Result; test(o is Ice.UnknownSlicedValue); - test((o as Ice.UnknownSlicedValue).getUnknownTypeId().Equals("::Test::SUnknown")); + test((o as Ice.UnknownSlicedValue).ice_id().Equals("::Test::SUnknown")); } catch(AggregateException) { diff --git a/java-compat/src/Ice/src/main/java/Ice/UnknownSlicedValue.java b/java-compat/src/Ice/src/main/java/Ice/UnknownSlicedValue.java index 77f180ace61..18c93cd9677 100644 --- a/java-compat/src/Ice/src/main/java/Ice/UnknownSlicedValue.java +++ b/java-compat/src/Ice/src/main/java/Ice/UnknownSlicedValue.java @@ -26,25 +26,26 @@ public final class UnknownSlicedValue extends ObjectImpl } /** - * Determine the Slice type ID associated with this object. + * Returns the sliced data if the value has a preserved-slice base class and has been sliced during + * un-marshaling of the value, null is returned otherwise. * - * @return The type ID. + * @return The sliced data or null. **/ - public String getUnknownTypeId() + @Override + public SlicedData ice_getSlicedData() { - return _unknownTypeId; + return _slicedData; } /** - * Returns the sliced data if the value has a preserved-slice base class and has been sliced during - * un-marshaling of the value, null is returned otherwise. + * Determine the Slice type ID associated with this object. * - * @return The sliced data or null. + * @return The type ID. **/ @Override - public SlicedData ice_getSlicedData() + public String ice_id() { - return _slicedData; + return _unknownTypeId; } @Override diff --git a/java-compat/src/Ice/src/main/java/Ice/UserException.java b/java-compat/src/Ice/src/main/java/Ice/UserException.java index 5e76c66222d..e88968dc18b 100644 --- a/java-compat/src/Ice/src/main/java/Ice/UserException.java +++ b/java-compat/src/Ice/src/main/java/Ice/UserException.java @@ -67,6 +67,18 @@ public abstract class UserException extends java.lang.Exception implements Clone ice_id(); /** + * Returns the sliced data if the exception has a preserved-slice base class and has been sliced during + * un-marshaling, null is returned otherwise. + * + * @return The sliced data or null. + **/ + public Ice.SlicedData + ice_getSlicedData() + { + return null; + } + + /** * Returns a string representation of this exception. * * @return A string representation of this exception. diff --git a/java-compat/src/Ice/src/main/java/IceInternal/Ex.java b/java-compat/src/Ice/src/main/java/IceInternal/Ex.java index 1a25b392f3b..fc6e0f037d7 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/Ex.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/Ex.java @@ -21,7 +21,7 @@ public class Ex if(v instanceof Ice.UnknownSlicedValue) { Ice.UnknownSlicedValue usv = (Ice.UnknownSlicedValue)v; - throw new Ice.NoValueFactoryException("", usv.getUnknownTypeId()); + throw new Ice.NoValueFactoryException("", usv.ice_id()); } String type = v.ice_id(); diff --git a/java-compat/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java b/java-compat/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java index af723f0b9f7..085264fe291 100644 --- a/java-compat/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java +++ b/java-compat/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java @@ -1162,6 +1162,49 @@ public class AllTests out.print("preserved exceptions... "); out.flush(); { + try + { + test.unknownPreservedAsBase(); + test(false); + } + catch(Base ex) + { + if(test.ice_getEncodingVersion().equals(Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId.equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.equals("::Test::SPreserved2")); + } + } + + try + { + test.unknownPreservedAsKnownPreserved(); + test(false); + } + catch(KnownPreserved ex) + { + test(ex.kp.equals("preserved")); + if(test.ice_getEncodingVersion().equals(Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId.equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.equals("::Test::SPreserved2")); + } + } + Ice.ObjectAdapter adapter = communicator.createObjectAdapter(""); RelayPrx relay = RelayPrxHelper.uncheckedCast(adapter.addWithUUID(new RelayI())); adapter.activate(); diff --git a/java-compat/test/src/main/java/test/Ice/slicing/objects/AllTests.java b/java-compat/test/src/main/java/test/Ice/slicing/objects/AllTests.java index 50617ebb184..7703468ef52 100644 --- a/java-compat/test/src/main/java/test/Ice/slicing/objects/AllTests.java +++ b/java-compat/test/src/main/java/test/Ice/slicing/objects/AllTests.java @@ -294,7 +294,7 @@ public class AllTests response(Ice.Object o) { test(o instanceof Ice.UnknownSlicedValue); - test(((Ice.UnknownSlicedValue)o).getUnknownTypeId().equals("::Test::SUnknown")); + test(((Ice.UnknownSlicedValue)o).ice_id().equals("::Test::SUnknown")); callback.called(); } @@ -1540,7 +1540,7 @@ public class AllTests o = test.SUnknownAsObject(); test(!test.ice_getEncodingVersion().equals(Ice.Util.Encoding_1_0)); test(o instanceof Ice.UnknownSlicedValue); - test(((Ice.UnknownSlicedValue)o).getUnknownTypeId().equals("::Test::SUnknown")); + test(((Ice.UnknownSlicedValue)o).ice_id().equals("::Test::SUnknown")); test(((Ice.UnknownSlicedValue)o).ice_getSlicedData() != null); test.checkSUnknown(o); } diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/UnknownSlicedValue.java b/java/src/Ice/src/main/java/com/zeroc/Ice/UnknownSlicedValue.java index 41ce5a574e4..648fd2f611a 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/UnknownSlicedValue.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/UnknownSlicedValue.java @@ -25,25 +25,26 @@ public final class UnknownSlicedValue extends Value } /** - * Determine the Slice type ID associated with this object. + * Returns the sliced data if the value has a preserved-slice base class and has been sliced during + * un-marshaling of the value, null is returned otherwise. * - * @return The type ID. + * @return The sliced data or null. **/ - public String getUnknownTypeId() + @Override + public SlicedData ice_getSlicedData() { - return _unknownTypeId; + return _slicedData; } /** - * Returns the sliced data if the value has a preserved-slice base class and has been sliced during - * un-marshaling of the value, null is returned otherwise. + * Determine the Slice type ID associated with this object. * - * @return The sliced data or null. + * @return The type ID. **/ @Override - public SlicedData ice_getSlicedData() + public String ice_id() { - return _slicedData; + return _unknownTypeId; } @Override diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/UserException.java b/java/src/Ice/src/main/java/com/zeroc/Ice/UserException.java index 32a57624c4a..c09452fdbcb 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/UserException.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/UserException.java @@ -65,6 +65,17 @@ public abstract class UserException extends java.lang.Exception implements Clone public abstract String ice_id(); /** + * Returns the sliced data if the exception has a preserved-slice base class and has been sliced during + * un-marshaling, null is returned otherwise. + * + * @return The sliced data or null. + **/ + public com.zeroc.Ice.SlicedData ice_getSlicedData() + { + return null; + } + + /** * Returns a string representation of this exception. * * @return A string representation of this exception. diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Ex.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Ex.java index c3bedd51bb7..a784cb38b12 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Ex.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Ex.java @@ -21,7 +21,7 @@ public class Ex if(v instanceof com.zeroc.Ice.UnknownSlicedValue) { com.zeroc.Ice.UnknownSlicedValue usv = (com.zeroc.Ice.UnknownSlicedValue)v; - throw new com.zeroc.Ice.NoValueFactoryException("", usv.getUnknownTypeId()); + throw new com.zeroc.Ice.NoValueFactoryException("", usv.ice_id()); } String type = v.ice_id(); @@ -48,7 +48,7 @@ public class Ex if(v instanceof com.zeroc.Ice.UnknownSlicedValue) { com.zeroc.Ice.UnknownSlicedValue usv = (com.zeroc.Ice.UnknownSlicedValue)v; - throw new com.zeroc.Ice.NoValueFactoryException("", usv.getUnknownTypeId()); + throw new com.zeroc.Ice.NoValueFactoryException("", usv.ice_id()); } String type = v.ice_id(); diff --git a/java/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java b/java/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java index 8445d06ae74..610957cce0f 100644 --- a/java/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java +++ b/java/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java @@ -652,6 +652,49 @@ public class AllTests out.print("preserved exceptions... "); out.flush(); { + try + { + test.unknownPreservedAsBase(); + test(false); + } + catch(Base ex) + { + if(test.ice_getEncodingVersion().equals(com.zeroc.Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + com.zeroc.Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId.equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.equals("::Test::SPreserved2")); + } + } + + try + { + test.unknownPreservedAsKnownPreserved(); + test(false); + } + catch(KnownPreserved ex) + { + test(ex.kp.equals("preserved")); + if(test.ice_getEncodingVersion().equals(com.zeroc.Ice.Util.Encoding_1_0)) + { + test(ex.ice_getSlicedData() == null); + } + else + { + com.zeroc.Ice.SlicedData slicedData = ex.ice_getSlicedData(); + test(slicedData != null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId.equals("::Test::SPreserved1")); + test(slicedData.slices[0].typeId.equals("::Test::SPreserved2")); + } + } + com.zeroc.Ice.ObjectAdapter adapter = communicator.createObjectAdapter(""); RelayPrx relay = RelayPrx.uncheckedCast(adapter.addWithUUID(new RelayI())); adapter.activate(); diff --git a/java/test/src/main/java/test/Ice/slicing/objects/AllTests.java b/java/test/src/main/java/test/Ice/slicing/objects/AllTests.java index 30c55660224..1a96bd0dd87 100644 --- a/java/test/src/main/java/test/Ice/slicing/objects/AllTests.java +++ b/java/test/src/main/java/test/Ice/slicing/objects/AllTests.java @@ -377,7 +377,7 @@ public class AllTests o = test.SUnknownAsObject(); test(!test.ice_getEncodingVersion().equals(Util.Encoding_1_0)); test(o instanceof com.zeroc.Ice.UnknownSlicedValue); - test(((com.zeroc.Ice.UnknownSlicedValue)o).getUnknownTypeId().equals("::Test::SUnknown")); + test(((com.zeroc.Ice.UnknownSlicedValue)o).ice_id().equals("::Test::SUnknown")); test(((com.zeroc.Ice.UnknownSlicedValue)o).ice_getSlicedData() != null); test.checkSUnknown(o); } @@ -413,7 +413,7 @@ public class AllTests { test(ex == null); test(result instanceof com.zeroc.Ice.UnknownSlicedValue); - test(((com.zeroc.Ice.UnknownSlicedValue)result).getUnknownTypeId().equals("::Test::SUnknown")); + test(((com.zeroc.Ice.UnknownSlicedValue)result).ice_id().equals("::Test::SUnknown")); cb.called(); }); cb.check(); diff --git a/js/src/Ice/Exception.js b/js/src/Ice/Exception.js index 5e3bb55b7fd..6020e644862 100644 --- a/js/src/Ice/Exception.js +++ b/js/src/Ice/Exception.js @@ -177,6 +177,11 @@ class UserException extends Exception return "::Ice::UserException"; } + ice_getSlicedData() + { + return null; + } + _write(os) { os.startException(null); @@ -273,8 +278,14 @@ const readPreserved = function(is) this._slicedData = is.endException(true); }; +const ice_getSlicedData = function() +{ + return this._slicedData; +} + Ice.Slice.PreservedUserException = function(ex) { + ex.prototype.ice_getSlicedData = ice_getSlicedData; ex.prototype._write = writePreserved; ex.prototype._read = readPreserved; }; diff --git a/js/src/Ice/UnknownSlicedValue.js b/js/src/Ice/UnknownSlicedValue.js index ae059194f7e..8449934bf45 100644 --- a/js/src/Ice/UnknownSlicedValue.js +++ b/js/src/Ice/UnknownSlicedValue.js @@ -63,14 +63,14 @@ class UnknownSlicedValue extends Ice.Value this._unknownTypeId = unknownTypeId; } - getUnknownTypeId() + ice_getSlicedData() { - return this._unknownTypeId; + return this._slicedData; } - ice_getSlicedData() + ice_id() { - return this._slicedData; + return this._unknownTypeId; } _iceWrite(os) diff --git a/js/test/Ice/slicing/exceptions/Client.js b/js/test/Ice/slicing/exceptions/Client.js index 0646d1d2299..4d04b0960ad 100644 --- a/js/test/Ice/slicing/exceptions/Client.js +++ b/js/test/Ice/slicing/exceptions/Client.js @@ -247,6 +247,47 @@ { test(false); } + + out.write("preserved exceptions...") + return prx.unknownPreservedAsBase(); + } + ).then( + failCB, + ex => + { + if(prx.ice_getEncodingVersion().equals(Ice.Encoding_1_0)) + { + test(ex.ice_getSlicedData() === null); + } + else + { + let slicedData = ex.ice_getSlicedData(); + test(slicedData !== null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId == "::Test::SPreserved1"); + test(slicedData.slices[0].typeId == "::Test::SPreserved2"); + } + + return prx.unknownPreservedAsKnownPreserved(); + } + ).then( + failCB, + ex => + { + test(ex.kp == "preserved"); + if(prx.ice_getEncodingVersion().equals(Ice.Encoding_1_0)) + { + test(ex.ice_getSlicedData() === null); + } + else + { + let slicedData = ex.ice_getSlicedData(); + test(slicedData !== null); + test(slicedData.slices.length == 2); + test(slicedData.slices[1].typeId == "::Test::SPreserved1"); + test(slicedData.slices[0].typeId == "::Test::SPreserved2"); + } + out.writeLine("ok"); return prx.shutdown(); } diff --git a/js/test/Ice/slicing/objects/Client.js b/js/test/Ice/slicing/objects/Client.js index c17c79613c8..fdf0ff002d9 100644 --- a/js/test/Ice/slicing/objects/Client.js +++ b/js/test/Ice/slicing/objects/Client.js @@ -136,8 +136,8 @@ { test(!prx.ice_getEncodingVersion().equals(Ice.Encoding_1_0)); test(obj instanceof Ice.UnknownSlicedValue); - test(obj.getUnknownTypeId() == "::Test::SUnknown"); - test(obj.ice_getSlicedData() != null); + test(obj.ice_id() == "::Test::SUnknown"); + test(obj.ice_getSlicedData() !== null); return prx.checkSUnknown(obj); }, ex => diff --git a/objective-c/include/objc/Ice/Exception.h b/objective-c/include/objc/Ice/Exception.h index 18d50d9ffbd..00a7870f55b 100644 --- a/objective-c/include/objc/Ice/Exception.h +++ b/objective-c/include/objc/Ice/Exception.h @@ -16,6 +16,7 @@ // @protocol ICEOutputStream; @protocol ICEInputStream; +@protocol ICESlicedData; @class NSCoder; @@ -40,6 +41,7 @@ ICE_API @interface ICELocalException : ICEException @end ICE_API @interface ICEUserException : ICEException +-(id<ICESlicedData>)ice_getSlicedData; -(BOOL)iceUsesClasses; -(void)iceWrite:(id<ICEOutputStream>)stream; -(void) iceWriteImpl:(id<ICEOutputStream>)os; diff --git a/objective-c/include/objc/Ice/SlicedData.h b/objective-c/include/objc/Ice/SlicedData.h index b5984caf659..f5575920f5a 100644 --- a/objective-c/include/objc/Ice/SlicedData.h +++ b/objective-c/include/objc/Ice/SlicedData.h @@ -30,6 +30,4 @@ ICE_API @interface ICEUnknownSlicedValue : ICEObject NSString* unknownTypeId_; id<ICESlicedData> slicedData_; } --(NSString*) getUnknownTypeId; --(id<ICESlicedData>) getSlicedData; @end diff --git a/objective-c/src/Ice/Exception.mm b/objective-c/src/Ice/Exception.mm index c0db762d8f7..370f9d92153 100644 --- a/objective-c/src/Ice/Exception.mm +++ b/objective-c/src/Ice/Exception.mm @@ -171,6 +171,11 @@ localExceptionToString(const Ice::LocalException& ex) @end @implementation ICEUserException +-(id<ICESlicedData>)ice_getSlicedData +{ + return nil; +} + -(BOOL)iceUsesClasses { return NO; diff --git a/objective-c/src/Ice/SlicedData.mm b/objective-c/src/Ice/SlicedData.mm index 6173d2e5ced..58d8d2e6fec 100644 --- a/objective-c/src/Ice/SlicedData.mm +++ b/objective-c/src/Ice/SlicedData.mm @@ -64,14 +64,14 @@ [super dealloc]; } --(NSString*) getUnknownTypeId +-(id<ICESlicedData>) ice_getSlicedData { - return [[unknownTypeId_ retain] autorelease]; + return [[slicedData_ retain] autorelease]; } --(ICESlicedData*) getSlicedData +-(NSString*) ice_id { - return [[slicedData_ retain] autorelease]; + return [[unknownTypeId_ retain] autorelease]; } -(void) iceWrite:(id<ICEOutputStream>)os @@ -91,9 +91,4 @@ unknownTypeId_ = toNSString(slicedData->slices[0]->typeId); } --(ICESlicedData*) ice_getSlicedData -{ - return [[slicedData_ retain] autorelease]; -} - @end diff --git a/objective-c/test/Ice/slicing/exceptions/AllTests.m b/objective-c/test/Ice/slicing/exceptions/AllTests.m index 41af9beedef..85cf4a9c72e 100644 --- a/objective-c/test/Ice/slicing/exceptions/AllTests.m +++ b/objective-c/test/Ice/slicing/exceptions/AllTests.m @@ -685,6 +685,43 @@ slicingExceptionsAllTests(id<ICECommunicator> communicator) tprintf("preserved exceptions... "); { + @try + { + [test unknownPreservedAsBase]; + test(false); + } + @catch(TestSlicingExceptionsClientBase* ex) + { + if([[test ice_getEncodingVersion] isEqual:ICEEncoding_1_0]) + { + test([ex ice_getSlicedData] == nil); + } + else + { + id<ICESlicedData> slicedData = [ex ice_getSlicedData]; + test(slicedData != nil); + } + } + + @try + { + [test unknownPreservedAsKnownPreserved]; + test(false); + } + @catch(TestSlicingExceptionsClientKnownPreserved* ex) + { + test([ex.kp isEqualToString:@"preserved"]); + if([[test ice_getEncodingVersion] isEqual:ICEEncoding_1_0]) + { + test([ex ice_getSlicedData] == nil); + } + else + { + id<ICESlicedData> slicedData = [ex ice_getSlicedData]; + test(slicedData != nil); + } + } + id<ICEObjectAdapter> adapter = [communicator createObjectAdapter:@""]; TestSlicingExceptionsClientRelayPrx* relay = [TestSlicingExceptionsClientRelayPrx uncheckedCast:[adapter addWithUUID:[RelayI relay]]]; diff --git a/objective-c/test/Ice/slicing/exceptions/TestI.m b/objective-c/test/Ice/slicing/exceptions/TestI.m index d9587ee8e8d..a2b022f2afb 100644 --- a/objective-c/test/Ice/slicing/exceptions/TestI.m +++ b/objective-c/test/Ice/slicing/exceptions/TestI.m @@ -120,7 +120,7 @@ -(void) unknownPreservedAsBase:(ICECurrent*)current { - TestSlicingExceptionsServerSPreserved2* ex = [TestSlicingExceptionsServerSPreserved2 alloc]; + TestSlicingExceptionsServerSPreserved2* ex = [TestSlicingExceptionsServerSPreserved2 sPreserved2]; ex.b = @"base"; ex.kp = @"preserved"; ex.kpd = @"derived"; @@ -131,7 +131,7 @@ -(void) unknownPreservedAsKnownPreserved:(ICECurrent*)current { - TestSlicingExceptionsServerSPreserved2* ex = [TestSlicingExceptionsServerSPreserved2 alloc]; + TestSlicingExceptionsServerSPreserved2* ex = [TestSlicingExceptionsServerSPreserved2 sPreserved2]; ex.b = @"base"; ex.kp = @"preserved"; ex.kpd = @"derived"; diff --git a/objective-c/test/Ice/slicing/objects/AllTests.m b/objective-c/test/Ice/slicing/objects/AllTests.m index 8856fe40cd8..3b036b68683 100644 --- a/objective-c/test/Ice/slicing/objects/AllTests.m +++ b/objective-c/test/Ice/slicing/objects/AllTests.m @@ -938,7 +938,7 @@ slicingObjectsAllTests(id<ICECommunicator> communicator) o = [test SUnknownAsObject]; test(![[test ice_getEncodingVersion] isEqual:ICEEncoding_1_0]); test([o isKindOfClass:[ICEUnknownSlicedValue class]]); - test([[((ICEUnknownSlicedValue*)o) getUnknownTypeId] isEqualToString:@"::Test::SUnknown"]); + test([[((ICEUnknownSlicedValue*)o) ice_id] isEqualToString:@"::Test::SUnknown"]); test([((ICEUnknownSlicedValue*)o) ice_getSlicedData] != nil); [test checkSUnknown:o]; [[o ice_getSlicedData] clear]; diff --git a/objective-c/test/Ice/slicing/objects/TestI.m b/objective-c/test/Ice/slicing/objects/TestI.m index 8b5a76e6dd3..b32e8cecac9 100644 --- a/objective-c/test/Ice/slicing/objects/TestI.m +++ b/objective-c/test/Ice/slicing/objects/TestI.m @@ -62,9 +62,11 @@ static void breakCycles(id o) TestSlicingObjectsServerPNode* curr = o; while(curr && o != curr.next) { - TestSlicingObjectsServerPNode* next = curr.next; + curr = curr.next; + } + if(curr && o == curr.next) + { curr.next = nil; - curr = next; } } if([o isKindOfClass:[TestSlicingObjectsServerPSUnknown class]]) @@ -75,7 +77,7 @@ static void breakCycles(id o) if([o isKindOfClass:[TestSlicingObjectsServerPSUnknown2 class]]) { TestSlicingObjectsServerPSUnknown2* p = (TestSlicingObjectsServerPSUnknown2*)o; - breakCycles(p.pb); + p.pb = nil; } if([o isKindOfClass:[TestSlicingObjectsServerBaseException class]]) { @@ -143,7 +145,7 @@ static void breakCycles(id o) +(id) serverI { TestSlicingObjectsServerI* impl = [[TestSlicingObjectsServerI alloc] init]; - impl->objects_ = [NSMutableArray array]; + impl->objects_ = [[NSMutableArray alloc] init]; return ICE_AUTORELEASE(impl); } -(void) dealloc @@ -153,6 +155,7 @@ static void breakCycles(id o) breakCycles(o); } #if !__has_feature(objc_arc) + [objects_ release]; [super dealloc]; #endif } diff --git a/php/lib/Ice_no_ns.php b/php/lib/Ice_no_ns.php index a54d859d72d..cdb27dfd203 100644 --- a/php/lib/Ice_no_ns.php +++ b/php/lib/Ice_no_ns.php @@ -128,7 +128,10 @@ class Ice_UnknownSlicedValue extends Ice_Value { } - public $unknownTypeId; + public function ice_id() + { + return $this->unknownTypeId; + } } $Ice__t_UnknownSlicedValue = IcePHP_defineClass('::Ice::UnknownSlicedValue', 'Ice_UnknownSlicedValue', -1, true, false, $Ice__t_Value, null); diff --git a/php/lib/Ice_ns.php b/php/lib/Ice_ns.php index 674deb13eba..00dbe264c1b 100644 --- a/php/lib/Ice_ns.php +++ b/php/lib/Ice_ns.php @@ -132,7 +132,10 @@ namespace Ice { } - public $unknownTypeId; + public function ice_id() + { + return $this->unknownTypeId; + } } $Ice__t_UnknownSlicedValue = IcePHP_defineClass('::Ice::UnknownSlicedValue', "\\Ice\\UnknownSlicedValue", -1, true, false, $Ice__t_Value, null); diff --git a/php/test/Ice/slicing/objects/Client.php b/php/test/Ice/slicing/objects/Client.php index 140294b400e..af80c8c67fb 100644 --- a/php/test/Ice/slicing/objects/Client.php +++ b/php/test/Ice/slicing/objects/Client.php @@ -125,7 +125,7 @@ function allTests($communicator) $o = $test->SUnknownAsObject(); test($test->ice_getEncodingVersion() != $Ice_Encoding_1_0); test($o instanceof $usocls); - test($o->unknownTypeId == "::Test::SUnknown"); + test($o->ice_id() == "::Test::SUnknown"); test($o->ice_getSlicedData() != null); $test->checkSUnknown($o); } diff --git a/python/python/Ice/__init__.py b/python/python/Ice/__init__.py index 23ff7f53643..73212f1e2bb 100644 --- a/python/python/Ice/__init__.py +++ b/python/python/Ice/__init__.py @@ -499,7 +499,14 @@ class LocalException(Exception): class UserException(Exception): '''The base class for all user-defined exceptions.''' - pass + + def ice_getSlicedData(self): + '''Returns the sliced data if the value has a preserved-slice base class and has been sliced during +un-marshaling of the value, null is returned otherwise. +Returns: + The sliced data or null. +''' + return getattr(self, "_ice_slicedData", None); class EnumBase(object): def __init__(self, _n, _v): @@ -600,7 +607,9 @@ class UnknownSlicedValue(Value): # Members: # # unknownTypeId - string - pass + + def ice_id(self): + return self.unknownTypeId def getSliceDir(): '''Convenience function for locating the directory containing the Slice files.''' diff --git a/python/test/Ice/slicing/exceptions/AllTests.py b/python/test/Ice/slicing/exceptions/AllTests.py index e80429d8748..017557bac16 100644 --- a/python/test/Ice/slicing/exceptions/AllTests.py +++ b/python/test/Ice/slicing/exceptions/AllTests.py @@ -510,6 +510,34 @@ def allTests(communicator): sys.stdout.write("preserved exceptions... ") sys.stdout.flush() + + try: + t.unknownPreservedAsBase(); + test(False); + except Test.Base as ex: + if t.ice_getEncodingVersion() == Ice.Encoding_1_0: + test(ex.ice_getSlicedData() is None) + else: + slicedData = ex.ice_getSlicedData(); + test(slicedData); + test(len(slicedData.slices) == 2); + test(slicedData.slices[1].typeId == "::Test::SPreserved1"); + test(slicedData.slices[0].typeId == "::Test::SPreserved2"); + + try: + t.unknownPreservedAsKnownPreserved(); + test(False); + except Test.KnownPreserved as ex: + test(ex.kp == "preserved") + if t.ice_getEncodingVersion() == Ice.Encoding_1_0: + test(ex.ice_getSlicedData() is None) + else: + slicedData = ex.ice_getSlicedData(); + test(slicedData); + test(len(slicedData.slices) == 2); + test(slicedData.slices[1].typeId == "::Test::SPreserved1"); + test(slicedData.slices[0].typeId == "::Test::SPreserved2"); + adapter = communicator.createObjectAdapter("") relay = Test.RelayPrx.uncheckedCast(adapter.addWithUUID(RelayI())) adapter.activate() diff --git a/python/test/Ice/slicing/objects/ServerPrivate.ice b/python/test/Ice/slicing/objects/ServerPrivate.ice index be4a3b3f131..473e0219916 100644 --- a/python/test/Ice/slicing/objects/ServerPrivate.ice +++ b/python/test/Ice/slicing/objects/ServerPrivate.ice @@ -22,6 +22,7 @@ class SBSUnknownDerived extends SBase class SUnknown { string su; + SUnknown cycle; } class D2 extends B diff --git a/ruby/ruby/Ice.rb b/ruby/ruby/Ice.rb index 9c8f9abb656..e1308c7ac1c 100644 --- a/ruby/ruby/Ice.rb +++ b/ruby/ruby/Ice.rb @@ -161,7 +161,9 @@ module Ice # UnknownSlicedValue. # class UnknownSlicedValue < Value - attr_accessor :unknownTypeId + def ice_id + return @unknownTypeId + end end T_UnknownSlicedValue = Ice.__declareClass('::Ice::UnknownSlicedValue') T_UnknownSlicedValue.defineClass(UnknownSlicedValue, -1, true, false, T_Value, []) diff --git a/ruby/test/Ice/slicing/objects/AllTests.rb b/ruby/test/Ice/slicing/objects/AllTests.rb index 2141c03b6af..efb0773096e 100644 --- a/ruby/test/Ice/slicing/objects/AllTests.rb +++ b/ruby/test/Ice/slicing/objects/AllTests.rb @@ -111,7 +111,7 @@ def allTests(communicator) o = t.SUnknownAsObject() test(t.ice_getEncodingVersion() != Ice::Encoding_1_0) test(o.is_a?(Ice::UnknownSlicedValue)) - test(o.unknownTypeId == "::Test::SUnknown") + test(o.ice_id() == "::Test::SUnknown") test(o.ice_getSlicedData() != nil) t.checkSUnknown(o) rescue Ice::NoValueFactoryException |