From d930b97700f0296b6e1f38aef5cae80f5071d361 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Mon, 16 Mar 2015 01:29:27 -0400 Subject: [PATCH] ecere/sys/JSON: (de)serializing unit classes as numbers --- ecere/src/sys/JSON.ec | 52 ++++++++++++++++++++++++++++++++++++++++++-- ide/src/debugger/Debugger.ec | 2 +- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/ecere/src/sys/JSON.ec b/ecere/src/sys/JSON.ec index 7b2088e..b6f18d2 100644 --- a/ecere/src/sys/JSON.ec +++ b/ecere/src/sys/JSON.ec @@ -670,6 +670,49 @@ public: value.i = strtol(buffer, null, 10); result = success; } + + if(result == success && type.type == unitClass) + { + // Convert to reference unit + Class dataType; + Property prop; + for(prop = type.conversions.first; prop; prop = prop.next) + { + bool refProp = false; + Class c; + if(!strcmp(prop.name, type.base.fullName)) + refProp = true; + else if( (c = eSystem_FindClass(type.module, prop.name) ) ) + { + Property p; + for(p = c.conversions.first; p; p = p.next) + { + if(!strcmp(p.name, type.base.fullName) && !p.Set && !p.Get) + { + refProp = true; + break; + } + } + } + if(refProp) + { + if(prop.Set && prop.Get) + { + const String dts = type.base.dataTypeString; + if(!strcmp(dts, "double")) + value.d = ((double(*)(double))(void *)prop.Get)(value.d); + else if(!strcmp(dts, "float")) + value.f = ((float(*)(float))(void *)prop.Get)(value.f); + else if(!strcmp(dts, "int")) + value.i = ((int(*)(int))(void *)prop.Get)(value.i); + else if(!strcmp(dts, "int64")) + value.i64 = ((int64(*)(int64))(void *)prop.Get)(value.i64); + } + else + break; + } + } + } return result; } } @@ -783,6 +826,7 @@ bool WriteNumber(File f, Class type, DataValue value, int indent) { char buffer[1024]; bool needClass = false; + bool quote; buffer[0] = 0; if(type == class(double) || !strcmp(type.dataTypeString, "double")) ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.d, buffer, 0, &needClass); @@ -804,7 +848,11 @@ bool WriteNumber(File f, Class type, DataValue value, int indent) ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.c, buffer, null, &needClass); else if(!strcmp(type.dataTypeString, "unsigned char") || !strcmp(type.dataTypeString, "byte") || type.typeSize == sizeof(byte)) ((const char *(*)(void *, void *, char *, void *, bool *))(void *)type._vTbl[__ecereVMethodID_class_OnGetString])(type, &value.uc, buffer, null, &needClass); + + quote = (type.type == unitClass && ((buffer[0] != '.' && !isdigit(buffer[0])) || strchr(buffer, ' '))); + if(quote) f.Puts("\""); f.Puts(buffer); + if(quote) f.Puts("\""); return true; } @@ -874,7 +922,7 @@ bool WriteValue(File f, Class type, DataValue value, int indent) else f.Puts("unset"); } - else if(type.type == enumClass || type.type == unitClass) + else if(type.type == enumClass) { f.Puts("\""); WriteNumber(f, type, value, indent); @@ -898,7 +946,7 @@ bool WriteValue(File f, Class type, DataValue value, int indent) dataType = eSystem_FindClass(__thisModule, type.dataTypeString); WriteNumber(f, dataType, value, indent); } - else if(type.type == systemClass) + else if(type.type == systemClass || type.type == unitClass) { WriteNumber(f, type, value, indent); } diff --git a/ide/src/debugger/Debugger.ec b/ide/src/debugger/Debugger.ec index ccdc5f4..ab36881 100644 --- a/ide/src/debugger/Debugger.ec +++ b/ide/src/debugger/Debugger.ec @@ -2908,7 +2908,7 @@ class Debugger { Expression memberExp = exp.member.exp; Identifier memberID = exp.member.member; - Type type = memberExp.expType; + Type type = memberExp ? memberExp.expType : null; Class _class = (type && memberID) ? (memberID && memberID.classSym) ? memberID.classSym.registered : ((type.kind == classType && type._class) ? type._class.registered : null) : null; if(_class && memberID && memberID.string) snprintf(watchmsg, sizeof(watchmsg), $"Missing property evaluation for \"%s\" in class \"%s\"", memberID.string, _class.name); -- 1.8.3.1