marked all generated bootstrap C source files with 'code generated from eC srouce...
[sdk] / compiler / bootstrap / libec / bootstrap / pass2.c
index 276ee39..742525c 100644 (file)
@@ -1,3 +1,4 @@
+/* Code generated from eC source file. */
 #if defined(__GNUC__)
 typedef long long int64;
 typedef unsigned long long uint64;
@@ -116,7 +117,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;
@@ -723,25 +724,27 @@ struct Symbol * enumClass;
 struct Type * type;
 struct TemplateParameter * templateParameter;
 } __attribute__ ((gcc_struct));
-unsigned int isSigned;
 int kind;
-unsigned int constant;
 unsigned int size;
 char *  name;
 char *  typeName;
-unsigned int count;
-unsigned int truth;
 int classObjectType;
-unsigned int byReference;
-unsigned int extraParam;
 int alignment;
-unsigned int directClassAccess;
-unsigned int computing;
-unsigned int dllExport;
 unsigned int offset;
-unsigned int keepCast;
-unsigned int passAsTemplate;
 int bitFieldCount;
+int count;
+unsigned int isSigned : 1;
+unsigned int constant : 1;
+unsigned int truth : 1;
+unsigned int byReference : 1;
+unsigned int extraParam : 1;
+unsigned int directClassAccess : 1;
+unsigned int computing : 1;
+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;
@@ -800,6 +803,7 @@ struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
 struct __ecereNameSpace__ecere__com__Class * templateClass;
 struct __ecereNameSpace__ecere__sys__OldList templatized;
 int numParams;
+unsigned int isInstanceClass;
 } __attribute__ ((gcc_struct));
 
 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, char *  name);
@@ -1108,7 +1112,7 @@ bracketExp->list = (((void *)0));
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->list), idExp);
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*exp->list), newExp);
 FreeExpression(bracketExp);
-*expPtr = newExp;
+*expPtr = exp;
 }
 }
 else if(*expPtr && (*expPtr)->type == 4 && (*expPtr)->op.op == '&' && !(*expPtr)->op.exp1 && memberExp && (memberExp->type == 5 || memberExp->type == 34) && memberExp->list && (*memberExp->list).count > 1)
@@ -1158,7 +1162,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") && strcmp(_class->fullName, "ecere::com::Instance") && strcmp(_class->fullName, "ecere::com::Class") && strcmp(_class->dataTypeString, "char *"))))
+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))
 {
@@ -1402,13 +1406,11 @@ extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
 
 extern struct __ecereNameSpace__ecere__com__Method * __ecereNameSpace__ecere__com__eClass_FindMethod(struct __ecereNameSpace__ecere__com__Class * _class, char *  name, struct __ecereNameSpace__ecere__com__Instance * module);
 
-extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, char *  name);
-
 extern void ProcessExpressionType(struct Expression * exp);
 
 extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
 
-extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (* )(void * ));
+extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (*  CopyFunction)(void * ));
 
 extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, struct __ecereNameSpace__ecere__com__Class * curClass, unsigned int pointer);
 
@@ -1416,6 +1418,8 @@ extern struct __ecereNameSpace__ecere__com__Class * thisClass;
 
 extern struct Expression * MkExpMember(struct Expression * expression, struct Identifier * member);
 
+extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, char *  name);
+
 extern struct Context * globalContext;
 
 extern void FreeSymbol(struct Symbol * symbol);
@@ -1442,7 +1446,9 @@ extern void FinishTemplatesContext(struct Context * context);
 
 extern struct Specifier * MkStructOrUnion(int type, struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * definitions);
 
-extern void PrintType(struct Type * type, char *  string, unsigned int printName, unsigned int fullName);
+extern struct Type * ProcessTypeString(char *  string, unsigned int staticMethod);
+
+extern void PrintTypeNoConst(struct Type * type, char *  string, unsigned int printName, unsigned int fullName);
 
 extern int ComputeTypeSize(struct Type * type);
 
@@ -1462,7 +1468,7 @@ extern void FreeSpecifier(struct Specifier * spec);
 
 static void ProcessStatement(struct Statement * stmt);
 
-extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (* )(void * ));
+extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
 
 extern void FreeDeclarator(struct Declarator * decl);
 
@@ -2156,7 +2162,7 @@ exp->list = MkList();
 object->usage = (object->usage & ~0x80) | (((unsigned int)0x1) << 7);
 ProcessExpression(object);
 ListAdd(args, object);
