X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ecere%2Fsrc%2Fcom%2Fcontainers%2FMap.ec;fp=ecere%2Fsrc%2Fcom%2Fcontainers%2FMap.ec;h=876607462583355ed32aa3919cc9e6862b789be6;hb=1fe01ced1978ecd046accfc810ac6a2735942829;hp=e3b763b246f14947df10ac18433610f9d39a23bf;hpb=22f4910c35cbe3549e33b75a90399a7fec92de12;p=sdk diff --git a/ecere/src/com/containers/Map.ec b/ecere/src/com/containers/Map.ec index e3b763b..8766074 100644 --- a/ecere/src/com/containers/Map.ec +++ b/ecere/src/com/containers/Map.ec @@ -106,7 +106,7 @@ public class Map : CustomAVLTree, I = MT, D = { Class Tclass = class(MT); // Copy key here - if(Tclass.type == systemClass || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass) + if((Tclass.type == systemClass && !Tclass.byValueSystemClass) || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass) { ((void (*)(void *, void *, void *))(void *)Tclass._vTbl[__ecereVMethodID_class_OnCopy])(Tclass, (((byte *)&(uint64)newNode.key) + __ENDIAN_PAD(Tclass.typeSize)), (((byte *)&(uint64)newNode.key) + __ENDIAN_PAD(Tclass.typeSize))); @@ -191,7 +191,7 @@ public class Map : CustomAVLTree, I = MT, D = { node = MapNode { key = pos }; } - if(Tclass.type == systemClass || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass) + if((Tclass.type == systemClass && !Tclass.byValueSystemClass) || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass) { ((void (*)(void *, void *, void *))(void *)Tclass._vTbl[__ecereVMethodID_class_OnCopy])(Tclass, (((byte *)&(uint64)node.key) + __ENDIAN_PAD(Tclass.typeSize)), (((byte *)&(uint64)pos) + __ENDIAN_PAD(Tclass.typeSize))); @@ -245,6 +245,8 @@ public class Map : CustomAVLTree, I = MT, D = IteratorPointer i; Class Kclass = class(MT); Class Dclass = class(V); + bool kIsNormalClass = Kclass.type == normalClass; + bool dIsNormalClass = Dclass.type == normalClass; channel.Put(count); for(i = GetFirst(); i; i = GetNext(i)) @@ -252,11 +254,13 @@ public class Map : CustomAVLTree, I = MT, D = MapNode srcNode = (MapNode)i; MT key = GetKey((MapNode)srcNode); D data = GetData(srcNode); + Class kEclass = dIsNormalClass ? ((Instance)key)._class : Kclass; + Class dEclass = dIsNormalClass ? ((Instance)data)._class : Dclass; - ((void (*)(void *, void *, void *))(void *)Kclass._vTbl[__ecereVMethodID_class_OnSerialize])(Kclass, - (Kclass.type == systemClass || Kclass.type == bitClass || Kclass.type == enumClass || Kclass.type == unitClass) ? &key : (void *)key, channel); - ((void (*)(void *, void *, void *))(void *)Dclass._vTbl[__ecereVMethodID_class_OnSerialize])(Dclass, - (Dclass.type == systemClass || Dclass.type == bitClass || Dclass.type == enumClass || Dclass.type == unitClass) ? &data : (void *)data, channel); + ((void (*)(void *, void *, void *))(void *)kEclass._vTbl[__ecereVMethodID_class_OnSerialize])(kEclass, + ((Kclass.type == systemClass && !Kclass.byValueSystemClass) || Kclass.type == bitClass || Kclass.type == enumClass || Kclass.type == unitClass) ? &key : (void *)key, channel); + ((void (*)(void *, void *, void *))(void *)dEclass._vTbl[__ecereVMethodID_class_OnSerialize])(dEclass, + ((Dclass.type == systemClass && !Dclass.byValueSystemClass) || Dclass.type == bitClass || Dclass.type == enumClass || Dclass.type == unitClass) ? &data : (void *)data, channel); } }