compiler/libec: Fixed passing of typed objects in ellipsis functions; Fixed string...
authorJerome St-Louis <jerome@ecere.com>
Sun, 10 Mar 2013 13:57:57 +0000 (09:57 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sun, 10 Mar 2013 13:57:57 +0000 (09:57 -0400)
- 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
compiler/bootstrap/ecere/bootstrap/String.c
compiler/bootstrap/ecere/bootstrap/dataTypes.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/libec/locale/ec.pot
compiler/libec/src/pass15.ec
ecere/src/com/dataTypes.ec

index 06146ec..77834e6 100644 (file)
@@ -28,6 +28,7 @@ typedef unsigned __int64 uint64;
 #define __ENDIAN_PAD(x) 0
 #endif
 #include <stdint.h>
+#include <sys/types.h>
 
 #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);
index 2f64c1e..f39968a 100644 (file)
@@ -28,6 +28,7 @@ typedef unsigned __int64 uint64;
 #define __ENDIAN_PAD(x) 0
 #endif
 #include <stdint.h>
+#include <sys/types.h>
 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)
 {
index 05d835e..31244f6 100644 (file)
@@ -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);
index d6dfb65..f262763 100644 (file)
@@ -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;
index 37aff8b..0012989 100644 (file)
@@ -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"
 
index 9745582..1d32137 100644 (file)
@@ -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)
index f791f57..b44d63c 100644 (file)
@@ -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)