-if(exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && ((exp->expType->_class->registered->type == 0 && !__ecereNameSpace__ecere__com__eClass_IsDerived(exp->expType->_class->registered, __ecereNameSpace__ecere__com__eSystem_FindClass(exp->expType->_class->registered->module, "char *"))) || (exp->expType->_class->registered->type == 1000 && !strcmp(exp->expType->_class->string, "ecere::com::Instance"))))
+if(exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && exp->expType->_class->registered->type == 0 && strcmp(exp->expType->_class->registered->dataTypeString, "char *"))
 {
 struct Expression * decRefExp = MkExpCall(QMkExpId("ecere::com::eInstance_DecRef"), args);
 
@@ -2578,28 +2584,49 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->function
 typeName = MkTypeName(specs, decl);
 if(memberExp && memberExp->member.exp->expType)
 {
-if(memberExp->member.exp->expType->kind == 8 && memberExp->member.exp->expType->_class && memberExp->member.exp->expType->_class->registered)
+struct Type * type = memberExp->member.exp->expType;
+
+if(type->kind == 8 && type->_class && type->_class->registered)
 {
-int type = memberExp->member.exp->expType->_class->registered->type;
+struct __ecereNameSpace__ecere__com__Class * regClass = type->_class->registered;
+int classType = regClass->type;
 
-if(type != 0 || method->dataType->byReference)
-argClass = memberExp->member.exp->expType->_class->registered;
+if(classType != 0 || !strcmp(regClass->dataTypeString, "char *") || method->dataType->byReference)
+argClass = regClass;
 }
-else
-{
-switch(memberExp->member.exp->expType->kind)
+else if(type->kind == 19)
 {
-case 3:
+argClass = FindClass("ecere::com::Class")->registered;
+}
+else if((type->kind == 12 || type->kind == 13) && type->type && type->type->kind == 1)
 {
-argClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
-break;
+argClass = FindClass("char *")->registered;
 }
+else if(type->kind == 13)
+{
+argClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
+FreeType(memberExp->member.exp->expType);
+memberExp->member.exp->expType = ProcessTypeString("uintptr", 0x0);
+memberExp->member.exp->byReference = 0x1;
 }
+else
+{
+char string[1024] = "";
+struct Symbol * classSym;
+
+PrintTypeNoConst(type, string, 0x0, 0x1);
+classSym = FindClass(string);
+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)))))));
 }
@@ -2608,7 +2635,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)))))));
 }
@@ -2631,6 +2658,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];
@@ -2655,9 +2683,22 @@ if(!exp->call.arguments)
 exp->call.arguments = MkList();
 if(typedObject && memberExp->member.exp && memberExp->member.exp->expType)
 {
-if((argClass && (argClass->type == 4 || argClass->type == 3 || argClass->type == 2 || argClass->type == 1000) && strcmp(argClass->fullName, "class") && strcmp(argClass->fullName, "ecere::com::Class")) || (!memberExp->member.exp->expType->classObjectType && ((((memberExp->member.exp->expType->kind != 13 && (memberExp->member.exp->expType->kind != 8 || !memberExp->member.exp->expType->_class || !memberExp->member.exp->expType->_class->registered || memberExp->member.exp->expType->_class->registered->type == 1)))) || method->dataType->byReference)))
+unsigned int changeReference = 0x0;
+
+if(argClass && (argClass->type == 4 || argClass->type == 3 || argClass->type == 2 || argClass->type == 1000) && strcmp(argClass->fullName, "class") && strcmp(argClass->fullName, "uintptr") && strcmp(argClass->fullName, "intptr"))
+changeReference = 0x1;
+if(!memberExp->member.exp->expType->classObjectType && ((((memberExp->member.exp->expType->kind != 13 && (memberExp->member.exp->expType->kind != 8 || !memberExp->member.exp->expType->_class || !memberExp->member.exp->expType->_class->registered || memberExp->member.exp->expType->_class->registered->type == 1)))) || method->dataType->byReference))
+changeReference = 0x1;
+if(typedObject && memberExp->member.exp->expType->classObjectType && memberExp->member.exp->expType->byReference != method->dataType->byReference)
+changeReference = 0x1;
+if(changeReference)
+{
+if(memberExp->member.exp->type == 5 && memberExp->member.exp->list && (*memberExp->member.exp->list).count == 1 && ((struct Expression *)(*memberExp->member.exp->list).first)->type == 4 && ((struct Expression *)(*memberExp->member.exp->list).first)->op.op == '*' && !((struct Expression *)(*memberExp->member.exp->list).first)->op.exp1)
 {
-if(memberExp->member.exp->type == 4 && memberExp->member.exp->op.op == '*' && !memberExp->member.exp->op.exp1)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.arguments), (((void *)0)), ((struct Expression *)(*memberExp->member.exp->list).first)->op.exp2);
+((struct Expression *)(*memberExp->member.exp->list).first)->op.exp2 = (((void *)0));
+}
+else if(memberExp->member.exp->type == 4 && memberExp->member.exp->op.op == '*' && !memberExp->member.exp->op.exp1)
 {
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.arguments), (((void *)0)), memberExp->member.exp->op.exp2);
 memberExp->member.exp->op.exp2 = (((void *)0));
@@ -2676,7 +2717,7 @@ checkedExp = (*checkedExp->list).last;
 else if(checkedExp->type == 11)
 checkedExp = checkedExp->cast.exp;
 }
-newExp = MkExpOp((((void *)0)), '&', checkedExp);
+newExp = (typedObject && !memberExp->member.exp->expType->classObjectType) ? checkedExp : MkExpOp((((void *)0)), '&', checkedExp);
 if(parentExp && (parentExp->type == 5 || parentExp->type == 34))
 {
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*parentExp->list), checkedExp);
@@ -2687,6 +2728,15 @@ else if(parentExp && parentExp->type == 11)
 parentExp->cast.exp = newExp;
 parentExp->cast.typeName->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), parentExp->cast.typeName->declarator);
 }
