ecere/com/dataTypes: Fixes for broken Serialization after Instance type change
authorJerome St-Louis <jerome@ecere.com>
Sun, 5 May 2013 21:29:19 +0000 (17:29 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sun, 5 May 2013 21:29:19 +0000 (17:29 -0400)
- Multiple inheritance levels were never handled properly in (de)serialization
- Ignoring members with id < 0

compiler/bootstrap/ecere/bootstrap/dataTypes.c
ecere/src/com/dataTypes.ec

index a01c35b..e426090 100644 (file)
@@ -679,6 +679,8 @@ for(member = _class->membersAndProperties.first; member; member = member->next)
 {
 int memberResult = 0;
 
+if(member->id < 0)
+continue;
 if(member->isProperty || member->type == 0)
 {
 struct __ecereNameSpace__ecere__com__Class * memberType = member->dataTypeClass;
@@ -1512,12 +1514,15 @@ struct __ecereNameSpace__ecere__com__Class * lastClass = (((void *)0));
 while(lastClass != _class)
 {
 struct __ecereNameSpace__ecere__com__DataMember * member;
+struct __ecereNameSpace__ecere__com__Class * c;
 
-for(; _class && (!_class->base || _class->base->type != 1000) && _class != lastClass; _class = _class->base)
+for(c = _class; c && (!c->base || c->base->type != 1000) && c->base != lastClass; c = c->base)
 ;
 lastClass = _class;
-for(member = _class->membersAndProperties.first; member; member = member->next)
+for(member = c->membersAndProperties.first; member; member = member->next)
 {
+if(member->id < 0)
+continue;
 if(member->isProperty || member->type == 0)
 {
 struct __ecereNameSpace__ecere__com__Class * memberType = member->dataTypeClass;
@@ -1616,12 +1621,15 @@ memset(data, 0, _class->structSize);
 while(lastClass != _class)
 {
 struct __ecereNameSpace__ecere__com__DataMember * member;
+struct __ecereNameSpace__ecere__com__Class * c;
 
-for(; _class && (!_class->base || _class->base->type != 1000) && _class != lastClass; _class = _class->base)
+for(c = _class; c && (!c->base || c->base->type != 1000) && c->base != lastClass; c = c->base)
 ;
-lastClass = _class;
-for(member = _class->membersAndProperties.first; member; member = member->next)
+lastClass = c;
+for(member = c->membersAndProperties.first; member; member = member->next)
 {
+if(member->id < 0)
+continue;
 if(member->isProperty || member->type == 0)
 {
 struct __ecereNameSpace__ecere__com__Class * memberType = member->dataTypeClass;
index 9bf0b47..cbfa6ff 100644 (file)
@@ -312,6 +312,7 @@ static int OnCompare(Class _class, void * data1, void * data2)
             for(member = _class.membersAndProperties.first; member; member = member.next)
             {
                int memberResult = 0;
+               if(member.id < 0) continue;
                if(member.isProperty || member.type == normalMember)
                {
                   Class memberType = member.dataTypeClass;
@@ -1119,11 +1120,13 @@ static void OnSerialize(Class _class, void * data, IOChannel channel)
          while(lastClass != _class)
          {
             DataMember member;
-            for(; _class && (!_class.base || _class.base.type != systemClass) && _class != lastClass; _class = _class.base);
+            Class c;
+            for(c = _class; c && (!c.base || c.base.type != systemClass) && c.base != lastClass; c = c.base);
             lastClass = _class;
 
-            for(member = _class.membersAndProperties.first; member; member = member.next)
+            for(member = c.membersAndProperties.first; member; member = member.next)
             {
+               if(member.id < 0) continue;
                if(member.isProperty || member.type == normalMember)
                {
                   Class memberType = member.dataTypeClass;
@@ -1242,11 +1245,13 @@ static void OnUnserialize(Class _class, void ** data, IOChannel channel)
          while(lastClass != _class)
          {
             DataMember member;
-            for(; _class && (!_class.base || _class.base.type != systemClass) && _class != lastClass; _class = _class.base);
-            lastClass = _class;
+            Class c;
+            for(c = _class; c && (!c.base || c.base.type != systemClass) && c.base != lastClass; c = c.base);
+            lastClass = c;
 
-            for(member = _class.membersAndProperties.first; member; member = member.next)
+            for(member = c.membersAndProperties.first; member; member = member.next)
             {
+               if(member.id < 0) continue;
                if(member.isProperty || member.type == normalMember)
                {
                   Class memberType = member.dataTypeClass;