compiler/bootstrap: (#980) Updated for 0.44.08
authorJerome St-Louis <jerome@ecere.com>
Fri, 9 Aug 2013 02:47:51 +0000 (22:47 -0400)
committerJerome St-Louis <jerome@ecere.com>
Fri, 9 Aug 2013 02:48:15 +0000 (22:48 -0400)
23 files changed:
compiler/bootstrap/ecc/bootstrap/ecc.c
compiler/bootstrap/ecc/bootstrap/ecc.main.c
compiler/bootstrap/ecere/bootstrap/String.c
compiler/bootstrap/ecere/bootstrap/dataTypes.c
compiler/bootstrap/ecere/bootstrap/instance.c
compiler/bootstrap/ecp/bootstrap/ecp.c
compiler/bootstrap/ecp/bootstrap/ecp.main.c
compiler/bootstrap/ecs/bootstrap/ecs.c
compiler/bootstrap/ecs/bootstrap/ecs.main.c
compiler/bootstrap/libec/bootstrap/ast.c
compiler/bootstrap/libec/bootstrap/copy.c
compiler/bootstrap/libec/bootstrap/dbpass.c
compiler/bootstrap/libec/bootstrap/ecdefs.c
compiler/bootstrap/libec/bootstrap/firstPass.c
compiler/bootstrap/libec/bootstrap/freeAst.c
compiler/bootstrap/libec/bootstrap/lexer.c
compiler/bootstrap/libec/bootstrap/output.c
compiler/bootstrap/libec/bootstrap/pass0.c
compiler/bootstrap/libec/bootstrap/pass1.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/bootstrap/libec/bootstrap/pass16.c
compiler/bootstrap/libec/bootstrap/pass2.c
compiler/bootstrap/libec/bootstrap/pass3.c

index fdede91..8215353 100644 (file)
@@ -127,7 +127,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
index eed68c6..a61d5b5 100644 (file)
@@ -127,7 +127,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
index 8292538..66cf0bc 100644 (file)
@@ -951,7 +951,7 @@ strcat(string, " MB");
 }
 else
 {
-sprintf(string, format, (float)size / (float)(float)1024);
+sprintf(string, format, (float)size / (float)1024);
 strcat(string, " KB");
 }
 }
@@ -1338,7 +1338,7 @@ extern unsigned int isdigit(int);
 double __ecereNameSpace__ecere__sys__FloatFromString(char * string)
 {
 int c, dig;
-float dec = (float)0, res = (float)0;
+float dec = 0, res = 0;
 int neg = 1;
 char ch;
 
@@ -1354,7 +1354,7 @@ break;
 neg = -1;
 }
 else if((ch == '.') && !dec)
