ecere/com/dataTypes: Fixed issues stringifying enums
[sdk] / compiler / bootstrap / ecere / bootstrap / dataTypes.c
index d36cacd..9969146 100644 (file)
@@ -510,7 +510,7 @@ else if(ch == '\a')
 strcpy(string, "'\\a'");
 else if(ch == '\\')
 strcpy(string, "'\\\\'");
-else if(ch < (char)32 || ch >= (char)127)
+else if(ch < 32 || ch >= 127)
 sprintf(string, "'\\x%x'", ch);
 else
 sprintf(string, "'%c'", ch);
@@ -709,9 +709,9 @@ last = ((last > c) ? last : c);
 if(string[c] == '.')
 {
 if(last == c)
-string[c] = (char)0;
+string[c] = 0;
 else
-string[last + 1] = (char)0;
+string[last + 1] = 0;
 break;
 }
 }
@@ -786,9 +786,9 @@ last = ((last > c) ? last : c);
 if(string[c] == '.')
 {
 if(last == c)
-string[c] = (char)0;
+string[c] = 0;
 else
-string[last + 1] = (char)0;
+string[last + 1] = 0;
 break;
 }
 }
@@ -1200,13 +1200,13 @@ long long i64Data = 0;
 switch(_class->typeSize)
 {
 case 1:
-i64Data = !strcmp(_class->dataTypeString, "byte") ? *(unsigned char *)data : *(char *)data;
+i64Data = !strcmp(_class->dataTypeString, "byte") ? (long long)*(unsigned char *)data : (long long)*(char *)data;
 break;
 case 2:
-i64Data = !strcmp(_class->dataTypeString, "uint16") ? *(unsigned short *)data : *(short *)data;
+i64Data = !strcmp(_class->dataTypeString, "uint16") ? (long long)*(unsigned short *)data : (long long)*(short *)data;
 break;
 case 4:
-i64Data = !strcmp(_class->dataTypeString, "uint") ? *(unsigned int *)data : *(int *)data;
+i64Data = !strcmp(_class->dataTypeString, "uint") ? (long long)*(unsigned int *)data : (long long)*(int *)data;
 break;
 case 8:
 i64Data = !strcmp(_class->dataTypeString, "uint64") ? *(long long *)data : *(long long *)data;
@@ -1222,12 +1222,17 @@ break;
 }
 if(item)
 {
+if(tempString)
+{
 strcpy(tempString, item->name);
 if(!needClass || !*needClass)
 tempString[0] = (char)toupper(tempString[0]);
 return tempString;
 }
 else
+return item->name;
+}
+else
 return (((void *)0));
 }
 
@@ -1350,10 +1355,10 @@ static void __ecereNameSpace__ecere__com__OnCopy(struct __ecereNameSpace__ecere_
 {
 if(_class->type == 3 || _class->type == 2 || _class->type == 4)
 {
-struct __ecereNameSpace__ecere__com__Class * dataType = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->dataTypeString);
-
-if(dataType)
-((void (*)(void *, void *, void *))(void *)dataType->_vTbl[__ecereVMethodID_class_OnCopy])(dataType, data, newData);
+if(newData)
+memcpy(data, newData, _class->typeSize);
+else
+memset(data, 0, _class->typeSize);
 }
 else if(_class->type != 1 && (_class->type != 1000 || _class->byValueSystemClass))
 {
@@ -1494,7 +1499,7 @@ len += newLen;
 }
 }
 }
-buffer[len] = (char)0;
+buffer[len] = 0;
 return len;
 }
 
@@ -1544,7 +1549,7 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, data, 1) != 1)
-*data = (unsigned char)0;
+*data = 0;
 }
 
 void __ecereNameSpace__ecere__com__Int_OnSerialize(struct __ecereNameSpace__ecere__com__Class * _class, int * data, struct __ecereNameSpace__ecere__com__Instance * channel)
@@ -1588,7 +1593,7 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 4) == 4)
-*data = (unsigned int)(((bytes)[0] << (unsigned char)24) | ((bytes)[1] << (unsigned char)16) | ((bytes)[2] << (unsigned char)8) | (bytes)[3]);
+*data = (unsigned int)(((bytes)[0] << 24) | ((bytes)[1] << 16) | ((bytes)[2] << 8) | (bytes)[3]);
 else
 *data = 0;
 }
@@ -1642,7 +1647,7 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 8) == 8)
-*data = (((uint64)(bytes)[0] << 56) | ((uint64)(bytes)[1] << 48) | ((uint64)(bytes)[2] << 40) | ((uint64)(bytes)[3] << 32) | ((uint64)(bytes)[4] << 24) | ((bytes)[5] << (unsigned char)16) | ((bytes)[6] << (unsigned char)8) | (bytes)[7]);
+*data = (((uint64)(bytes)[0] << 56) | ((uint64)(bytes)[1] << 48) | ((uint64)(bytes)[2] << 40) | ((uint64)(bytes)[3] << 32) | ((uint64)(bytes)[4] << 24) | ((bytes)[5] << 16) | ((bytes)[6] << 8) | (bytes)[7]);
 else
 *data = 0;
 }
