From f58abee31d82e279a3aeaca4f92db3604b4ca0e3 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Sun, 10 Mar 2013 09:57:57 -0400 Subject: [PATCH] compiler/libec: Fixed passing of typed objects in ellipsis functions; Fixed string conversion of convertible units - Destination type was not being set properly on second and later members, C compiler errors resulted - e.g. Degrees were not being converted to string/printed as degrees - Updated bootstrap --- compiler/bootstrap/ecere/bootstrap/File.c | 11 +- compiler/bootstrap/ecere/bootstrap/String.c | 19 ++-- compiler/bootstrap/ecere/bootstrap/dataTypes.c | 140 +++++++++++++++++++++++-- compiler/bootstrap/libec/bootstrap/pass15.c | 8 ++ compiler/libec/locale/ec.pot | 96 ++++++++--------- compiler/libec/src/pass15.ec | 12 ++- ecere/src/com/dataTypes.ec | 112 +++++++++++++++++++- 7 files changed, 324 insertions(+), 74 deletions(-) diff --git a/compiler/bootstrap/ecere/bootstrap/File.c b/compiler/bootstrap/ecere/bootstrap/File.c index 06146ec..77834e6 100644 --- a/compiler/bootstrap/ecere/bootstrap/File.c +++ b/compiler/bootstrap/ecere/bootstrap/File.c @@ -28,6 +28,7 @@ typedef unsigned __int64 uint64; #define __ENDIAN_PAD(x) 0 #endif #include +#include #if defined(_W64) || (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) #define _64BIT 1 @@ -265,8 +266,6 @@ struct __ecereNameSpace__ecere__com__Method * method; } __attribute__ ((gcc_struct)); } __attribute__ ((gcc_struct)); -typedef uintptr_t size_t; - void exit(int status); void * calloc(size_t nmemb, size_t size); @@ -373,7 +372,7 @@ return string; extern double strtod(char * , char * * ); -extern char * strstr(char * , const char * ); +extern char * strstr(const char * , const char * ); unsigned int __ecereMethod___ecereNameSpace__ecere__sys__FileSize_OnGetDataFromString(struct __ecereNameSpace__ecere__com__Class * class, unsigned int * this, char * string) { @@ -702,7 +701,7 @@ struct __ecereNameSpace__ecere__sys__File * __ecerePointer___ecereNameSpace__ece return ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int type, uint64 start, uint64 length, unsigned int wait))this->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Lock])(this, 0, start, length, wait); } -extern int strlen(const char * ); +extern size_t strlen(const char * ); int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Puts; @@ -1323,7 +1322,7 @@ __ecereNameSpace__ecere__com__eClass_AddMethod(class, "OnGetDataFromString", 0, __ecereNameSpace__ecere__com__eClass_AddMethod(class, "WriteData", 0, __ecereMethod___ecereNameSpace__ecere__sys__File_WriteData, 1); __ecereNameSpace__ecere__com__eClass_AddMethod(class, "ReadData", 0, __ecereMethod___ecereNameSpace__ecere__sys__File_ReadData, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Seek", "bool Seek(int pos, ecere::sys::FileSeekMode mode)", __ecereMethod___ecereNameSpace__ecere__sys__File_Seek, 1); -__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Tell", "unsigned int Tell(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_Tell, 1); +__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Tell", "uint Tell(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_Tell, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Read", "int Read(void * buffer, unsigned int size, unsigned int count)", __ecereMethod___ecereNameSpace__ecere__sys__File_Read, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Write", "int Write(void * buffer, unsigned int size, unsigned int count)", __ecereMethod___ecereNameSpace__ecere__sys__File_Write, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Getc", "bool Getc(char * ch)", __ecereMethod___ecereNameSpace__ecere__sys__File_Getc, 1); @@ -1331,7 +1330,7 @@ __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Putc", "bool Putc( __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Puts", "bool Puts(const char * string)", __ecereMethod___ecereNameSpace__ecere__sys__File_Puts, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Eof", "bool Eof(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_Eof, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Truncate", "bool Truncate(ecere::sys::FileSize size)", __ecereMethod___ecereNameSpace__ecere__sys__File_Truncate, 1); -__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "GetSize", "unsigned int GetSize(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_GetSize, 1); +__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "GetSize", "uint GetSize(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_GetSize, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "CloseInput", "void CloseInput(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_CloseInput, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "CloseOutput", "void CloseOutput(void)", __ecereMethod___ecereNameSpace__ecere__sys__File_CloseOutput, 1); __ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "Lock", "bool Lock(ecere::sys::FileLock type, uint64 start, uint64 length, bool wait)", __ecereMethod___ecereNameSpace__ecere__sys__File_Lock, 1); diff --git a/compiler/bootstrap/ecere/bootstrap/String.c b/compiler/bootstrap/ecere/bootstrap/String.c index 2f64c1e..f39968a 100644 --- a/compiler/bootstrap/ecere/bootstrap/String.c +++ b/compiler/bootstrap/ecere/bootstrap/String.c @@ -28,6 +28,7 @@ typedef unsigned __int64 uint64; #define __ENDIAN_PAD(x) 0 #endif #include +#include extern void * __ecereNameSpace__ecere__com__eSystem_New(unsigned int size); extern void * __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size); @@ -255,8 +256,6 @@ struct __ecereNameSpace__ecere__com__Method * method; } __attribute__ ((gcc_struct)); } __attribute__ ((gcc_struct)); -typedef uintptr_t size_t; - void exit(int status); void * calloc(size_t nmemb, size_t size); @@ -282,7 +281,7 @@ extern int runtimePlatform; -extern int strlen(const char * ); +extern size_t strlen(const char * ); extern char * strcpy(char * , const char * ); @@ -311,7 +310,7 @@ return output; extern int strcmp(const char * , const char * ); -extern void * memmove(void * , const void * , unsigned int size); +extern void * memmove(void * , const void * , size_t size); extern int __ecereNameSpace__ecere__com__GetRuntimePlatform(void); @@ -415,7 +414,7 @@ output[len - 1] = '\0'; return output; } -extern char * strncpy(char * , const char * , int n); +extern char * strncpy(char * , const char * , size_t n); unsigned int __ecereNameSpace__ecere__sys__SplitArchivePath(char * fileName, char * archiveName, char ** archiveFile) { @@ -442,7 +441,7 @@ return 0x1; return 0x0; } -extern char * strstr(char * , const char * ); +extern char * strstr(const char * , const char * ); extern int toupper(int); @@ -986,9 +985,9 @@ else sprintf(string, "%.0f B", size); } -extern int strncmp(const char * , const char * , int n); +extern int strncmp(const char * , const char * , size_t n); -extern int strncasecmp(const char * , const char * , int n); +extern int strncasecmp(const char * , const char * , size_t n); extern int tolower(int); @@ -1120,7 +1119,7 @@ tokens[count++] = start; return count; } -extern char * strchr(char * , int); +extern char * strchr(const char * , int); int __ecereNameSpace__ecere__sys__TokenizeWith(char * string, int maxTokens, char * tokens[], char * tokenizers, unsigned int escapeBackSlashes) { @@ -1233,7 +1232,7 @@ string[c] = ch; string[c] = (char)0; } -extern void * memcpy(void * , const void * , unsigned int size); +extern void * memcpy(void * , const void * , size_t size); char * __ecereNameSpace__ecere__sys__CopyString(char * string) { diff --git a/compiler/bootstrap/ecere/bootstrap/dataTypes.c b/compiler/bootstrap/ecere/bootstrap/dataTypes.c index 05d835e..31244f6 100644 --- a/compiler/bootstrap/ecere/bootstrap/dataTypes.c +++ b/compiler/bootstrap/ecere/bootstrap/dataTypes.c @@ -824,6 +824,12 @@ uint64 mask; extern size_t strlen(const char * ); +extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_double; + +extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_float; + +extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_int64; + static char * __ecereNameSpace__ecere__com__OnGetString(struct __ecereNameSpace__ecere__com__Class * _class, void * data, char * tempString, void * fieldData, unsigned int * needClass) { struct __ecereNameSpace__ecere__com__Instance * module = _class->templateClass ? _class->templateClass->module : _class->module; @@ -834,8 +840,65 @@ return __ecereNameSpace__ecere__com__Enum_OnGetString(_class, data, tempString, } else if(_class->type == 3) { -struct __ecereNameSpace__ecere__com__Class * dataType = __ecereNameSpace__ecere__com__eSystem_FindClass(module, _class->dataTypeString); +struct __ecereNameSpace__ecere__com__Class * dataType; +struct __ecereNameSpace__ecere__com__Property * prop; +for(prop = _class->conversions.first; prop; prop = prop->next) +{ +unsigned int refProp = 0x0; +struct __ecereNameSpace__ecere__com__Class * c; + +if(!strcmp(prop->name, _class->base->fullName)) +refProp = 0x1; +else if((c = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, prop->name))) +{ +struct __ecereNameSpace__ecere__com__Property * p; + +for(p = c->conversions.first; p; p = p->next) +{ +if(!strcmp(p->name, _class->base->fullName) && !p->Set && !p->Get) +{ +refProp = 0x1; +break; +} +} +} +if(refProp) +{ +if(prop->Set && prop->Get) +{ +char * dts = _class->base->dataTypeString; + +if(!strcmp(dts, "double")) +{ +double d = ((double (*)(double))(void *)prop->Set)(*(double *)data); + +return ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)__ecereClass_double->_vTbl[__ecereVMethodID_class_OnGetString])(__ecereClass_double, &d, tempString, fieldData, needClass); +} +else if(!strcmp(dts, "float")) +{ +float d = ((float (*)(float))(void *)prop->Set)(*(float *)data); + +return ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)__ecereClass_float->_vTbl[__ecereVMethodID_class_OnGetString])(__ecereClass_float, &d, tempString, fieldData, needClass); +} +else if(!strcmp(dts, "int")) +{ +int d = ((int (*)(int))(void *)prop->Set)(*(int *)data); + +return ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)__ecereClass_int->_vTbl[__ecereVMethodID_class_OnGetString])(__ecereClass_int, &d, tempString, fieldData, needClass); +} +else if(!strcmp(dts, "int64")) +{ +long long d = ((long long (*)(long long))(void *)prop->Set)(*(long long *)data); + +return ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)__ecereClass_int64->_vTbl[__ecereVMethodID_class_OnGetString])(__ecereClass_int64, &d, tempString, fieldData, needClass); +} +} +else +break; +} +} +dataType = __ecereNameSpace__ecere__com__eSystem_FindClass(module, _class->dataTypeString); return ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)dataType->_vTbl[__ecereVMethodID_class_OnGetString])(dataType, data, tempString, fieldData, needClass); } else @@ -1078,8 +1141,73 @@ if(_class->type == 4) result = __ecereNameSpace__ecere__com__Enum_OnGetDataFromString(_class, (int *)data, string); else if(_class->type == 3) { -struct __ecereNameSpace__ecere__com__Class * dataType = __ecereNameSpace__ecere__com__eSystem_FindClass(module, _class->dataTypeString); +struct __ecereNameSpace__ecere__com__Class * dataType; +struct __ecereNameSpace__ecere__com__Property * prop; +for(prop = _class->conversions.first; prop; prop = prop->next) +{ +unsigned int refProp = 0x0; +struct __ecereNameSpace__ecere__com__Class * c; + +if(!strcmp(prop->name, _class->base->fullName)) +refProp = 0x1; +else if((c = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, prop->name))) +{ +struct __ecereNameSpace__ecere__com__Property * p; + +for(p = c->conversions.first; p; p = p->next) +{ +if(!strcmp(p->name, _class->base->fullName) && !p->Set && !p->Get) +{ +refProp = 0x1; +break; +} +} +} +if(refProp) +{ +if(prop->Set && prop->Get) +{ +char * dts = _class->base->dataTypeString; + +if(!strcmp(dts, "double")) +{ +double d; +unsigned int result = ((unsigned int (*)(void *, void *, const char *))(void *)__ecereClass_double->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(__ecereClass_double, &d, string); + +*(double *)data = ((double (*)(double))(void *)prop->Get)(d); +return result; +} +else if(!strcmp(dts, "float")) +{ +float d; +unsigned int result = ((unsigned int (*)(void *, void *, const char *))(void *)__ecereClass_float->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(__ecereClass_float, &d, string); + +*(float *)data = ((float (*)(float))(void *)prop->Get)(d); +return result; +} +else if(!strcmp(dts, "int")) +{ +int d; +unsigned int result = ((unsigned int (*)(void *, void *, const char *))(void *)__ecereClass_int->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(__ecereClass_int, &d, string); + +*(int *)data = ((int (*)(int))(void *)prop->Get)(d); +return result; +} +else if(!strcmp(dts, "int64")) +{ +long long d; +unsigned int result = ((unsigned int (*)(void *, void *, const char *))(void *)__ecereClass_int64->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(__ecereClass_int64, &d, string); + +*(long long *)data = ((long long (*)(long long))(void *)prop->Get)(d); +return result; +} +} +else +break; +} +} +dataType = __ecereNameSpace__ecere__com__eSystem_FindClass(module, _class->dataTypeString); return ((unsigned int (*)(void *, void *, const char *))(void *)dataType->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(dataType, data, string); } else if(!string[0] && _class->type == 0) @@ -1914,7 +2042,7 @@ integerClass->type = 1000; integerClass->dataTypeString = __ecereNameSpace__ecere__sys__CopyString("ssize_t"); integerClass->structSize = 0; integerClass->typeSize = sizeof(ssize_t); -if(sizeof(size_t) == 8) +if(sizeof(ssize_t) == 8) { __ecereNameSpace__ecere__com__eClass_AddMethod(integerClass, "OnGetString", (((void *)0)), __ecereNameSpace__ecere__com__Int64_OnGetString, 1); __ecereNameSpace__ecere__com__eClass_AddMethod(integerClass, "OnGetDataFromString", (((void *)0)), __ecereNameSpace__ecere__com__Int64_OnGetDataFromString, 1); @@ -2596,8 +2724,8 @@ __ecereNameSpace__ecere__com__eSystem_RegisterDefine("ecere::com::FORMAT64U", "( class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::IOChannel", 0, 0, 0, 0, 0, module, 4, 1); if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application && class) __ecereClass___ecereNameSpace__ecere__com__IOChannel = class; -__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "WriteData", "unsigned int WriteData(byte * data, unsigned int numBytes)", 0, 1); -__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "ReadData", "unsigned int ReadData(byte * data, unsigned int numBytes)", 0, 1); +__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "WriteData", "uint WriteData(byte * data, unsigned int numBytes)", 0, 1); +__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(class, "ReadData", "uint ReadData(byte * data, unsigned int numBytes)", 0, 1); __ecereNameSpace__ecere__com__eClass_AddMethod(class, "Get", "void Get(typed_object * data)", __ecereMethod___ecereNameSpace__ecere__com__IOChannel_Get, 1); __ecereNameSpace__ecere__com__eClass_AddMethod(class, "Put", "void Put(typed_object data)", __ecereMethod___ecereNameSpace__ecere__com__IOChannel_Put, 1); __ecereNameSpace__ecere__com__eClass_AddMethod(class, "Serialize", "void Serialize(typed_object data)", __ecereMethod___ecereNameSpace__ecere__com__IOChannel_Serialize, 1); @@ -2615,7 +2743,7 @@ __ecereNameSpace__ecere__com__eClass_AddDataMember(class, "pos", "uint", 4, 4, 1 __ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_buffer = __ecereNameSpace__ecere__com__eClass_AddProperty(class, "buffer", "byte *", __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Set_buffer, __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Get_buffer, 1); if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application) __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_buffer = __ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_buffer, __ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_buffer = (void *)0; -__ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_size = __ecereNameSpace__ecere__com__eClass_AddProperty(class, "size", "unsigned int", __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Set_size, __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Get_size, 1); +__ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_size = __ecereNameSpace__ecere__com__eClass_AddProperty(class, "size", "uint", __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Set_size, __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_Get_size, 1); if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application) __ecereProp___ecereNameSpace__ecere__com__SerialBuffer_size = __ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_size, __ecerePropM___ecereNameSpace__ecere__com__SerialBuffer_size = (void *)0; __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::Enum_OnGetString", "char * ecere::com::Enum_OnGetString(ecere::com::Class _class, int * data, char * tempString, void * fieldData, bool * needClass)", __ecereNameSpace__ecere__com__Enum_OnGetString, module, 4); diff --git a/compiler/bootstrap/libec/bootstrap/pass15.c b/compiler/bootstrap/libec/bootstrap/pass15.c index d6dfb65..f262763 100644 --- a/compiler/bootstrap/libec/bootstrap/pass15.c +++ b/compiler/bootstrap/libec/bootstrap/pass15.c @@ -13640,10 +13640,18 @@ type->refCount++; } else { +if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType) +{ +e->destType = type->prev; +e->destType->refCount++; +} +else +{ e->destType = type; if(type) type->refCount++; } +} if(type && type->kind != 14) { struct Type * next = type->next; diff --git a/compiler/libec/locale/ec.pot b/compiler/libec/locale/ec.pot index 37aff8b..0012989 100644 --- a/compiler/libec/locale/ec.pot +++ b/compiler/libec/locale/ec.pot @@ -15,7 +15,7 @@ msgstr "" msgid "%s expected to be derived from method class\n" msgstr "%s expected to be derived from method class\n" -#: ./src/pass15.ec:8973 +#: ./src/pass15.ec:8975 msgid "%s undefined; assuming extern returning int\n" msgstr "%s undefined; assuming extern returning int\n" @@ -31,12 +31,12 @@ msgstr ":%d:%d: warning: " msgid "Array size not constant int (%s)\n" msgstr "Array size not constant int (%s)\n" -#: ./src/pass15.ec:10480 +#: ./src/pass15.ec:10482 msgid "Assigning list initializer to non list\n" msgstr "Assigning list initializer to non list\n" -#: ./src/pass15.ec:10144 -#: ./src/pass15.ec:11191 +#: ./src/pass15.ec:10146 +#: ./src/pass15.ec:11193 msgid "Couldn't determine type of array elements\n" msgstr "Couldn't determine type of array elements\n" @@ -52,7 +52,7 @@ msgstr "Couldn't open %s\n" msgid "Expecting class specifier\n" msgstr "Expecting class specifier\n" -#: ./src/pass15.ec:11349 +#: ./src/pass15.ec:11351 msgid "Expression is not a container\n" msgstr "Expression is not a container\n" @@ -64,12 +64,12 @@ msgstr "Includes nested too deeply" msgid "Incompatible virtual function %s\n" msgstr "Incompatible virtual function %s\n" -#: ./src/pass15.ec:11623 -#: ./src/pass15.ec:11698 +#: ./src/pass15.ec:11625 +#: ./src/pass15.ec:11700 msgid "Invalid object specified and not inside a class\n" msgstr "Invalid object specified and not inside a class\n" -#: ./src/pass15.ec:11531 +#: ./src/pass15.ec:11533 msgid "Invalid watched object\n" msgstr "Invalid watched object\n" @@ -94,11 +94,11 @@ msgstr "Multiple field index requires a name\n" msgid "No database table defined in this module or database_open already used.\n" msgstr "No database table defined in this module or database_open already used.\n" -#: ./src/pass15.ec:11544 +#: ./src/pass15.ec:11546 msgid "No observer specified and not inside a _class\n" msgstr "No observer specified and not inside a _class\n" -#: ./src/pass15.ec:11701 +#: ./src/pass15.ec:11703 msgid "No observer specified and not inside a class\n" msgstr "No observer specified and not inside a class\n" @@ -112,9 +112,9 @@ msgid "Non-static %s making use of a static class\n" msgstr "Non-static %s making use of a static class\n" #: ./src/pass1.ec:1037 -#: ./src/pass15.ec:11526 -#: ./src/pass15.ec:11598 -#: ./src/pass15.ec:11687 +#: ./src/pass15.ec:11528 +#: ./src/pass15.ec:11600 +#: ./src/pass15.ec:11689 msgid "Property %s not found in class %s\n" msgstr "Property %s not found in class %s\n" @@ -122,7 +122,7 @@ msgstr "Property %s not found in class %s\n" msgid "Public %s making use of a private class\n" msgstr "Public %s making use of a private class\n" -#: ./src/pass15.ec:7424 +#: ./src/pass15.ec:7418 msgid "Recursion in defined expression %s\n" msgstr "Recursion in defined expression %s\n" @@ -138,26 +138,26 @@ msgstr "Redefinition of %s ignored\n" msgid "Redefinition of method %s in class %s\n" msgstr "Redefinition of method %s in class %s\n" -#: ./src/pass15.ec:4394 -#: ./src/pass15.ec:4501 +#: ./src/pass15.ec:4388 +#: ./src/pass15.ec:4495 msgid "Unhandled type populating instance\n" msgstr "Unhandled type populating instance\n" -#: ./src/pass15.ec:7160 +#: ./src/pass15.ec:7154 msgid "Unspecified type\n" msgstr "Unspecified type\n" -#: ./src/pass15.ec:8988 +#: ./src/pass15.ec:8990 msgid "callable object undefined; extern assuming returning int\n" msgstr "callable object undefined; extern assuming returning int\n" -#: ./src/pass15.ec:8798 +#: ./src/pass15.ec:8792 msgid "called object %s is not a function\n" msgstr "called object %s is not a function\n" +#: ./src/pass15.ec:7874 #: ./src/pass15.ec:7880 -#: ./src/pass15.ec:7886 -#: ./src/pass15.ec:8050 +#: ./src/pass15.ec:8044 msgid "cannot add two pointers\n" msgstr "cannot add two pointers\n" @@ -183,19 +183,19 @@ msgstr "class data member" msgid "class member instance" msgstr "class member instance" -#: ./src/pass15.ec:10219 +#: ./src/pass15.ec:10221 msgid "couldn't determine type of %s; expected %s\n" msgstr "couldn't determine type of %s; expected %s\n" -#: ./src/pass15.ec:8427 -#: ./src/pass15.ec:8439 -#: ./src/pass15.ec:10231 -#: ./src/pass15.ec:10307 +#: ./src/pass15.ec:8421 +#: ./src/pass15.ec:8433 +#: ./src/pass15.ec:10233 +#: ./src/pass15.ec:10309 msgid "couldn't determine type of %s\n" msgstr "couldn't determine type of %s\n" #: ./src/pass15.ec:1882 -#: ./src/pass15.ec:9453 +#: ./src/pass15.ec:9455 msgid "couldn't find member %s in class %s\n" msgstr "couldn't find member %s in class %s\n" @@ -204,17 +204,17 @@ msgstr "couldn't find member %s in class %s\n" msgid "couldn't find virtual method %s in class %s\n" msgstr "couldn't find virtual method %s in class %s\n" -#: ./src/pass15.ec:8042 +#: ./src/pass15.ec:8036 msgid "different levels of indirection\n" msgstr "different levels of indirection\n" -#: ./src/pass15.ec:7898 -#: ./src/pass15.ec:10262 +#: ./src/pass15.ec:7892 +#: ./src/pass15.ec:10264 msgid "incompatible expression %s (%s); expected %s\n" msgstr "incompatible expression %s (%s); expected %s\n" -#: ./src/pass15.ec:8159 -#: ./src/pass15.ec:8319 +#: ./src/pass15.ec:8153 +#: ./src/pass15.ec:8313 msgid "incompatible expressions %s (%s) and %s (%s)\n" msgstr "incompatible expressions %s (%s) and %s (%s)\n" @@ -230,11 +230,11 @@ msgstr "incompatible parameter %s (expected %s)\n" msgid "incompatible return type for function\n" msgstr "incompatible return type for function\n" -#: ./src/pass15.ec:9267 +#: ./src/pass15.ec:9269 msgid "invalid class specifier %s for object of class %s\n" msgstr "invalid class specifier %s for object of class %s\n" -#: ./src/pass15.ec:9737 +#: ./src/pass15.ec:9739 msgid "member operator on non-structure type expression %s\n" msgstr "member operator on non-structure type expression %s\n" @@ -257,11 +257,11 @@ msgstr "no get defined for property %s of class %s\n" msgid "no set defined for property %s of class %s\n" msgstr "no set defined for property %s of class %s\n" -#: ./src/pass15.ec:8947 +#: ./src/pass15.ec:8949 msgid "not enough arguments for function %s (%d given, expected %d)\n" msgstr "not enough arguments for function %s (%d given, expected %d)\n" -#: ./src/pass15.ec:8943 +#: ./src/pass15.ec:8945 msgid "not enough arguments for method %s::%s (%d given, expected %d)\n" msgstr "not enough arguments for method %s::%s (%d given, expected %d)\n" @@ -269,11 +269,11 @@ msgstr "not enough arguments for method %s::%s (%d given, expected %d)\n" msgid "not enough parameters\n" msgstr "not enough parameters\n" -#: ./src/pass15.ec:7985 +#: ./src/pass15.ec:7979 msgid "operating on %s and %s with an untyped result, assuming %s\n" msgstr "operating on %s and %s with an untyped result, assuming %s\n" -#: ./src/pass15.ec:7810 +#: ./src/pass15.ec:7804 msgid "operator %s illegal on pointer\n" msgstr "operator %s illegal on pointer\n" @@ -309,11 +309,11 @@ msgstr "redefinition of destructor for class %s\n" msgid "syntax error\n" msgstr "syntax error\n" -#: ./src/pass15.ec:8866 +#: ./src/pass15.ec:8860 msgid "too many arguments for function %s (%d given, expected %d)\n" msgstr "too many arguments for function %s (%d given, expected %d)\n" -#: ./src/pass15.ec:8862 +#: ./src/pass15.ec:8856 msgid "too many arguments for method %s::%s (%d given, expected %d)\n" msgstr "too many arguments for method %s::%s (%d given, expected %d)\n" @@ -325,20 +325,20 @@ msgstr "too many initializers for instantiation of class %s\n" msgid "too many parameters\n" msgstr "too many parameters\n" -#: ./src/pass15.ec:9720 +#: ./src/pass15.ec:9722 msgid "undefined class %s\n" msgstr "undefined class %s\n" -#: ./src/pass15.ec:10298 +#: ./src/pass15.ec:10300 msgid "unresolved identifier %s::%s\n" msgstr "unresolved identifier %s::%s\n" -#: ./src/pass15.ec:10217 +#: ./src/pass15.ec:10219 msgid "unresolved identifier %s; expected %s\n" msgstr "unresolved identifier %s; expected %s\n" -#: ./src/pass15.ec:10229 -#: ./src/pass15.ec:10300 +#: ./src/pass15.ec:10231 +#: ./src/pass15.ec:10302 msgid "unresolved identifier %s\n" msgstr "unresolved identifier %s\n" @@ -346,9 +346,9 @@ msgstr "unresolved identifier %s\n" msgid "unresolved symbol used as an instance method %s\n" msgstr "unresolved symbol used as an instance method %s\n" -#: ./src/pass15.ec:7871 -#: ./src/pass15.ec:8028 -#: ./src/pass15.ec:8035 +#: ./src/pass15.ec:7865 +#: ./src/pass15.ec:8022 +#: ./src/pass15.ec:8029 msgid "void *: unknown size\n" msgstr "void *: unknown size\n" diff --git a/compiler/libec/src/pass15.ec b/compiler/libec/src/pass15.ec index 9745582..1d32137 100644 --- a/compiler/libec/src/pass15.ec +++ b/compiler/libec/src/pass15.ec @@ -8919,8 +8919,16 @@ void ProcessExpressionType(Expression exp) } else { - e.destType = type; - if(type) type.refCount++; + if(type && type.kind == ellipsisType && type.prev && type.prev.kind == classType && type.prev.classObjectType) + { + e.destType = type.prev; + e.destType.refCount++; + } + else + { + e.destType = type; + if(type) type.refCount++; + } } // Don't reach the end for the ellipsis if(type && type.kind != ellipsisType) diff --git a/ecere/src/com/dataTypes.ec b/ecere/src/com/dataTypes.ec index f791f57..b44d63c 100644 --- a/ecere/src/com/dataTypes.ec +++ b/ecere/src/com/dataTypes.ec @@ -455,7 +455,57 @@ static char * OnGetString(Class _class, void * data, char * tempString, void * f } else if(_class.type == unitClass) { - Class dataType = eSystem_FindClass(module, _class.dataTypeString); + Class dataType; + Property prop; + for(prop = _class.conversions.first; prop; prop = prop.next) + { + bool refProp = false; + Class c; + if(!strcmp(prop.name, _class.base.fullName)) + refProp = true; + else if( (c = eSystem_FindClass(_class.module, prop.name) ) ) + { + Property p; + for(p = c.conversions.first; p; p = p.next) + { + if(!strcmp(p.name, _class.base.fullName) && !p.Set && !p.Get) + { + refProp = true; + break; + } + } + } + if(refProp) + { + if(prop.Set && prop.Get) + { + String dts = _class.base.dataTypeString; + if(!strcmp(dts, "double")) + { + double d = ((double(*)(double))(void *)prop.Set)(*(double *)data); + return ((char *(*)(void *, void *, char *, void *, bool *))(void *)class(double)._vTbl[__ecereVMethodID_class_OnGetString])(class(double), &d, tempString, fieldData, needClass); + } + else if(!strcmp(dts, "float")) + { + float d = ((float(*)(float))(void *)prop.Set)(*(float *)data); + return ((char *(*)(void *, void *, char *, void *, bool *))(void *)class(float)._vTbl[__ecereVMethodID_class_OnGetString])(class(float), &d, tempString, fieldData, needClass); + } + else if(!strcmp(dts, "int")) + { + int d = ((int(*)(int))(void *)prop.Set)(*(int *)data); + return ((char *(*)(void *, void *, char *, void *, bool *))(void *)class(int)._vTbl[__ecereVMethodID_class_OnGetString])(class(int), &d, tempString, fieldData, needClass); + } + else if(!strcmp(dts, "int64")) + { + int64 d = ((int64(*)(int64))(void *)prop.Set)(*(int64 *)data); + return ((char *(*)(void *, void *, char *, void *, bool *))(void *)class(int64)._vTbl[__ecereVMethodID_class_OnGetString])(class(int64), &d, tempString, fieldData, needClass); + } + } + else + break; + } + } + dataType = eSystem_FindClass(module, _class.dataTypeString); return ((char *(*)(void *, void *, char *, void *, bool *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetString])(dataType, data, tempString, fieldData, needClass); } else @@ -702,7 +752,65 @@ static bool OnGetDataFromString(Class _class, void ** data, char * string) result = Enum_OnGetDataFromString(_class, (int *)data, string); else if(_class.type == unitClass) { - Class dataType = eSystem_FindClass(module, _class.dataTypeString); + Class dataType; + Property prop; + for(prop = _class.conversions.first; prop; prop = prop.next) + { + bool refProp = false; + Class c; + if(!strcmp(prop.name, _class.base.fullName)) + refProp = true; + else if( (c = eSystem_FindClass(_class.module, prop.name) ) ) + { + Property p; + for(p = c.conversions.first; p; p = p.next) + { + if(!strcmp(p.name, _class.base.fullName) && !p.Set && !p.Get) + { + refProp = true; + break; + } + } + } + if(refProp) + { + if(prop.Set && prop.Get) + { + String dts = _class.base.dataTypeString; + if(!strcmp(dts, "double")) + { + double d; + bool result = ((bool (*)(void *, void *, const char *))(void *)class(double)._vTbl[__ecereVMethodID_class_OnGetDataFromString])(class(double), &d, string); + *(double *)data =((double(*)(double))(void *)prop.Get)(d); + return result; + } + else if(!strcmp(dts, "float")) + { + float d; + bool result = ((bool (*)(void *, void *, const char *))(void *)class(float)._vTbl[__ecereVMethodID_class_OnGetDataFromString])(class(float), &d, string); + *(float *)data = ((float(*)(float))(void *)prop.Get)(d); + return result; + } + else if(!strcmp(dts, "int")) + { + int d; + bool result = ((bool (*)(void *, void *, const char *))(void *)class(int)._vTbl[__ecereVMethodID_class_OnGetDataFromString])(class(int), &d, string); + *(int *)data = ((int(*)(int))(void *)prop.Get)(d); + return result; + } + else if(!strcmp(dts, "int64")) + { + int64 d; + bool result = ((bool (*)(void *, void *, const char *))(void *)class(int64)._vTbl[__ecereVMethodID_class_OnGetDataFromString])(class(int64), &d, string); + *(int64 *)data = ((int64(*)(int64))(void *)prop.Get)(d); + return result; + } + } + else + break; + } + } + dataType = eSystem_FindClass(module, _class.dataTypeString); return ((bool (*)(void *, void *, const char *))(void *)dataType._vTbl[__ecereVMethodID_class_OnGetDataFromString])(dataType, data, string); } else if(!string[0] && _class.type == normalClass) -- 1.8.3.1