-dec = (float)10;
+dec = 10;
 else if(isdigit(ch))
 {
 dig = ch - '0';
index 75b001c..c99f236 100644 (file)
@@ -544,12 +544,17 @@ extern int toupper(int);
 
 char * __ecereNameSpace__ecere__com__Enum_OnGetString(struct __ecereNameSpace__ecere__com__Class * _class, int * data, char * tempString, void * fieldData, unsigned int * needClass)
 {
-struct __ecereNameSpace__ecere__com__EnumClassData * enumeration = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
-struct __ecereNameSpace__ecere__sys__NamedLink * item;
+struct __ecereNameSpace__ecere__sys__NamedLink * item = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * b;
+
+for(b = _class; !item && b && b->type == 4; b = b->base)
+{
+struct __ecereNameSpace__ecere__com__EnumClassData * enumeration = (struct __ecereNameSpace__ecere__com__EnumClassData *)b->data;
 
 for(item = enumeration->values.first; item; item = item->next)
 if((int)item->data == *data)
 break;
+}
 if(item)
 {
 strcpy(tempString, item->name);
@@ -567,14 +572,19 @@ static unsigned int __ecereNameSpace__ecere__com__Integer_OnGetDataFromString(st
 
 static unsigned int __ecereNameSpace__ecere__com__Enum_OnGetDataFromString(struct __ecereNameSpace__ecere__com__Class * _class, int * data, char * string)
 {
+struct __ecereNameSpace__ecere__sys__NamedLink * item = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * b;
+
+for(b = _class; !item && b && b->type == 4; b = b->base)
+{
 struct __ecereNameSpace__ecere__com__EnumClassData * enumeration = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
-struct __ecereNameSpace__ecere__sys__NamedLink * item;
 
 for(item = enumeration->values.first; item; item = item->next)
 {
 if(item->name && !(strcasecmp)(item->name, string))
 break;
 }
+}
 if(item)
 {
 *data = (int)item->data;
@@ -1016,11 +1026,12 @@ if(memberType->type == 1 || memberType->type == 0)
 char internalMemberString[1024];
 unsigned char * memberData = ((unsigned char *)data + (((member->_class->type == 0) ? member->_class->offset : 0) + member->offset));
 int c;
+unsigned int typeSize = (memberType->type == 0) ? memberType->typeSize : memberType->structSize;
 
-for(c = 0; c < memberType->structSize; c++)
+for(c = 0; c < typeSize; c++)
 if(memberData[c])
 break;
-if(c < memberType->structSize)
+if(c < typeSize)
 {
 unsigned int needClass = 0x1;
 char * result;
@@ -1029,7 +1040,7 @@ if(memberType->type == 0)
 result = ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, *(struct __ecereNameSpace__ecere__com__Instance **)memberData, internalMemberString, (((void *)0)), &needClass);
 else
 result = ((char * (*)(void *, void *, char *, void *, unsigned int *))(void *)memberType->_vTbl[__ecereVMethodID_class_OnGetString])(memberType, memberData, internalMemberString, (((void *)0)), &needClass);
-if(needClass)
+if(needClass && strcmp(memberType->dataTypeString, "char *"))
 {
 strcat(memberString, "{ ");
 if(result)
@@ -1519,7 +1530,7 @@ struct __ecereNameSpace__ecere__com__Class * c;
 
 for(c = _class; c && (!c->base || c->base->type != 1000) && c->base != lastClass; c = c->base)
 ;
-lastClass = _class;
+lastClass = c;
 for(member = c->membersAndProperties.first; member; member = member->next)
 {
 if(member->id < 0)
@@ -2287,7 +2298,7 @@ unsigned char bytes[4];
 if(((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, unsigned char *  data, unsigned int numBytes))channel->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 4) == 4)
 *(unsigned int *)data = (unsigned int)(((bytes)[0] << (unsigned char)24) | ((bytes)[1] << (unsigned char)16) | ((bytes)[2] << (unsigned char)8) | (bytes)[3]);
 else
-*data = (float)0;
+*data = 0;
 }
 
 static void __ecereNameSpace__ecere__com__RegisterClass_Float(struct __ecereNameSpace__ecere__com__Instance * module)
@@ -2386,7 +2397,7 @@ unsigned char bytes[8];
 if(((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, unsigned char *  data, unsigned int numBytes))channel->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__com__IOChannel_ReadData])(channel, bytes, 8) == 8)
 *(uint64 *)data = (((uint64)(bytes)[0] << 56) | ((uint64)(bytes)[1] << 48) | ((uint64)(bytes)[2] << 40) | ((uint64)(bytes)[3] << 32) | ((uint64)(bytes)[4] << 24) | ((bytes)[5] << (unsigned char)16) | ((bytes)[6] << (unsigned char)8) | (bytes)[7]);
 else
-*data = (double)0;
+*data = 0;
 }
 
 static void __ecereNameSpace__ecere__com__RegisterClass_Double(struct __ecereNameSpace__ecere__com__Instance * module)
index 97ab068..92f5463 100644 (file)
@@ -1523,6 +1523,7 @@ char * dataTypeString = (((void *)0));
 struct __ecereNameSpace__ecere__com__Class * enumBase = (((void *)0));
 struct __ecereNameSpace__ecere__com__Class * base = (baseName && baseName[0]) ? __ecereNameSpace__ecere__com__eSystem_FindClass(module, baseName) : (((void *)0));
 unsigned int refine = 0x0;
+struct __ecereNameSpace__ecere__com__Class * prevBase = (((void *)0));
 
 if(base && !base->internalDecl && (base->type == 5 || base->type == 1 || base->type == 0))
 {
@@ -1768,6 +1769,7 @@ template->nameSpace = nameSpace;
 }
 }
 _class->module = module;
+prevBase = _class->base;
 _class->base = base;
 if(base)
 {
@@ -1904,12 +1906,28 @@ else
 data->largest = ((struct __ecereNameSpace__ecere__com__EnumClassData *)base->data)->largest;
 }
 }
-if(base && base->vTblSize && _class->vTblSize < base->vTblSize)
+if(base)
+{
+int i;
+unsigned int oldSize = _class->vTblSize;
+
+if(base->vTblSize && _class->vTblSize < base->vTblSize)
 {
 _class->vTblSize = base->vTblSize;
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
-_class->_vTbl = __ecereNameSpace__ecere__com___malloc(sizeof(int (*)()) * _class->vTblSize);
-memcpy(_class->_vTbl, base->_vTbl, sizeof(int (*)()) * _class->vTblSize);
+_class->_vTbl = __ecereNameSpace__ecere__com___realloc(_class->_vTbl, sizeof(int (*)()) * _class->vTblSize);
+}
+if(!prevBase)
+{
+if(_class->type == 0 && strcmp(_class->name, "ecere::com::Instance") && strcmp(_class->name, "enum") && strcmp(_class->name, "struct"))
+prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "ecere::com::Instance");
+else
+prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "class");
+}
+for(i = 0; i < base->vTblSize; i++)
+{
+if(i >= oldSize || _class->_vTbl[i] == prevBase->_vTbl[i])
+_class->_vTbl[i] = base->_vTbl[i];
+}
 }
 if(_class->base)
 {
index f5fda76..82b096f 100644 (file)
@@ -128,7 +128,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
@@ -681,6 +681,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -1253,9 +1254,10 @@ if(decl->declarators)
 {
 for(d = (*decl->declarators).first; d; d = d->next)
 {
-{
 struct Identifier * declId = GetDeclId(d);
 
+if(declId)
+{
 dataMemberDefine = __extension__ ({
 struct DataMemberDefine * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_DataMemberDefine);
 
index bafc954..563efba 100644 (file)
@@ -127,7 +127,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
index 2288b5e..c6b338c 100644 (file)
@@ -127,7 +127,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
@@ -386,6 +386,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 075f5e4..efb82bf 100644 (file)
@@ -127,7 +127,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
index 77406f0..4f25a0e 100644 (file)
@@ -823,6 +823,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -4155,6 +4156,7 @@ struct Symbol * _class = spec->id ? FindClass(spec->id->string) : (((void *)0));
 
 if(_class)
 {
+specType->declaredWithStruct = 0x1;
 if(!_class->registered || _class->registered->type != 1)
 specType->directClassAccess = 0x1;
 specType->_class = _class;
@@ -4873,6 +4875,8 @@ __ecereMethod___ecereNameSpace__ecere__sys__File_Printf(f, "msgstr \"%s\"\n\n",
 
 extern int yyparse();
 
+extern int yylex();
+
 void SetAST(struct __ecereNameSpace__ecere__sys__OldList * list)
 {
 ast = list;
@@ -4888,6 +4892,16 @@ void ParseEc()
 yyparse();
 }
 
+int LexEc()
+{
+return yylex();
+}
+
+const char * GetYYText()
+{
+return yytext;
+}
+
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__GlobalFunction;
 
 struct __ecereNameSpace__ecere__com__GlobalFunction;
@@ -5081,6 +5095,8 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OutputIntlStrings", "voi
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetAST", "void SetAST(ecere::sys::OldList * list)", SetAST, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetAST", "ecere::sys::OldList * GetAST(void)", GetAST, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseEc", "void ParseEc(void)", ParseEc, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("LexEc", "int LexEc(void)", LexEc, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetYYText", "const char * GetYYText(void)", GetYYText, module, 1);
 }
 
 void __ecereUnregisterModule_ast(struct __ecereNameSpace__ecere__com__Instance * module)
index 5b813e2..0427cd5 100644 (file)
@@ -642,6 +642,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index f4b8f4e..1943e1f 100644 (file)
@@ -714,6 +714,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 75fc96f..d80261c 100644 (file)
@@ -803,6 +803,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 static struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
@@ -2853,6 +2854,7 @@ __ecereNameSpace__ecere__com__eClass_AddDataMember(class, "keepCast", "bool:1",
 __ecereNameSpace__ecere__com__eClass_AddDataMember(class, "passAsTemplate", "bool:1", 4, 4, 1);
 __ecereNameSpace__ecere__com__eClass_AddDataMember(class, "dllExport", "bool:1", 4, 4, 1);
 __ecereNameSpace__ecere__com__eClass_AddDataMember(class, "attrStdcall", "bool:1", 4, 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(class, "declaredWithStruct", "bool:1", 4, 4, 1);
 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(1, "Operand", 0, sizeof(struct Operand), 0, 0, 0, module, 1, 1);
 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application && class)
 __ecereClass_Operand = class;
index b5b3df3..2a039d8 100644 (file)
@@ -657,6 +657,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index f776a8d..34dbcff 100644 (file)
@@ -831,6 +831,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 95962cd..551d811 100644 (file)
@@ -1767,6 +1767,7 @@ defaultDeclMode = declMode = declModeStack[include_stack_ptr];
 }
 if(--include_stack_ptr < 0)
 {
+include_stack_ptr = 0;
 return 0;
 }
 else
index 2595589..4aca7fa 100644 (file)
@@ -770,6 +770,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 1202b80..a0f4942 100644 (file)
@@ -754,6 +754,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 44df3f7..f85adc2 100644 (file)
@@ -760,6 +760,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -1236,11 +1237,11 @@ else
 struct Type * typeParam;
 struct Declarator * funcDecl = GetFuncDecl(func->declarator);
 
-if(funcDecl->function.parameters)
+if(funcDecl->function.parameters && (*funcDecl->function.parameters).first)
 {
 struct TypeName * param = (*funcDecl->function.parameters).first;
 
-for(typeParam = methodDataType->params.first; typeParam; typeParam = typeParam->next)
+for(typeParam = methodDataType->params.first; typeParam && param; typeParam = typeParam->next)
 {
 if(typeParam->classObjectType)
 {
@@ -1248,7 +1249,7 @@ param->classObjectType = typeParam->classObjectType;
 if(param->declarator && param->declarator->symbol)
 param->declarator->symbol->type->classObjectType = typeParam->classObjectType;
 }
-param = param->next;
+param = param ? param->next : (((void *)0));
 }
 }
 }
@@ -1313,6 +1314,8 @@ struct __ecereNameSpace__ecere__com__Method * method = func->declarator->symbol-
 
 if(method && method->symbol)
 ((struct Symbol *)method->symbol)->methodCodeExternal = (((void *)0));
+if(func->declarator->symbol && func->declarator->symbol->methodExternal == external)
+func->declarator->symbol->methodExternal = (((void *)0));
 func->declarator = (((void *)0));
 func->specifiers = (((void *)0));
 FreeExternal(external);
@@ -2044,6 +2047,23 @@ extern void __ecereNameSpace__ecere__com__eEnum_AddFixedValue(struct __ecereName
 
 extern int __ecereNameSpace__ecere__com__eEnum_AddValue(struct __ecereNameSpace__ecere__com__Class * _class, char *  string);
 
+extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__OldLink;
+
+struct __ecereNameSpace__ecere__sys__OldLink
+{
+struct __ecereNameSpace__ecere__sys__OldLink * prev;
+struct __ecereNameSpace__ecere__sys__OldLink * next;
+void *  data;
+} __attribute__ ((gcc_struct));
+
+extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__EnumClassData;
+
+struct __ecereNameSpace__ecere__com__EnumClassData
+{
+struct __ecereNameSpace__ecere__sys__OldList values;
+int largest;
+} __attribute__ ((gcc_struct));
+
 extern struct ClassFunction * MkClassFunction(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct Specifier * _class, struct Declarator * decl, struct __ecereNameSpace__ecere__sys__OldList * declList);
 
 extern void ProcessClassFunctionBody(struct ClassFunction * func, struct Statement * body);
@@ -2076,14 +2096,6 @@ extern void DeclareMethod(struct __ecereNameSpace__ecere__com__Method * method,
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, char *  name);
 
-extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__EnumClassData;
-
-struct __ecereNameSpace__ecere__com__EnumClassData
-{
-struct __ecereNameSpace__ecere__sys__OldList values;
-int largest;
-} __attribute__ ((gcc_struct));
-
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__NamedLink;
 
 struct __ecereNameSpace__ecere__sys__NamedLink
@@ -2165,6 +2177,22 @@ __ecereNameSpace__ecere__com__eEnum_AddValue(regClass, e->id->string);
 else
 __ecereNameSpace__ecere__com__eEnum_AddValue(regClass, e->id->string);
 }
+{
+struct __ecereNameSpace__ecere__com__EnumClassData * baseData = regClass->data;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv;
+
+for(deriv = regClass->derivatives.first; deriv; deriv = deriv->next)
+{
+struct __ecereNameSpace__ecere__com__Class * c = deriv->data;
+
+if(c && c->type == 4)
+{
+struct __ecereNameSpace__ecere__com__EnumClassData * data = c->data;
+
+data->largest = baseData->largest;
+}
+}
+}
 }
 if(definitions != (((void *)0)))
 {
@@ -2421,7 +2449,7 @@ for(c = 0; c < base->vTblSize; c++)
 {
 struct Symbol * method = (struct Symbol *)regClass->_vTbl[c];
 
-if((void *)method != DummyMethod && base->_vTbl[c] != (void *)method)
+if((void *)method != DummyMethod && base->_vTbl[c] != (void *)method && method->methodExternal)
 {
 struct External * external = method->methodExternal;
 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
index c271d38..c8c74eb 100644 (file)
@@ -801,6 +801,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -4680,7 +4681,7 @@ else if(source->_class && dest->_class && (dest->classObjectType == source->clas
 return 0x1;
 else
 {
-if(enumBaseType && dest->_class && dest->_class->registered && dest->_class->registered->type == 4 && source->_class && source->_class->registered && source->_class->registered->type != 4)
+if(enumBaseType && dest->_class && dest->_class->registered && dest->_class->registered->type == 4 && ((source->_class && source->_class->registered && source->_class->registered->type != 4) || source->kind == 8))
 {
 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->_class->registered, source->_class->registered))
 {
@@ -6070,7 +6071,7 @@ static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(value2 ? (op1->f / value2) : (float)0);
+exp->string = PrintFloat(value2 ? (op1->f / value2) : 0);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6085,7 +6086,7 @@ static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(value2 ? (op1->d / value2) : (double)0);
+exp->string = PrintDouble(value2 ? (op1->d / value2) : 0);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7072,7 +7073,7 @@ static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1,
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(value2 ? (op1->f /= value2) : (float)0);
+exp->string = PrintFloat(value2 ? (op1->f /= value2) : 0);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7087,7 +7088,7 @@ static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(value2 ? (op1->d /= value2) : (double)0);
+exp->string = PrintDouble(value2 ? (op1->d /= value2) : 0);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9842,6 +9843,8 @@ else
 {
 dataMember = curMember;
 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
+if(_class->type == 0)
+dataMemberOffset += _class->base->structSize;
 }
 found = 0x1;
 }
@@ -12423,7 +12426,7 @@ if(type && (type->kind == 15 || (_class && _class->type == 4)))
 exp->isConstant = 0x1;
 if(symbol->isParam || !strcmp(id->string, "this"))
 {
-if(_class && _class->type == 1)
+if(_class && _class->type == 1 && !type->declaredWithStruct)
 exp->byReference = 0x1;
 }
 if(symbol->isIterator)
@@ -12645,6 +12648,12 @@ type->isSigned = 0x1;
 type->kind = 3;
 }
 exp->isConstant = 0x1;
+if(exp->destType && exp->destType->kind == 7)
+type->kind = 7;
+else if(exp->destType && exp->destType->kind == 6)
+type->kind = 6;
+else if(exp->destType && exp->destType->kind == 4)
+type->kind = 4;
 }
 break;
 }
index 63a44b8..74e7d1c 100644 (file)
@@ -752,6 +752,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
index 5d1e12b..81e0930 100644 (file)
@@ -743,6 +743,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -1160,7 +1161,7 @@ if(type->kind == 8)
 {
 struct __ecereNameSpace__ecere__com__Class * _class = type->_class ? type->_class->registered : (((void *)0));
 
-if(_class && (_class->type == 1 || _class->type == 5 || (_class->type == 1000 && _class->base && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr") && strcmp(_class->fullName, "uintsize") && strcmp(_class->fullName, "intsize"))))
+if(_class && ((_class->type == 1 && !type->declaredWithStruct) || _class->type == 5 || (_class->type == 1000 && _class->base && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr") && strcmp(_class->fullName, "uintsize") && strcmp(_class->fullName, "intsize"))))
 {
 if(wantReference != (e->byReference || isPointer))
 {
@@ -2586,10 +2587,11 @@ struct Type * type = memberExp->member.exp->expType;
 
 if(type->kind == 8 && type->_class && type->_class->registered)
 {
-int classType = memberExp->member.exp->expType->_class->registered->type;
+struct __ecereNameSpace__ecere__com__Class * regClass = type->_class->registered;
+int classType = regClass->type;
 
-if(classType != 0 || method->dataType->byReference)
-argClass = type->_class->registered;
+if(classType != 0 || !strcmp(regClass->dataTypeString, "char *") || method->dataType->byReference)
+argClass = regClass;
 }
 else if(type->kind == 19)
 {
@@ -2617,9 +2619,13 @@ if(classSym)
 argClass = classSym->registered;
 }
 }
-if(!exp->call.exp->expType->methodClass && (!memberExp || !_class) && memberExp->member.exp->expType && memberExp->member.exp->expType->classObjectType)
 {
-if(memberExp->member.exp->expType->kind == 8 && memberExp->member.exp->expType->_class && memberExp->member.exp->expType->_class->registered && memberExp->member.exp->expType->_class->registered->type == 0)
+struct Type * type = memberExp ? memberExp->member.exp->expType : (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * regClass = (type && type->kind == 8 && type->_class) ? type->_class->registered : (((void *)0));
+
+if(!exp->call.exp->expType->methodClass && (!memberExp || !_class) && type && type->classObjectType)
+{
+if(regClass && regClass->type == 0 && strcmp(regClass->dataTypeString, "char *"))
 {
 exp->call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(MkExpBrackets(MkListOne(CopyExpression(memberExp->member.exp))), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
 }
@@ -2628,7 +2634,7 @@ else
 exp->call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier("class")), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
 }
 }
-else if(memberExp && !_class && exp->call.exp->expType->_class && (memberExp->member.exp->expType->kind == 19 || (memberExp->member.exp->expType->kind == 8 && memberExp->member.exp->expType->_class && memberExp->member.exp->expType->_class->registered && memberExp->member.exp->expType->_class->registered->type == 0)))
+else if(memberExp && !_class && exp->call.exp->expType->_class && (type->kind == 19 || (regClass && regClass->type == 0 && strcmp(regClass->dataTypeString, "char *"))))
 {
 exp->call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(CopyExpression(memberExp->member.exp), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
 }
@@ -2651,6 +2657,7 @@ DeclareClass(_class->symbol, className);
 exp->call.exp = MkExpBrackets(MkListOne(MkExpCast(typeName, MkExpIndex(MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl")), MkListOne(MkExpIdentifier(MkIdentifier(name)))))));
 }
 }
+}
 else
 {
 char name[1024];
@@ -2992,7 +2999,7 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.argument
 }
 }
 {
-FixReference(e, 0x1);
+FixReference(e, !destType || !destType->declaredWithStruct);
 }
 }
 if(ellipsisDestType)
index c8033d4..32be27c 100644 (file)
@@ -729,6 +729,7 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;