+if(typedObject && !memberExp->member.exp->expType->classObjectType)
+{
+struct Type * destType = (destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), destType->refCount = 1, destType->kind = 8, destType->classObjectType = 3, destType);
+
+(parentExp ? parentExp : newExp)->expType = checkedExp->expType;
+(parentExp ? parentExp : newExp)->destType = destType;
+if(checkedExp->expType)
+checkedExp->expType->refCount++;
+}
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.arguments), (((void *)0)), parentExp ? parentExp : newExp);
 }
 else
@@ -2751,17 +2801,24 @@ else if((type->kind == 12 || type->kind == 13) && type->type && type->type->kind
 {
 _class = FindClass("char *")->registered;
 }
+else if(type->kind == 13)
+{
+_class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
+FreeType(e->expType);
+e->expType = ProcessTypeString("uintptr", 0x0);
+e->byReference = 0x1;
+}
 else
 {
 char string[1024] = "";
 struct Symbol * classSym;
 
-PrintType(type, string, 0x0, 0x1);
+PrintTypeNoConst(type, string, 0x0, 0x1);
 classSym = FindClass(string);
 if(classSym)
 _class = classSym->registered;
 }
-if((_class && (_class->type == 4 || _class->type == 3 || _class->type == 2 || _class->type == 1000) && strcmp(_class->fullName, "class") && strcmp(_class->fullName, "ecere::com::Class")) || (!e->expType->classObjectType && (((type->kind != 13 && type->kind != 19 && type->kind != 12 && (type->kind != 8 || !type->_class || !type->_class->registered || type->_class->registered->type == 1))) || destType->byReference)))
+if((_class && (_class->type == 4 || _class->type == 3 || _class->type == 2 || _class->type == 1000) && strcmp(_class->fullName, "class") && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr")) || (!e->expType->classObjectType && (((type->kind != 13 && type->kind != 22 && type->kind != 19 && type->kind != 12 && (type->kind != 8 || !type->_class || !type->_class->registered || type->_class->registered->type == 1))) || destType->byReference)))
 {
 {
 struct Expression * checkedExp;
@@ -2852,7 +2909,7 @@ exp->destType->refCount++;
 newExp->prev = (((void *)0));
 newExp->next = (((void *)0));
 newExp->expType = (((void *)0));
-PrintType(e->expType, typeString, 0x0, 0x1);
+PrintTypeNoConst(e->expType, typeString, 0x0, 0x1);
 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
 newExp->destType = ProcessType(specs, decl);
 curContext = context;
@@ -2943,7 +3000,7 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*exp->call.argument
 }
 }
 {
-FixReference(e, 0x1);
+FixReference(e, !destType || !destType->declaredWithStruct);
 }
 }
 if(ellipsisDestType)
@@ -2989,7 +3046,7 @@ if(!_class)
 char string[2048] = "";
 struct Symbol * classSym;
 
-PrintType(type, string, 0x0, 0x1);
+PrintTypeNoConst(type, string, 0x0, 0x1);
 classSym = FindClass(string);
 _class = classSym ? classSym->registered : (((void *)0));
 }
@@ -3397,7 +3454,10 @@ break;
 }
 case 25:
 {
-((struct Expression *)(*((struct Statement *)(*exp->compound->compound.statements).last)->expressions).last)->usage |= exp->usage & (((unsigned int)(0x1)) | (((unsigned int)(0x1)) << 2) | (((unsigned int)(0x1)) << 4));
+struct Expression * e = (*((struct Statement *)(*exp->compound->compound.statements).last)->expressions).last;
+
+if(e)
+e->usage |= exp->usage & (((unsigned int)(0x1)) | (((unsigned int)(0x1)) << 2) | (((unsigned int)(0x1)) << 4));
 ProcessStatement(exp->compound);
 break;
 }
@@ -3753,31 +3813,10 @@ break;
 }
 }
 
-extern struct Declaration * QMkDeclarationBase(int base, struct InitDeclarator * initDecl);
-
 static void ProcessFunction(struct FunctionDefinition * function)
 {
 if(function->body)
-{
 ProcessStatement(function->body);
-if(function->tempCount)
-{
-struct Statement * stmt = function->body;
-int c;
-
-if(!stmt->compound.declarations)
-stmt->compound.declarations = MkList();
-curContext = stmt->compound.context;
-for(c = 1; c <= function->tempCount; c++)
-{
-char ecereTemp[100];
-
-sprintf(ecereTemp, "__ecereTemp%d", c);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*stmt->compound.declarations), (((void *)0)), QMkDeclarationBase(VOID, MkInitDeclarator(QMkPtrDecl(ecereTemp), (((void *)0)))));
-}
-curContext = stmt->compound.context->parent;
-}
-}
 }
 
 static void ProcessMemberInitData(struct MemberInit * member)