@@ -1651,8 +1656,8 @@ void __ecereNameSpace__ecere__com__Word_OnSerialize(struct __ecereNameSpace__ece
 {
 unsigned char bytes[2];
 
-(bytes)[0] = (unsigned char)(((*data) >> (unsigned short)8) & (unsigned short)0xFF);
-(bytes)[1] = (unsigned char)(((*data)) & (unsigned short)0xFF);
+(bytes)[0] = (unsigned char)(((*data) >> 8) & 0xFF);
+(bytes)[1] = (unsigned char)(((*data)) & 0xFF);
 ;
 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  data, unsigned int numBytes))__extension__ ({
 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
@@ -1670,9 +1675,9 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 2) == 2)
-*data = (unsigned short)(((bytes)[0] << (unsigned char)8) | (bytes)[1]);
+*data = (unsigned short)(((bytes)[0] << 8) | (bytes)[1]);
 else
-*data = (unsigned short)0;
+*data = 0;
 }
 
 static void __ecereNameSpace__ecere__com__Float_OnSerialize(struct __ecereNameSpace__ecere__com__Class * _class, float * data, struct __ecereNameSpace__ecere__com__Instance * channel)
@@ -1700,7 +1705,7 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 4) == 4)
-*(unsigned int *)data = (unsigned int)(((bytes)[0] << (unsigned char)24) | ((bytes)[1] << (unsigned char)16) | ((bytes)[2] << (unsigned char)8) | (bytes)[3]);
+*(unsigned int *)data = (unsigned int)(((bytes)[0] << 24) | ((bytes)[1] << 16) | ((bytes)[2] << 8) | (bytes)[3]);
 else
 *data = 0;
 }
@@ -1734,7 +1739,7 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = channel;
 
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__IOChannel->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 8) == 8)
-*(uint64 *)data = (((uint64)(bytes)[0] << 56) | ((uint64)(bytes)[1] << 48) | ((uint64)(bytes)[2] << 40) | ((uint64)(bytes)[3] << 32) | ((uint64)(bytes)[4] << 24) | ((bytes)[5] << (unsigned char)16) | ((bytes)[6] << (unsigned char)8) | (bytes)[7]);
+*(uint64 *)data = (((uint64)(bytes)[0] << 56) | ((uint64)(bytes)[1] << 48) | ((uint64)(bytes)[2] << 40) | ((uint64)(bytes)[3] << 32) | ((uint64)(bytes)[4] << 24) | ((bytes)[5] << 16) | ((bytes)[6] << 8) | (bytes)[7]);
 else
 *data = 0;
 }
@@ -2305,14 +2310,16 @@ for(member = _class->membersAndProperties.first; member; member = member->next)
 char memberString[1024];
 struct __ecereNameSpace__ecere__com__Class * memberType = member->dataTypeClass;
 const char * name = member->name;
+const char * (* onGetString)(void *, void *, char *, void *, unsigned int *);
 
 if(member->id < 0)
 continue;
-memberString[0] = (char)0;
+memberString[0] = 0;
 if(!memberType)
 memberType = member->dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(module, member->dataTypeString);
 if(!memberType)
 memberType = member->dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "int");
