From: Jerome St-Louis Date: Wed, 7 Aug 2013 04:34:48 +0000 (-0400) Subject: compiler/libec: Added support for String s; s.OnGetString() (#974) X-Git-Tag: 0.44.08~75 X-Git-Url: https://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=commitdiff_plain;h=93f58d645161564f23796b80075743700b2c973f compiler/libec: Added support for String s; s.OnGetString() (#974) --- diff --git a/compiler/libec/src/pass2.ec b/compiler/libec/src/pass2.ec index 971f533..d1b7ee8 100644 --- a/compiler/libec/src/pass2.ec +++ b/compiler/libec/src/pass2.ec @@ -1667,9 +1667,10 @@ static void ProcessExpression(Expression exp) if(type.kind == classType && type._class && type._class.registered) { - ClassType classType = memberExp.member.exp.expType._class.registered.type; - if(classType != normalClass || (method.dataType.byReference))// TESTING THIS OUT: && !memberExp.member.exp.expType.classObjectType) - argClass = type._class.registered; + Class regClass = type._class.registered; + ClassType classType = regClass.type; + if(classType != normalClass || !strcmp(regClass.dataTypeString, "char *") || (method.dataType.byReference))// TESTING THIS OUT: && !memberExp.member.exp.expType.classObjectType) + argClass = regClass; } else if(type.kind == subClassType) { @@ -1701,60 +1702,62 @@ static void ProcessExpression(Expression exp) */ } - // *** Added !_class here - if(!exp.call.exp.expType.methodClass && (!memberExp || !_class) && memberExp.member.exp.expType && memberExp.member.exp.expType.classObjectType) { - if(memberExp.member.exp.expType.kind == classType && memberExp.member.exp.expType._class && - memberExp.member.exp.expType._class.registered && memberExp.member.exp.expType._class.registered.type == normalClass) + Type type = memberExp.member.exp.expType; + Class regClass = (type && type.kind == classType && type._class) ? type._class.registered : null; + // *** Added !_class here + if(!exp.call.exp.expType.methodClass && (!memberExp || !_class) && type && type.classObjectType) { - // TOCHECK: Added this if statement here for File::OnSerialize to be calling the instance's own Seek function, - // as opposed to the File class vTbl one - exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, - MkExpIndex(MkExpPointer(MkExpBrackets(MkListOne(CopyExpression(memberExp.member.exp))), MkIdentifier("_vTbl")), - MkListOne(MkExpIdentifier(MkIdentifier(name))))))); + if(regClass && regClass.type == normalClass && strcmp(regClass.dataTypeString, "char *")) + { + // TOCHECK: Added this if statement here for File::OnSerialize to be calling the instance's own Seek function, + // as opposed to the File class vTbl one + exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, + MkExpIndex(MkExpPointer(MkExpBrackets(MkListOne(CopyExpression(memberExp.member.exp))), MkIdentifier("_vTbl")), + MkListOne(MkExpIdentifier(MkIdentifier(name))))))); + } + else + { + exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, + MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier("class")), MkIdentifier("_vTbl")), + MkListOne(MkExpIdentifier(MkIdentifier(name))))))); + } } - else + else if(memberExp && !_class && exp.call.exp.expType._class && + (type.kind == subClassType || (regClass && regClass.type == normalClass && strcmp(regClass.dataTypeString, "char *")))) { exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, - MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier("class")), MkIdentifier("_vTbl")), + MkExpIndex(MkExpPointer(CopyExpression(memberExp.member.exp), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name))))))); } - } - else if(memberExp && !_class && exp.call.exp.expType._class && - (memberExp.member.exp.expType.kind == subClassType || (memberExp.member.exp.expType.kind == classType && memberExp.member.exp.expType._class && - memberExp.member.exp.expType._class.registered && memberExp.member.exp.expType._class.registered.type == normalClass))) - { - exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, - MkExpIndex(MkExpPointer(CopyExpression(memberExp.member.exp), MkIdentifier("_vTbl")), - MkListOne(MkExpIdentifier(MkIdentifier(name))))))); - } - else - { - char className[1024]; + else + { + char className[1024]; - // TESTING: Moved this here... - if(!_class && argClass && strcmp(argClass.fullName, "class")) - _class = argClass; + // TESTING: Moved this here... + if(!_class && argClass && strcmp(argClass.fullName, "class")) + _class = argClass; - if(!_class) - { - // TODO: Unhandled case here, what should happen? - _class = class(int); - } + if(!_class) + { + // TODO: Unhandled case here, what should happen? + _class = class(int); + } - // Need the class itself here... - strcpy(className, "__ecereClass_"); - FullClassNameCat(className, _class.fullName, true); - MangleClassName(className); + // Need the class itself here... + strcpy(className, "__ecereClass_"); + FullClassNameCat(className, _class.fullName, true); + MangleClassName(className); - if(!_class.symbol) - _class.symbol = FindClass(_class.fullName); + if(!_class.symbol) + _class.symbol = FindClass(_class.fullName); - DeclareClass(_class.symbol, className); + DeclareClass(_class.symbol, className); - exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, - MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl")), - MkListOne(MkExpIdentifier(MkIdentifier(name))))))); + exp.call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, + MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl")), + MkListOne(MkExpIdentifier(MkIdentifier(name))))))); + } } } else