From a21034fe364470f8b3eb99bbd5f7f85a2ebfc580 Mon Sep 17 00:00:00 2001 From: Rejean Loyer Date: Sun, 29 Jun 2014 01:11:35 -0400 Subject: [PATCH] ecere/sys/JSON: add support for writing public base classes members. --- ecere/src/sys/JSON.ec | 202 +++++++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 94 deletions(-) diff --git a/ecere/src/sys/JSON.ec b/ecere/src/sys/JSON.ec index 70b86e1..f07fabd 100644 --- a/ecere/src/sys/JSON.ec +++ b/ecere/src/sys/JSON.ec @@ -927,6 +927,8 @@ static bool _WriteJSONObject(File f, Class objectType, void * object, int indent int c; bool isFirst = true; Class mapKeyClass = null, mapDataClass = null; + Class baseClass; + List bases { }; if(objectType.templateClass && eClass_IsDerived(objectType.templateClass, class(MapNode))) { @@ -937,144 +939,156 @@ static bool _WriteJSONObject(File f, Class objectType, void * object, int indent f.Puts("{\n"); indent++; - for(prop = objectType.membersAndProperties.first; prop; prop = prop.next) + for(baseClass = objectType; baseClass; baseClass = baseClass.base) { - if(prop.memberAccess != publicAccess || (prop.isProperty && (!prop.Set || !prop.Get))) continue; - if(prop.isProperty) + if(baseClass.isInstanceClass || !baseClass.base) + break; + bases.Insert(null, baseClass); + } + + for(baseClass : bases) + { + for(prop = baseClass.membersAndProperties.first; prop; prop = prop.next) { - if(!prop.conversion && (!prop.IsSet || prop.IsSet(object))) + if(prop.memberAccess != publicAccess || (prop.isProperty && (!prop.Set || !prop.Get))) continue; + if(prop.isProperty) { - DataValue value { }; - Class type; + if(!prop.conversion && (!prop.IsSet || prop.IsSet(object))) + { + DataValue value { }; + Class type; - if(mapKeyClass && !strcmp(prop.name, "key")) - type = mapKeyClass; - else if(mapDataClass && !strcmp(prop.name, "value")) - type = mapDataClass; - else - type = eSystem_FindClass(__thisModule, prop.dataTypeString); - if(!type) - type = eSystem_FindClass(__thisModule.application, prop.dataTypeString); + if(mapKeyClass && !strcmp(prop.name, "key")) + type = mapKeyClass; + else if(mapDataClass && !strcmp(prop.name, "value")) + type = mapDataClass; + else + type = eSystem_FindClass(__thisModule, prop.dataTypeString); + if(!type) + type = eSystem_FindClass(__thisModule.application, prop.dataTypeString); + if(!type) + PrintLn("warning: Unresolved data type ", (String)prop.dataTypeString); + else + { + // TOFIX: How to swiftly handle classes with base data type? + if(type == class(double) || !strcmp(type.dataTypeString, "double")) + { + value.d = ((double (*)(void *))(void *)prop.Get)(object); + } + else if(type == class(float) || !strcmp(type.dataTypeString, "float")) + { + value.f = ((float (*)(void *))(void *)prop.Get)(object); + } + else if(type.typeSize == sizeof(int64) || !strcmp(type.dataTypeString, "int64") || + !strcmp(type.dataTypeString, "unsigned int64") || !strcmp(type.dataTypeString, "uint64")) + { + value.ui64 = ((uint64 (*)(void *))(void *)prop.Get)(object); + } + else if(type.typeSize == sizeof(int) || !strcmp(type.dataTypeString, "int") || + !strcmp(type.dataTypeString, "unsigned int") || !strcmp(type.dataTypeString, "uint")) + { + value.i = ((int (*)(void *))(void *)prop.Get)(object); + } + else if(type.typeSize == sizeof(short int) || !strcmp(type.dataTypeString, "short") || + !strcmp(type.dataTypeString, "unsigned short") || !strcmp(type.dataTypeString, "uint16") || + !strcmp(type.dataTypeString, "int16")) + { + value.s = ((short (*)(void *))(void *)prop.Get)(object); + } + else if(type.typeSize == sizeof(byte) || !strcmp(type.dataTypeString, "char") || + !strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte")) + { + value.c = ((char (*)(void *))(void *)prop.Get)(object); + } + else + { + value.p = ((void *(*)(void *))(void *)prop.Get)(object); + } + + if(!isFirst) f.Puts(",\n"); + for(c = 0; c