+onGetString = memberType->_vTbl[__ecereVMethodID_class_OnGetString];
 if(member->isProperty)
 {
 struct __ecereNameSpace__ecere__com__Property * prop = (struct __ecereNameSpace__ecere__com__Property *)member;
@@ -2335,7 +2342,7 @@ value.__anon1.f = ((float (*)(void *))(void *)prop->Get)(data);
 if(value.__anon1.f)
 {
 unsigned int needClass = 1;
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, (((void *)0)), &needClass);
+const char * result = onGetString(memberType, &value, memberString, (((void *)0)), &needClass);
 
 if(result && result != memberString)
 strcpy(memberString, result);
@@ -2349,7 +2356,7 @@ value.__anon1.p = ((void * (*)(void *))(void *)prop->Get)(data);
 if(value.__anon1.p || prop->IsSet)
 {
 unsigned int needClass = 1;
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, (memberType->type == 0) ? value.__anon1.p : &value, memberString, (((void *)0)), &needClass);
+const char * result = onGetString(memberType, (memberType->type == 0) ? value.__anon1.p : &value, memberString, (((void *)0)), &needClass);
 
 if(result && result != memberString)
 strcpy(memberString, result);
@@ -2361,7 +2368,7 @@ value.__anon1.i = ((int (*)(void *))(void *)prop->Get)(data);
 if(value.__anon1.i || prop->IsSet)
 {
 unsigned int needClass = 1;
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, (((void *)0)), &needClass);
+const char * result = onGetString(memberType, &value, memberString, (((void *)0)), &needClass);
 
 if(result && result != memberString)
 strcpy(memberString, result);
@@ -2372,12 +2379,14 @@ strcpy(memberString, result);
 }
 else
 {
+unsigned int offset = member->offset + member->_class->offset;
+unsigned char * memberData = (unsigned char *)data + offset;
+
 if(member->type == 0)
 {
 if(memberType->type == 1 || memberType->type == 0)
 {
 char internalMemberString[1024];
-unsigned char * memberData = ((unsigned char *)data + (((member->_class->type == 0) ? member->_class->offset : 0) + member->offset));
 int c;
 unsigned int typeSize = (memberType->type == 0) ? memberType->typeSize : memberType->structSize;
 
@@ -2390,9 +2399,9 @@ unsigned int needClass = 1;
 const char * result;
 
 if(memberType->type == 0)
-result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, *(struct __ecereNameSpace__ecere__com__Instance **)memberData, internalMemberString, (((void *)0)), &needClass);
+result = onGetString(memberType, *(struct __ecereNameSpace__ecere__com__Instance **)memberData, internalMemberString, (((void *)0)), &needClass);
 else
-result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, (((void *)0)), &needClass);
+result = onGetString(memberType, memberData, internalMemberString, (((void *)0)), &needClass);
 if(needClass && strcmp(memberType->dataTypeString, "char *"))
 {
 strcat(memberString, "{ ");
@@ -2423,7 +2432,7 @@ if(value.__anon1.ui64)
 {
 unsigned int needClass = 1;
 char internalMemberString[1024];
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, internalMemberString, (((void *)0)), &needClass);
+const char * result = onGetString(memberType, &value, internalMemberString, (((void *)0)), &needClass);
 
 if(needClass && memberType->type != 1000 && memberType->type != 4 && memberType->type != 3)
 {
@@ -2438,22 +2447,10 @@ strcpy(memberString, result);
 }
 else if(!memberType->noExpansion)
 {
-if(memberType->typeSize <= 4)
-{
-value.__anon1.i = *(int *)((unsigned char *)data + (((member->_class->type == 0) ? member->_class->offset : 0) + member->offset));
-if(value.__anon1.i)
-{
-unsigned int needClass = 1;
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, &value, memberString, (((void *)0)), &needClass);
-
-if(result && memberString != result)
-strcpy(memberString, result);
-}
-}
-else
+if(memberType->typeSize > 4 || *(int *)memberData)
 {
 unsigned int needClass = 1;
-const char * result = ((const char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, ((unsigned char *)data + (((member->_class->type == 0) ? member->_class->offset : 0) + member->offset)), memberString, (((void *)0)), &needClass);
+const char * result = onGetString(memberType, memberData, memberString, (((void *)0)), &needClass);
 
 if(result && memberString != result)
 strcpy(memberString, result);
@@ -2493,7 +2490,7 @@ len += 2;
 else
 {
 tempString[len++] = memberString[c];
-tempString[len] = (char)0;
+tempString[len] = 0;
 }
 }
 strcat(tempString, "\"");
@@ -2741,16 +2738,20 @@ __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, thisMember-
 if(found)
 {
 struct __ecereNameSpace__ecere__com__Class * memberType = thisMember->dataTypeClass;
+unsigned int offset;
+unsigned char * memberData;
 
 if(!memberType)
 memberType = thisMember->dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(module, thisMember->dataTypeString);
 if(!memberType)
 memberType = thisMember->dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "int");
+offset = thisMember->_class->offset + memberOffset;
+memberData = (unsigned char *)data + offset;
 if(memberType->type == 1)
 {
 if(thisMember)
 {
-if(!((unsigned int (*)(void *, void *, const char *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType, (unsigned char *)data + (((thisMember->_class->type == 0) ? thisMember->_class->offset : 0) + memberOffset), memberString))
+if(!((unsigned int (*)(void *, void *, const char *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(memberType, memberData, memberString))
 result = 0;
 }
 }
@@ -2780,17 +2781,34 @@ struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereName
 *(unsigned int *)data = (unsigned int)(((*(unsigned int *)data & ~bitMember->mask)) | ((value.__anon1.ui64 << bitMember->pos) & bitMember->mask));
 }
 else
-*(int *)((unsigned char *)data + (((thisMember->_class->type == 0) ? thisMember->_class->offset : 0) + thisMember->offset)) = value.__anon1.i;
+*(int *)memberData = value.__anon1.i;
 }
 else if(thisMember->isProperty && ((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)
 {
 if(memberType->type == 5 || memberType->type == 0 || memberType->type == 1)
 ((void (*)(void *, void *))(void *)((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)(data, value.__anon1.p);
 else
+{
+if(!strcmp(memberType->dataTypeString, "float"))
+{
+((void (*)(void *, float))(void *)((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)(data, value.__anon1.f);
+}
+else if(!strcmp(memberType->dataTypeString, "double"))
+{
+((void (*)(void *, double))(void *)((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)(data, value.__anon1.d);
+}
+else if(!strcmp(memberType->dataTypeString, "int64"))
+{
+((void (*)(void *, long long))(void *)((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)(data, value.__anon1.i64);
+}
+else
+{
 ((void (*)(void *, int))(void *)((struct __ecereNameSpace__ecere__com__Property *)thisMember)->Set)(data, value.__anon1.i);
 }
 }
 }
+}
+}
 else
 result = 0;
 count = 0;