From: Jerome St-Louis Date: Tue, 24 Mar 2015 04:01:45 +0000 (-0400) Subject: ecere/sys/JSON: Fixed issues deserializing structs X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=commitdiff_plain;h=77034783edcc13d21c089bdf90526ee3cbcc6c6d ecere/sys/JSON: Fixed issues deserializing structs --- diff --git a/ecere/src/sys/JSON.ec b/ecere/src/sys/JSON.ec index 45b8794..08b87d1 100644 --- a/ecere/src/sys/JSON.ec +++ b/ecere/src/sys/JSON.ec @@ -167,7 +167,8 @@ public: } else if(!strcmpi(buffer, "null")) { - value.p = 0; + if(type.type != structClass) + value.p = 0; } else result = typeMismatch; @@ -565,35 +566,42 @@ public: if(!isKey) delete value.p; } - // TOFIX: How to swiftly handle classes with base data type? - else if(type == class(double) || !strcmp(type.dataTypeString, "double")) - { - ((void (*)(void *, double))(void *)prop.Set)(*object, value.d); - } - else if(type == class(float) || !strcmp(type.dataTypeString, "float")) - { - ((void (*)(void *, float))(void *)prop.Set)(*object, value.f); - } - else if(type.typeSize == sizeof(int64) || !strcmp(type.dataTypeString, "int64") || - !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64")) - { - ((void (*)(void *, uint64))(void *)prop.Set)(*object, value.ui64); - } - else if(type.typeSize == sizeof(int) || !strcmp(type.dataTypeString, "int") || - !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint")) - { - ((void (*)(void *, int))(void *)prop.Set)(*object, value.i); - } - else if(type.typeSize == sizeof(short int) || !strcmp(type.dataTypeString, "short") || - !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || - !strcmp(type.dataTypeString, "int16")) + else if(type.type == enumClass || type.type == bitClass || type.type == unitClass || type.type == systemClass) { - ((void (*)(void *, short))(void *)prop.Set)(*object, value.s); - } - else if(type.typeSize == sizeof(byte) || !strcmp(type.dataTypeString, "char") || - !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte")) - { - ((void (*)(void *, char))(void *)prop.Set)(*object, value.c); + // TOFIX: How to swiftly handle classes with base data type? + if(type == class(double) || !strcmp(type.dataTypeString, "double")) + { + ((void (*)(void *, double))(void *)prop.Set)(*object, value.d); + } + else if(type == class(float) || !strcmp(type.dataTypeString, "float")) + { + ((void (*)(void *, float))(void *)prop.Set)(*object, value.f); + } + else if(type.typeSize == sizeof(int64) || !strcmp(type.dataTypeString, "int64") || + !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64")) + { + ((void (*)(void *, uint64))(void *)prop.Set)(*object, value.ui64); + } + else if(type.typeSize == sizeof(int) || !strcmp(type.dataTypeString, "int") || + !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint")) + { + ((void (*)(void *, int))(void *)prop.Set)(*object, value.i); + } + else if(type.typeSize == sizeof(short int) || !strcmp(type.dataTypeString, "short") || + !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || + !strcmp(type.dataTypeString, "int16")) + { + ((void (*)(void *, short))(void *)prop.Set)(*object, value.s); + } + else if(type.typeSize == sizeof(byte) || !strcmp(type.dataTypeString, "char") || + !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte")) + { + ((void (*)(void *, char))(void *)prop.Set)(*object, value.c); + } + else + { + ((void (*)(void *, int))(void *)prop.Set)(*object, value.i); + } } else {