summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2018-10-23 15:10:49 +0200
committerJose <jose@zeroc.com>2018-10-23 15:15:55 +0200
commitff2b0065aa7de98adb50d15d8b4e999f56b1a06d (patch)
treedc47e5e90e49034f17bc1b8a7999b27293af72ac
parentFixed IceGrid bug in the algorithm to find Query objects, fixes #255 (diff)
downloadice-ff2b0065aa7de98adb50d15d8b4e999f56b1a06d.tar.bz2
ice-ff2b0065aa7de98adb50d15d8b4e999f56b1a06d.tar.xz
ice-ff2b0065aa7de98adb50d15d8b4e999f56b1a06d.zip
Fixed slice2matlab generated code type for dictionary data members
Close #256
-rw-r--r--CHANGELOG-3.7.md6
-rw-r--r--cpp/src/slice2matlab/Main.cpp8
-rw-r--r--cpp/test/Ice/objects/AllTests.cpp29
-rw-r--r--cpp/test/Ice/objects/Test.ice15
-rw-r--r--cpp/test/Ice/objects/TestI.cpp7
-rw-r--r--cpp/test/Ice/objects/TestI.h2
-rw-r--r--csharp/test/Ice/objects/AllTests.cs23
-rw-r--r--csharp/test/Ice/objects/InitialI.cs7
-rw-r--r--csharp/test/Ice/objects/Test.ice15
-rw-r--r--java-compat/test/src/main/java/test/Ice/objects/AllTests.java27
-rw-r--r--java-compat/test/src/main/java/test/Ice/objects/InitialI.java10
-rw-r--r--java-compat/test/src/main/java/test/Ice/objects/Test.ice15
-rw-r--r--java/test/src/main/java/test/Ice/objects/AllTests.java27
-rw-r--r--java/test/src/main/java/test/Ice/objects/InitialI.java9
-rw-r--r--java/test/src/main/java/test/Ice/objects/Test.ice15
-rw-r--r--js/test/Ice/objects/Client.js23
-rw-r--r--js/test/Ice/objects/Test.ice15
-rw-r--r--matlab/test/Ice/objects/AllTests.m20
-rw-r--r--matlab/test/Ice/objects/Test.ice15
-rw-r--r--objective-c/test/Ice/objects/AllTests.m23
-rw-r--r--objective-c/test/Ice/objects/ObjectsTest.ice14
-rw-r--r--objective-c/test/Ice/objects/TestI.h1
-rw-r--r--objective-c/test/Ice/objects/TestI.m6
-rw-r--r--python/test/Ice/objects/AllTests.py20
-rw-r--r--python/test/Ice/objects/Test.ice15
-rw-r--r--python/test/Ice/objects/TestI.py3
-rw-r--r--ruby/test/Ice/objects/AllTests.rb19
-rw-r--r--ruby/test/Ice/objects/Test.ice15
28 files changed, 401 insertions, 3 deletions
diff --git a/CHANGELOG-3.7.md b/CHANGELOG-3.7.md
index 7d7a004c3b9..0dd4889e276 100644
--- a/CHANGELOG-3.7.md
+++ b/CHANGELOG-3.7.md
@@ -67,6 +67,12 @@ These are the changes since Ice 3.7.1 included in this pre-release.
- Slice to JavaScript compiler can now generate TypeScript declaration files
for JavaScript generated code using `--typescript` command line option.
+## Matlab Changes
+
+- Fixed a bug that cause slice2matab generated code to throw type conversion
+ exception, this affects classes or struct containing an array mapped to an
+ structure array.
+
# Changes in Ice 3.7.1
These are the changes since Ice 3.7.0.
diff --git a/cpp/src/slice2matlab/Main.cpp b/cpp/src/slice2matlab/Main.cpp
index 051e37b76ac..c673feb482b 100644
--- a/cpp/src/slice2matlab/Main.cpp
+++ b/cpp/src/slice2matlab/Main.cpp
@@ -362,7 +362,11 @@ typeToString(const TypePtr& type)
DictionaryPtr dict = DictionaryPtr::dynamicCast(type);
if(dict)
{
- if(!StructPtr::dynamicCast(dict->keyType()))
+ if(StructPtr::dynamicCast(dict->keyType()))
+ {
+ return "struct";
+ }
+ else
{
return "containers.Map";
}
@@ -3599,7 +3603,7 @@ CodeVisitor::visitDictionary(const DictionaryPtr& p)
if(cls || convert)
{
- out << nl << "function r = convert(d, obj)";
+ out << nl << "function r = convert(d)";
out.inc();
if(st)
{
diff --git a/cpp/test/Ice/objects/AllTests.cpp b/cpp/test/Ice/objects/AllTests.cpp
index a7ef9968ca8..7633f3732bb 100644
--- a/cpp/test/Ice/objects/AllTests.cpp
+++ b/cpp/test/Ice/objects/AllTests.cpp
@@ -536,5 +536,34 @@ allTests(Test::TestHelper* helper)
{
}
+ cout << "testing class containing complex dictionary... " << flush;
+ {
+ Test::MPtr m = ICE_MAKE_SHARED(Test::M);
+
+ Test::StructKey k1;
+ k1.i = 1;
+ k1.s = "1";
+ m->v[k1] = ICE_MAKE_SHARED(L, "one");
+
+ Test::StructKey k2;
+ k2.i = 2;
+ k2.s = "2";
+ m->v[k2] = ICE_MAKE_SHARED(L, "two");
+
+ Test::MPtr m1;
+ Test::MPtr m2 = initial->opM(m, m1);
+
+ test(m1->v.size() == 2);
+ test(m2->v.size() == 2);
+
+ test(m1->v[k1]->data == "one");
+ test(m2->v[k1]->data == "one");
+
+ test(m1->v[k2]->data == "two");
+ test(m2->v[k2]->data == "two");
+
+ }
+ cout << "ok" << endl;
+
return initial;
}
diff --git a/cpp/test/Ice/objects/Test.ice b/cpp/test/Ice/objects/Test.ice
index e3d8b9cca1e..e14044e7118 100644
--- a/cpp/test/Ice/objects/Test.ice
+++ b/cpp/test/Ice/objects/Test.ice
@@ -190,6 +190,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -232,6 +245,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
interface TestIntf
diff --git a/cpp/test/Ice/objects/TestI.cpp b/cpp/test/Ice/objects/TestI.cpp
index d4d99f7b330..8bd3f8ef35f 100644
--- a/cpp/test/Ice/objects/TestI.cpp
+++ b/cpp/test/Ice/objects/TestI.cpp
@@ -371,6 +371,13 @@ InitialI::throwEDerived(const Ice::Current&)
ICE_MAKE_SHARED(A1, "a4"));
}
+Test::MPtr
+InitialI::opM(ICE_IN(Test::MPtr) v1, Test::MPtr& v2, const Ice::Current&)
+{
+ v2 = v1;
+ return v1;
+}
+
bool
UnexpectedObjectExceptionTestI::ice_invoke(ICE_IN(std::vector<Ice::Byte>),
std::vector<Ice::Byte>& outParams,
diff --git a/cpp/test/Ice/objects/TestI.h b/cpp/test/Ice/objects/TestI.h
index 64397b0f1c4..f134202d575 100644
--- a/cpp/test/Ice/objects/TestI.h
+++ b/cpp/test/Ice/objects/TestI.h
@@ -145,6 +145,8 @@ public:
virtual void throwInnerEx(const Ice::Current&);
virtual void throwInnerSubEx(const Ice::Current&);
+ virtual Test::MPtr opM(ICE_IN(Test::MPtr), Test::MPtr&, const Ice::Current&);
+
private:
Ice::ObjectAdapterPtr _adapter;
diff --git a/csharp/test/Ice/objects/AllTests.cs b/csharp/test/Ice/objects/AllTests.cs
index 671302c8f43..98f6c968d8f 100644
--- a/csharp/test/Ice/objects/AllTests.cs
+++ b/csharp/test/Ice/objects/AllTests.cs
@@ -487,6 +487,29 @@ namespace Ice
var sc1 = new SC1();
test(sc1.id.Equals("My id"));
output.WriteLine("ok");
+
+ output.Write("testing class containing complex dictionary... ");
+ output.Flush();
+ {
+ var m = new Test.M();
+ m.v = new Dictionary<StructKey, L>();
+ var k1 = new StructKey(1, "1");
+ m.v[k1] = new L("one");
+ var k2 = new StructKey(2, "2");
+ m.v[k2] = new L("two");
+ Test.M m1;
+ var m2 = initial.opM(m, out m1);
+ test(m1.v.Count == 2);
+ test(m2.v.Count == 2);
+
+ test(m1.v[k1].data.Equals("one"));
+ test(m2.v[k1].data.Equals("one"));
+
+ test(m1.v[k2].data.Equals("two"));
+ test(m2.v[k2].data.Equals("two"));
+
+ }
+ output.WriteLine("ok");
return initial;
}
}
diff --git a/csharp/test/Ice/objects/InitialI.cs b/csharp/test/Ice/objects/InitialI.cs
index c96d399d943..aacaae5d355 100644
--- a/csharp/test/Ice/objects/InitialI.cs
+++ b/csharp/test/Ice/objects/InitialI.cs
@@ -194,6 +194,13 @@ namespace Ice
return Task.FromResult(new Test.Initial_GetAMDMBMarshaledResult(_b1, current));
}
+ public override Test.M
+ opM(Test.M v1, out Test.M v2, Ice.Current current)
+ {
+ v2 = v1;
+ return v1;
+ }
+
private Ice.ObjectAdapter _adapter;
private Test.B _b1;
private Test.B _b2;
diff --git a/csharp/test/Ice/objects/Test.ice b/csharp/test/Ice/objects/Test.ice
index 215b9e2a262..64ebcc98065 100644
--- a/csharp/test/Ice/objects/Test.ice
+++ b/csharp/test/Ice/objects/Test.ice
@@ -185,6 +185,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -228,6 +241,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
class Empty
diff --git a/java-compat/test/src/main/java/test/Ice/objects/AllTests.java b/java-compat/test/src/main/java/test/Ice/objects/AllTests.java
index fc2bbf83a21..40b104ade06 100644
--- a/java-compat/test/src/main/java/test/Ice/objects/AllTests.java
+++ b/java-compat/test/src/main/java/test/Ice/objects/AllTests.java
@@ -39,6 +39,9 @@ import test.Ice.objects.Test.J;
import test.Ice.objects.Test.Recursive;
import test.Ice.objects.Test.UnexpectedObjectExceptionTestPrx;
import test.Ice.objects.Test.UnexpectedObjectExceptionTestPrxHelper;
+import test.Ice.objects.Test.StructKey;
+import test.Ice.objects.Test.M;
+import test.Ice.objects.Test.MHolder;
public class AllTests
{
@@ -384,6 +387,30 @@ public class AllTests
test(communicator.getValueFactoryManager().find("TestOF") != null);
out.println("ok");
+ out.print("testing class containing complex dictionary... ");
+ out.flush();
+ {
+ M m = new M();
+ m.v = new java.util.HashMap<StructKey, L>();
+ StructKey k1 = new StructKey(1, "1");
+ m.v.put(k1, new L("one"));
+ StructKey k2 = new StructKey(2, "2");
+ m.v.put(k2, new L("two"));
+
+ MHolder m1 = new MHolder();
+ M m2 = initial.opM(m, m1);
+ test(m1.value.v.size() == 2);
+ test(m2.v.size() == 2);
+
+ test(m1.value.v.get(k1).data.equals("one"));
+ test(m2.v.get(k1).data.equals("one"));
+
+ test(m1.value.v.get(k2).data.equals("two"));
+ test(m2.v.get(k2).data.equals("two"));
+
+ }
+ out.println("ok");
+
return initial;
}
}
diff --git a/java-compat/test/src/main/java/test/Ice/objects/InitialI.java b/java-compat/test/src/main/java/test/Ice/objects/InitialI.java
index c1c01e93659..104c491a1ac 100644
--- a/java-compat/test/src/main/java/test/Ice/objects/InitialI.java
+++ b/java-compat/test/src/main/java/test/Ice/objects/InitialI.java
@@ -33,6 +33,8 @@ import test.Ice.objects.Test.Recursive;
import test.Ice.objects.Test.Initial;
import test.Ice.objects.Test.Compact;
import test.Ice.objects.Test.CompactExt;
+import test.Ice.objects.Test.M;
+import test.Ice.objects.Test.MHolder;
public final class InitialI extends Initial
{
@@ -285,6 +287,14 @@ public final class InitialI extends Initial
_adapter.getCommunicator().shutdown();
}
+ @Override
+ public M
+ opM(M v1, MHolder v2, Ice.Current current)
+ {
+ v2.value = v1;
+ return v1;
+ }
+
private Ice.ObjectAdapter _adapter;
private B _b1;
private B _b2;
diff --git a/java-compat/test/src/main/java/test/Ice/objects/Test.ice b/java-compat/test/src/main/java/test/Ice/objects/Test.ice
index 9de9aedae73..e3ae50e7acc 100644
--- a/java-compat/test/src/main/java/test/Ice/objects/Test.ice
+++ b/java-compat/test/src/main/java/test/Ice/objects/Test.ice
@@ -186,6 +186,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
class Initial
{
void shutdown();
@@ -229,6 +242,8 @@ class Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
class Empty
diff --git a/java/test/src/main/java/test/Ice/objects/AllTests.java b/java/test/src/main/java/test/Ice/objects/AllTests.java
index 4d922616144..e4f96765d7e 100644
--- a/java/test/src/main/java/test/Ice/objects/AllTests.java
+++ b/java/test/src/main/java/test/Ice/objects/AllTests.java
@@ -37,7 +37,9 @@ import test.Ice.objects.Test.InitialPrx;
import test.Ice.objects.Test.J;
import test.Ice.objects.Test.Recursive;
import test.Ice.objects.Test.UnexpectedObjectExceptionTestPrx;
-
+import test.Ice.objects.Test.M;
+import test.Ice.objects.Test.StructKey;
+import test.Ice.objects.Test.Initial.OpMResult;
public class AllTests
{
private static void test(boolean b)
@@ -384,6 +386,29 @@ public class AllTests
test(communicator.getValueFactoryManager().find("TestOF") != null);
out.println("ok");
+ out.print("testing class containing complex dictionary... ");
+ out.flush();
+ {
+ M m = new M();
+ m.v = new java.util.HashMap<StructKey, L>();
+ StructKey k1 = new StructKey(1, "1");
+ m.v.put(k1, new L("one"));
+ StructKey k2 = new StructKey(2, "2");
+ m.v.put(k2, new L("two"));
+
+ Initial.OpMResult opMResult = initial.opM(m);
+ test(opMResult.returnValue.v.size() == 2);
+ test(opMResult.v2.v.size() == 2);
+
+ test(opMResult.returnValue.v.get(k1).data.equals("one"));
+ test(opMResult.v2.v.get(k1).data.equals("one"));
+
+ test(opMResult.returnValue.v.get(k2).data.equals("two"));
+ test(opMResult.v2.v.get(k2).data.equals("two"));
+
+ }
+ out.println("ok");
+
return initial;
}
}
diff --git a/java/test/src/main/java/test/Ice/objects/InitialI.java b/java/test/src/main/java/test/Ice/objects/InitialI.java
index 5d0ca370165..aa86317a060 100644
--- a/java/test/src/main/java/test/Ice/objects/InitialI.java
+++ b/java/test/src/main/java/test/Ice/objects/InitialI.java
@@ -239,6 +239,15 @@ public final class InitialI implements Initial
_adapter.getCommunicator().shutdown();
}
+ @Override
+ public Initial.OpMResult opM(M v1, com.zeroc.Ice.Current current)
+ {
+ Initial.OpMResult r = new Initial.OpMResult();
+ r.returnValue = v1;
+ r.v2 = v1;
+ return r;
+ }
+
private com.zeroc.Ice.ObjectAdapter _adapter;
private B _b1;
private B _b2;
diff --git a/java/test/src/main/java/test/Ice/objects/Test.ice b/java/test/src/main/java/test/Ice/objects/Test.ice
index dbacc63b28f..7e70876c7a0 100644
--- a/java/test/src/main/java/test/Ice/objects/Test.ice
+++ b/java/test/src/main/java/test/Ice/objects/Test.ice
@@ -186,6 +186,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -229,6 +242,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
class Empty
diff --git a/js/test/Ice/objects/Client.js b/js/test/Ice/objects/Client.js
index 4c380782341..abe7f76c3d5 100644
--- a/js/test/Ice/objects/Client.js
+++ b/js/test/Ice/objects/Client.js
@@ -446,6 +446,29 @@
test(communicator.getValueFactoryManager().find("TestOF") !== null);
out.writeLine("ok");
+ out.write("testing class containing complex dictionary... ");
+ {
+ let m = new Test.M();
+ m.v = new Test.MMap();
+ let k1 = new Test.StructKey(1, "1");
+ m.v.put(k1, new Test.L("one"));
+ let k2 = new Test.StructKey(2, "2");
+ m.v.put(k2, new L("two"));
+
+ let [m1, m2] = initial.opM(m);
+
+ test(m1.v.size == 2);
+ test(m2.v.size == 2);
+
+ test(m1.v.get(k1).data == "one");
+ test(m2.v.get(k1).data == "one");
+
+ test(m1.v.get(k2).data == "two");
+ test(m2.v.get(k2).data == "two");
+
+ }
+ out.println("ok");
+
await initial.shutdown();
}
diff --git a/js/test/Ice/objects/Test.ice b/js/test/Ice/objects/Test.ice
index b7b6183b629..6b834af5d25 100644
--- a/js/test/Ice/objects/Test.ice
+++ b/js/test/Ice/objects/Test.ice
@@ -189,6 +189,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -232,6 +245,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
class Empty
diff --git a/matlab/test/Ice/objects/AllTests.m b/matlab/test/Ice/objects/AllTests.m
index d2e5a7aa619..cc919e69ef7 100644
--- a/matlab/test/Ice/objects/AllTests.m
+++ b/matlab/test/Ice/objects/AllTests.m
@@ -258,6 +258,26 @@ classdef AllTests
end
fprintf('ok\n');
+ fprintf('testing class containing complex dictionary... ');
+ m = M();
+ m.v(1).key = StructKey(1, "1");
+ m.v(1).value = L("one");
+
+ m.v(2).key = StructKey(2, "2");
+ m.v(2).value = L("two");
+
+ [m1, m2] = initial.opM(m);
+
+ assert(length(m1.v) == 2);
+ assert(length(m2.v) == 2);
+
+ assert(strcmp(m1.v(1).value.data, "one"));
+ assert(strcmp(m1.v(2).value.data, "two"));
+
+ assert(strcmp(m2.v(1).value.data, "one"));
+ assert(strcmp(m2.v(2).value.data, "two"));
+
+ fprintf('ok\n');
r = initial;
end
end
diff --git a/matlab/test/Ice/objects/Test.ice b/matlab/test/Ice/objects/Test.ice
index 2efe8719097..233bb9c3624 100644
--- a/matlab/test/Ice/objects/Test.ice
+++ b/matlab/test/Ice/objects/Test.ice
@@ -185,6 +185,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -228,6 +241,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
class Empty
diff --git a/objective-c/test/Ice/objects/AllTests.m b/objective-c/test/Ice/objects/AllTests.m
index 5cce3c6e940..d5e1c91b11f 100644
--- a/objective-c/test/Ice/objects/AllTests.m
+++ b/objective-c/test/Ice/objects/AllTests.m
@@ -670,5 +670,28 @@ objectsAllTests(id<ICECommunicator> communicator, BOOL collocated)
// cross-test server does not implement this object
}
+ {
+ tprintf("testing class containing a complex dictionary... ");
+ TestObjectsMutableLMap* v = [TestObjectsMutableLMap dictionary];
+ TestObjectsStructKey* k1 = [[TestObjectsStructKey alloc] init:1 s:@"1"];
+ [v setObject:[[TestObjectsL alloc] init:@"one"] forKey:k1];
+ TestObjectsStructKey* k2 = [[TestObjectsStructKey alloc] init:2 s:@"2"];
+ [v setObject:[[TestObjectsL alloc] init:@"two"] forKey:k2];
+ TestObjectsM* m = [[TestObjectsM alloc] init:v];
+
+ TestObjectsM* m1;
+ TestObjectsM* m2 = [initial opM:m v2:&m1];
+ test([m1.v count] == 2);
+ test([m2.v count] == 2);
+
+ test([((TestObjectsL*)[m1.v objectForKey:k1]).data isEqualToString:@"one"]);
+ test([((TestObjectsL*)[m1.v objectForKey:k2]).data isEqualToString:@"two"]);
+
+ test([((TestObjectsL*)[m2.v objectForKey:k1]).data isEqualToString:@"one"]);
+ test([((TestObjectsL*)[m2.v objectForKey:k2]).data isEqualToString:@"two"]);
+
+ tprintf("ok\n");
+ }
+
return initial;
}
diff --git a/objective-c/test/Ice/objects/ObjectsTest.ice b/objective-c/test/Ice/objects/ObjectsTest.ice
index 955e21198b7..b9fb200ccd8 100644
--- a/objective-c/test/Ice/objects/ObjectsTest.ice
+++ b/objective-c/test/Ice/objects/ObjectsTest.ice
@@ -200,6 +200,19 @@ class K
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
class Initial
{
void shutdown();
@@ -255,6 +268,7 @@ class Initial
ObjectPrxDict getObjectPrxDict(ObjectPrxDict d);
BaseDict getBaseDict(BaseDict d);
BasePrxDict getBasePrxDict(BasePrxDict d);
+ M opM(M v1, out M v2);
}
interface TestIntf
diff --git a/objective-c/test/Ice/objects/TestI.h b/objective-c/test/Ice/objects/TestI.h
index 253b50830f2..62204d8cbf1 100644
--- a/objective-c/test/Ice/objects/TestI.h
+++ b/objective-c/test/Ice/objects/TestI.h
@@ -71,6 +71,7 @@
-(TestObjectsObjectPrxDict *) getObjectPrxDict:(TestObjectsMutableObjectPrxDict *)d current:(ICECurrent *)current;
-(TestObjectsBaseDict *) getBaseDict:(TestObjectsMutableBaseDict *)d current:(ICECurrent *)current;
-(TestObjectsBasePrxDict *) getBasePrxDict:(TestObjectsMutableBasePrxDict *)d current:(ICECurrent *)current;
+ -(TestObjectsM *) opM:(TestObjectsM *)v1 v2:(TestObjectsM **)v2 current:(ICECurrent *)current;
@end
@interface UnexpectedObjectExceptionTestI : ICEBlobject<ICEBlobject>
diff --git a/objective-c/test/Ice/objects/TestI.m b/objective-c/test/Ice/objects/TestI.m
index 589b1b86057..1690eb4b105 100644
--- a/objective-c/test/Ice/objects/TestI.m
+++ b/objective-c/test/Ice/objects/TestI.m
@@ -349,6 +349,12 @@
{
return d;
}
+
+-(TestObjectsM *) opM:(TestObjectsM *)v1 v2:(TestObjectsM **)v2 current:(ICECurrent *)current
+{
+ *v2 = v1;
+ return v1;
+}
@end
@implementation UnexpectedObjectExceptionTestI
diff --git a/python/test/Ice/objects/AllTests.py b/python/test/Ice/objects/AllTests.py
index 5f59683ff33..2f6a5f0fee5 100644
--- a/python/test/Ice/objects/AllTests.py
+++ b/python/test/Ice/objects/AllTests.py
@@ -320,4 +320,24 @@ def allTests(helper, communicator):
test(communicator.getValueFactoryManager().find("TestOF") != None)
print("ok")
+ sys.stdout.write("testing class containing complex dictionary... ")
+ sys.stdout.flush()
+ m = Test.M()
+ m.v = {}
+ k1 = Test.StructKey(1, "1")
+ m.v[k1] = Test.L("one")
+ k2 = Test.StructKey(2, "2")
+ m.v[k2] = Test.L("two")
+ m1, m2 = initial.opM(m)
+ test(len(m1.v) == 2)
+ test(len(m2.v) == 2)
+
+ test(m1.v[k1].data == "one")
+ test(m2.v[k1].data == "one")
+
+ test(m1.v[k2].data == "two")
+ test(m2.v[k2].data == "two")
+
+ print("ok")
+
return initial
diff --git a/python/test/Ice/objects/Test.ice b/python/test/Ice/objects/Test.ice
index 417891a894f..1bf545c88df 100644
--- a/python/test/Ice/objects/Test.ice
+++ b/python/test/Ice/objects/Test.ice
@@ -185,6 +185,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
interface Initial
{
void shutdown();
@@ -228,6 +241,8 @@ interface Initial
void throwInnerEx() throws Inner::Ex;
void throwInnerSubEx() throws Inner::Sub::Ex;
+
+ M opM(M v1, out M v2);
}
}
diff --git a/python/test/Ice/objects/TestI.py b/python/test/Ice/objects/TestI.py
index 83cb67e51a8..121ea779941 100644
--- a/python/test/Ice/objects/TestI.py
+++ b/python/test/Ice/objects/TestI.py
@@ -195,6 +195,9 @@ class InitialI(Test.Initial):
def throwInnerSubEx(self, current=None):
raise Test.Inner.Sub.Ex("Inner::Sub::Ex")
+ def opM(self, m, current=None):
+ return (m, m)
+
class UnexpectedObjectExceptionTestI(Test.UnexpectedObjectExceptionTest):
def op(self, current=None):
return Test.AlsoEmpty()
diff --git a/ruby/test/Ice/objects/AllTests.rb b/ruby/test/Ice/objects/AllTests.rb
index a41df03cb91..ec2ebd0603f 100644
--- a/ruby/test/Ice/objects/AllTests.rb
+++ b/ruby/test/Ice/objects/AllTests.rb
@@ -370,5 +370,24 @@ def allTests(helper, communicator)
test(communicator.getValueFactoryManager().find('TestOF') != nil)
puts "ok"
+ print "testing class containing complex dictionary... "
+ STDOUT.flush
+ m = Test::M.new
+ m.v = {}
+ k1 = Test::StructKey.new(1, "1")
+ m.v[k1] = Test::L.new("one")
+ k2 = Test::StructKey.new(2, "2")
+ m.v[k2] = Test::L.new("two")
+ m1, m2 = initial.opM(m)
+ test(m1.v.length == 2)
+ test(m2.v.length == 2)
+
+ test(m1.v[k1].data == "one")
+ test(m2.v[k1].data == "one")
+
+ test(m1.v[k2].data == "two")
+ test(m2.v[k2].data == "two")
+ puts "ok"
+
return initial
end
diff --git a/ruby/test/Ice/objects/Test.ice b/ruby/test/Ice/objects/Test.ice
index 2f31f0f930d..41af54b8b5c 100644
--- a/ruby/test/Ice/objects/Test.ice
+++ b/ruby/test/Ice/objects/Test.ice
@@ -155,6 +155,19 @@ class L
sequence<Value> ValueSeq;
dictionary<string, Value> ValueMap;
+struct StructKey
+{
+ int i;
+ string s;
+}
+
+dictionary<StructKey, L> LMap;
+
+class M
+{
+ LMap v;
+}
+
class Initial
{
void shutdown();
@@ -192,6 +205,8 @@ class Initial
BaseSeq opBaseSeq(BaseSeq inSeq, out BaseSeq outSeq);
Compact getCompact();
+
+ M opM(M v1, out M v2);
}
}