summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-07-06 00:18:03 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-07-06 00:18:03 +0200
commit54d8f3fb0d3d53f851051980f1bc941c4e39a60f (patch)
tree0d8259f0cd48b3ba0a3792556821aa41d6f718a7
parentFixed ICE-8223 - renamed cloneImpl to _iceCloneImpl (diff)
downloadice-54d8f3fb0d3d53f851051980f1bc941c4e39a60f.tar.bz2
ice-54d8f3fb0d3d53f851051980f1bc941c4e39a60f.tar.xz
ice-54d8f3fb0d3d53f851051980f1bc941c4e39a60f.zip
Added Ice::UserException::ice_getSlicedData and Ice::UnkownSlicedValue::ice_id methods
-rw-r--r--CHANGELOG-3.7.md4
-rw-r--r--cpp/include/Ice/Exception.h12
-rw-r--r--cpp/include/Ice/SlicedData.h4
-rw-r--r--cpp/src/Ice/Exception.cpp8
-rw-r--r--cpp/src/Ice/SlicedData.cpp12
-rw-r--r--cpp/src/slice2cpp/Gen.cpp23
-rw-r--r--cpp/src/slice2cs/Gen.cpp7
-rw-r--r--cpp/src/slice2java/Gen.cpp7
-rw-r--r--cpp/src/slice2java/GenCompat.cpp6
-rw-r--r--cpp/src/slice2objc/Gen.cpp7
-rw-r--r--cpp/test/Ice/optional/AllTests.cpp12
-rw-r--r--cpp/test/Ice/slicing/exceptions/AllTests.cpp61
-rw-r--r--cpp/test/Ice/slicing/objects/AllTests.cpp6
-rw-r--r--csharp/src/Ice/Exception.cs12
-rw-r--r--csharp/src/Ice/UnknownSlicedValue.cs18
-rw-r--r--csharp/test/Ice/slicing/exceptions/AllTests.cs43
-rw-r--r--csharp/test/Ice/slicing/objects/AllTests.cs6
-rw-r--r--java-compat/src/Ice/src/main/java/Ice/UnknownSlicedValue.java19
-rw-r--r--java-compat/src/Ice/src/main/java/Ice/UserException.java12
-rw-r--r--java-compat/src/Ice/src/main/java/IceInternal/Ex.java2
-rw-r--r--java-compat/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java43
-rw-r--r--java-compat/test/src/main/java/test/Ice/slicing/objects/AllTests.java4
-rw-r--r--java/src/Ice/src/main/java/com/zeroc/Ice/UnknownSlicedValue.java19
-rw-r--r--java/src/Ice/src/main/java/com/zeroc/Ice/UserException.java11
-rw-r--r--java/src/Ice/src/main/java/com/zeroc/IceInternal/Ex.java4
-rw-r--r--java/test/src/main/java/test/Ice/slicing/exceptions/AllTests.java43
-rw-r--r--java/test/src/main/java/test/Ice/slicing/objects/AllTests.java4
-rw-r--r--js/src/Ice/Exception.js11
-rw-r--r--js/src/Ice/UnknownSlicedValue.js8
-rw-r--r--js/test/Ice/slicing/exceptions/Client.js41
-rw-r--r--js/test/Ice/slicing/objects/Client.js4
-rw-r--r--objective-c/include/objc/Ice/Exception.h2
-rw-r--r--objective-c/include/objc/Ice/SlicedData.h2
-rw-r--r--objective-c/src/Ice/Exception.mm5
-rw-r--r--objective-c/src/Ice/SlicedData.mm13
-rw-r--r--objective-c/test/Ice/slicing/exceptions/AllTests.m37
-rw-r--r--objective-c/test/Ice/slicing/exceptions/TestI.m4
-rw-r--r--objective-c/test/Ice/slicing/objects/AllTests.m2
-rw-r--r--objective-c/test/Ice/slicing/objects/TestI.m11
-rw-r--r--php/lib/Ice_no_ns.php5
-rw-r--r--php/lib/Ice_ns.php5
-rw-r--r--php/test/Ice/slicing/objects/Client.php2
-rw-r--r--python/python/Ice/__init__.py13
-rw-r--r--python/test/Ice/slicing/exceptions/AllTests.py28
-rw-r--r--python/test/Ice/slicing/objects/ServerPrivate.ice1
-rw-r--r--ruby/ruby/Ice.rb4
-rw-r--r--ruby/test/Ice/slicing/objects/AllTests.rb2
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