wip II
[sdk] / compiler / bootstrap / libec / bootstrap / pass2.c
index 5d1e12b..7d2af49 100644 (file)
@@ -1,3 +1,4 @@
+/* Code generated from eC source file: pass2.ec */
 #if defined(__GNUC__)
 typedef long long int64;
 typedef unsigned long long uint64;
@@ -743,6 +744,8 @@ unsigned int keepCast : 1;
 unsigned int passAsTemplate : 1;
 unsigned int dllExport : 1;
 unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
+unsigned int typedByReference : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -802,6 +805,7 @@ struct __ecereNameSpace__ecere__com__Class * templateClass;
 struct __ecereNameSpace__ecere__sys__OldList templatized;
 int numParams;
 unsigned int isInstanceClass;
+unsigned int byValueSystemClass;
 } __attribute__ ((gcc_struct));
 
 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, char *  name);
@@ -1160,7 +1164,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 +2590,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 +2622,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 +2637,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 +2660,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];
@@ -2974,6 +2984,12 @@ if(!_class && type->kind == 13 && type->type && type->type->kind == 1)
 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "String");
 if(!_class)
 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
+if(_class->type == 0 && destType->byReference == 0x0 && strcmp(_class->dataTypeString, "char *"))
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.arguments), e->prev, MkExpPointer(CopyExpression(e), MkIdentifier("_class")));
+}
+else
+{
 if(!strcmp(_class->name, "class"))
 {
 strcpy(className, "class");
@@ -2991,8 +3007,9 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.argument
 }
 }
 }
+}
 {
-FixReference(e, 0x1);
+FixReference(e, !destType || !destType->declaredWithStruct);
 }
 }
 if(ellipsisDestType)
@@ -3009,7 +3026,7 @@ case 8:
 {
 unsigned int changeToPtr = 0x0;
 unsigned int noHead = 0x0;
-struct Type * type = exp->member.exp->expType;
+struct Type * type = exp->member.exp ? exp->member.exp->expType : (((void *)0));
 struct Specifier * memberClassSpecifier = exp->member.member ? exp->member.member->_class : (((void *)0));
 
 if(exp->member.member)
@@ -3336,12 +3353,13 @@ else if(_class->type == 3)
 }
 else
 {
-if(thisPtr)
+if(exp->member.exp->type == 0 && thisPtr && (!exp->member.exp->expType || !exp->member.exp->expType->typedByReference))
 {
 char pointerName[1024];
 
 strcpy(pointerName, "__ecerePointer_");
 FullClassNameCat(pointerName, type->_class->registered->fullName, 0x0);
+if(exp->member.exp->identifier)
 FreeIdentifier(exp->member.exp->identifier);
 exp->member.exp->identifier = MkIdentifier(pointerName);
 }
@@ -3432,7 +3450,7 @@ exp->type = 9;
 }
 }
 FreeSpecifier(memberClassSpecifier);
-if(exp->type == 8 || exp->type == 9)
+if(exp->member.exp && (exp->type == 8 || exp->type == 9))
 {
 exp->member.exp->usage = (exp->member.exp->usage & ~0x1) | (((unsigned int)0x1) << 0);
 exp->member.exp->usage = (exp->member.exp->usage & ~0x10) | (((unsigned int)0x1) << 4);
@@ -3535,11 +3553,12 @@ else
 {
 char className[1024];
 char * string = StringFromSpecDecl(exp->_classExp.specifiers, exp->_classExp.decl);
+struct Symbol * classSym = FindClass(string);
 
 strcpy(className, "__ecereClass_");
 FullClassNameCat(className, string, 0x1);
 MangleClassName(className);
-DeclareClass(FindClass(string), className);
+DeclareClass(classSym, className);
 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
 FreeList(exp->_classExp.specifiers, FreeSpecifier);
 if(exp->_classExp.decl)