From: Jerome St-Louis Date: Fri, 24 Apr 2015 06:48:04 +0000 (-0400) Subject: compiler/libec: Map & AVLTree fixes with float/double values X-Git-Url: http://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=commitdiff_plain;h=cfc67bac3aa002fda906d2505a37a17e2b19311f compiler/libec: Map & AVLTree fixes with float/double values --- diff --git a/compiler/bootstrap/ecere/bootstrap/i18n.c b/compiler/bootstrap/ecere/bootstrap/i18n.c index b83974d..5437ce4 100644 --- a/compiler/bootstrap/ecere/bootstrap/i18n.c +++ b/compiler/bootstrap/ecere/bootstrap/i18n.c @@ -657,7 +657,7 @@ __ecereNameSpace__ecere__moduleMaps, 0 }; __ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&__internalIterator, ((uint64)(uintptr_t)(name)), 1); -__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, ((uint64)((uintptr_t)(textMap = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__Map_TPL_String__const_String_))))); +__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, (uint64)(uintptr_t)(textMap = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__Map_TPL_String__const_String_))); }); for(c = 0; c < numStrings; c++) { @@ -788,7 +788,7 @@ textMap, 0 }; __ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&__internalIterator, ((uint64)(uintptr_t)(original)), 1); -__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, ((uint64)((uintptr_t)(translated)))); +__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, (uint64)(uintptr_t)(translated)); }); } else diff --git a/compiler/bootstrap/ecs/bootstrap/ecs.c b/compiler/bootstrap/ecs/bootstrap/ecs.c index 787e534..550a9f9 100644 --- a/compiler/bootstrap/ecs/bootstrap/ecs.c +++ b/compiler/bootstrap/ecs/bootstrap/ecs.c @@ -3118,7 +3118,7 @@ intlStrings, 0 }; __ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&__internalIterator, ((uint64)(uintptr_t)(&pair)), 1); -__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, ((uint64)((uintptr_t)(comments)))); +__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, (uint64)(uintptr_t)(comments)); }); comments = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__List_TPL_String_); } diff --git a/compiler/bootstrap/libec/bootstrap/ast.c b/compiler/bootstrap/libec/bootstrap/ast.c index 5ce57bd..3ec4dbd 100644 --- a/compiler/bootstrap/libec/bootstrap/ast.c +++ b/compiler/bootstrap/libec/bootstrap/ast.c @@ -2798,7 +2798,7 @@ intlStrings, 0 }; __ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&__internalIterator, ((uint64)(uintptr_t)(&pair)), 1); -__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, ((uint64)((uintptr_t)(list)))); +__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, (uint64)(uintptr_t)(list)); }); } else diff --git a/compiler/bootstrap/libec/bootstrap/loadSymbols.c b/compiler/bootstrap/libec/bootstrap/loadSymbols.c index 77606c2..418d91e 100644 --- a/compiler/bootstrap/libec/bootstrap/loadSymbols.c +++ b/compiler/bootstrap/libec/bootstrap/loadSymbols.c @@ -1982,7 +1982,7 @@ loadedModules, 0 }; __ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&__internalIterator, ((uint64)(uintptr_t)(name)), 1); -__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, ((uint64)((uintptr_t)(list)))); +__ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data(&__internalIterator, (uint64)(uintptr_t)(list)); }); } else diff --git a/compiler/bootstrap/libec/bootstrap/pass15.c b/compiler/bootstrap/libec/bootstrap/pass15.c index 8bd85f8..7f495cb 100644 --- a/compiler/bootstrap/libec/bootstrap/pass15.c +++ b/compiler/bootstrap/libec/bootstrap/pass15.c @@ -8318,6 +8318,19 @@ source->refCount++; return type; } +void modifyPassAsTemplate(struct Type ** typePtr, unsigned int value) +{ +if(*typePtr && (*typePtr)->passAsTemplate != value) +{ +struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type); + +CopyTypeInto(type, *typePtr); +type->passAsTemplate = value; +FreeType(*typePtr); +*typePtr = type; +} +} + void ReplaceExpContents(struct Expression * checkedExp, struct Expression * newExp) { struct Expression * prev = checkedExp->prev, * next = checkedExp->next; @@ -9909,3922 +9922,3930 @@ return 1; return 0; } -void ProcessExpressionType(struct Expression * exp); +int ComputeTypeSize(struct Type * type); -static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class) +void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember) { -if(exp->type == 0 && exp->__anon1.__anon1.identifier) +struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0)); +struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class); + +if(member || ((_class->type == 2 || _class->type == 0 || _class->type == 1 || _class->type == 5) && (_class->type == 2 || (!_class->structSize || _class->structSize == _class->offset)) && _class->computeSize)) { -struct Identifier * id = exp->__anon1.__anon1.identifier; -struct Context * ctx; -struct Symbol * symbol = (((void *)0)); +int unionMemberOffset = 0; +int bitFields = 0; -if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property")) +if(member) { -for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent) +member->memberOffset = 0; +if(targetBits < sizeof(void *) * 8) +member->structAlignment = 0; +} +else if(targetBits < sizeof(void *) * 8) +_class->structAlignment = 0; +if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize))) +_class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0; +if(!member && _class->destructionWatchOffset) +_class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList); { -if(!ctx) -break; -symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string); -if(symbol) -break; +struct __ecereNameSpace__ecere__com__DataMember * dataMember; + +for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) +{ +if(!dataMember->isProperty) +{ +if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType) +{ +dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +} +} } } -if(!symbol && ((!id->_class || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))) || (id->classSym && __ecereNameSpace__ecere__com__eClass_IsDerived(_class, id->classSym->__anon1.registered)))) { -struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule); -struct __ecereNameSpace__ecere__com__Method * method = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0)); -struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * dataMember; -if(!prop) +for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) { -method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule); -} -if(!prop && !method) -member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0))); -if(!prop && !method && !member) +if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString)) { -classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string); -} -if(prop || method || member || classProp) +if(!isMember && _class->type == 2 && dataMember->dataType) { -exp->type = 8; -exp->__anon1.member.member = id; -exp->__anon1.member.memberType = 0; -exp->__anon1.member.exp = QMkExpId("this"); -exp->addedThis = 1; +struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember; +uint64 mask = 0; +int d; + +ComputeTypeSize(dataMember->dataType); +if(bitMember->pos == -1) +bitMember->pos = _class->memberOffset; +if(!bitMember->size) +bitMember->size = dataMember->dataType->size * 8; +_class->memberOffset = bitMember->pos + bitMember->size; +for(d = 0; d < bitMember->size; d++) +{ +if(d) +mask <<= 1; +mask |= 1; } -else if(_class && _class->templateParams.first) +bitMember->mask = mask << bitMember->pos; +} +else if(dataMember->type == 0 && dataMember->dataType) { -struct __ecereNameSpace__ecere__com__Class * sClass; +int size; +int alignment = 0; -for(sClass = _class; sClass; sClass = sClass->base) +if(dataMember->dataType->kind != 8 || ((!dataMember->dataType->__anon1._class || !dataMember->dataType->__anon1._class->__anon1.registered || dataMember->dataType->__anon1._class->__anon1.registered != _class || _class->type != 1))) +ComputeTypeSize(dataMember->dataType); +if(dataMember->dataType->bitFieldCount) { -if(sClass->templateParams.first) +bitFields += dataMember->dataType->bitFieldCount; +size = 0; +} +else { -struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param; - -for(param = sClass->templateParams.first; param; param = param->next) +if(bitFields) { -if(param->type == 2 && !strcmp(param->name, id->string)) +int size = (bitFields + 7) / 8; + +if(isMember) { -struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2); +int __simpleStruct0; -if(argExp) +if(alignment) { -struct Declarator * decl; -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +short __simpleStruct0; -FreeIdentifier(exp->__anon1.member.member); -ProcessExpressionType(argExp); -decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0))); -exp->expType = ProcessType(specs, decl); -exp->type = 5; -exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp)))); -} -} +member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(member->memberOffset % alignment) +member->memberOffset += alignment - (member->memberOffset % alignment); } +dataMember->offset = member->memberOffset; +if(member->type == 1) +unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); +else +{ +member->memberOffset += size; } } +else +{ +if(alignment) +{ +short __simpleStruct0; + +_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(_class->memberOffset % alignment) +_class->memberOffset += alignment - (_class->memberOffset % alignment); } +dataMember->offset = _class->memberOffset; +_class->memberOffset += size; } +bitFields = 0; } +size = dataMember->dataType->size; +alignment = dataMember->dataType->alignment; } +if(isMember) +{ +int __simpleStruct0; -static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset) +if(alignment) { -struct __ecereNameSpace__ecere__com__DataMember * dataMember; +short __simpleStruct0; -for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next) +member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(member->memberOffset % alignment) +member->memberOffset += alignment - (member->memberOffset % alignment); +} +dataMember->offset = member->memberOffset; +if(member->type == 1) +unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); +else { -if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1)) -PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset); +member->memberOffset += size; +} +} else { -struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp)); -struct Type * type; -void * ptr = inst->data + dataMember->offset + offset; -char * result = (((void *)0)); - -exp->loc = member->loc = inst->loc; -((struct Identifier *)(*member->identifiers).first)->loc = inst->loc; -if(!dataMember->dataType) -dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); -type = dataMember->dataType; -if(type->kind == 8) +if(alignment) { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +short __simpleStruct0; -if(_class->type == 4) +_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(_class->memberOffset % alignment) +_class->memberOffset += alignment - (_class->memberOffset % alignment); +} +dataMember->offset = _class->memberOffset; +_class->memberOffset += size; +} +} +else { -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); +int alignment; -if(enumClass) +ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1); +alignment = dataMember->structAlignment; +if(isMember) { -struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); -struct __ecereNameSpace__ecere__sys__NamedLink64 * item; +int __simpleStruct0; -for(item = e->values.first; item; item = item->next) -{ -if(item->data == GetEnumValue(_class, ptr)) +if(alignment) { -result = item->name; -break; +short __simpleStruct0; + +if(member->memberOffset % alignment) +member->memberOffset += alignment - (member->memberOffset % alignment); +member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); } +dataMember->offset = member->memberOffset; +if(member->type == 1) +unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); +else +member->memberOffset += dataMember->memberOffset; } -if(result) +else { -exp->__anon1.__anon1.identifier = MkIdentifier(result); -exp->type = 0; -exp->destType = MkClassType(_class->fullName); -ProcessExpressionType(exp); +if(alignment) +{ +short __simpleStruct0; + +if(_class->memberOffset % alignment) +_class->memberOffset += alignment - (_class->memberOffset % alignment); +_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); } +dataMember->offset = _class->memberOffset; +_class->memberOffset += dataMember->memberOffset; } } -if(_class->type == 4 || _class->type == 3 || _class->type == 2) -{ -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -type = _class->dataType; } } -if(!result) +if(bitFields) { -switch(type->kind) +int alignment = 0; +int size = (bitFields + 7) / 8; + +if(isMember) { -case 6: +int __simpleStruct0; + +if(alignment) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr); -exp->type = 2; -break; -} -case 7: -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr); -exp->type = 2; -break; +short __simpleStruct0; + +member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(member->memberOffset % alignment) +member->memberOffset += alignment - (member->memberOffset % alignment); } -case 3: +if(member->type == 1) +unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); +else { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr); -exp->type = 2; -break; +member->memberOffset += size; } -case 4: -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr); -exp->type = 2; -break; } -case 22: +else { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr); -exp->type = 2; -break; -} -case 23: +if(alignment) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr); -exp->type = 2; -break; -} -default: -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0)))); -} +short __simpleStruct0; + +_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(_class->memberOffset % alignment) +_class->memberOffset += alignment - (_class->memberOffset % alignment); } -ListAdd(memberList, member); +_class->memberOffset += size; } -if(parentDataMember->type == 1) -break; +bitFields = 0; } } - -void CheckTemplateTypes(struct Expression * exp) +if(member && member->type == 1) { -struct Expression * nbExp = GetNonBracketsExp(exp); - -if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11)) +member->memberOffset = unionMemberOffset; +} +if(!isMember) { -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -struct Context * context; -int kind = exp->expType->kind; - -*newExp = *exp; -if(exp->destType) -exp->destType->refCount++; -if(exp->expType) -exp->expType->refCount++; -newExp->prev = (((void *)0)); -newExp->next = (((void *)0)); -if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered) +if(_class->type != 2) { -struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered; +int extra = 0; -if(c->type == 2 || c->type == 4 || c->type == 3) +if(_class->structAlignment) { -if(!c->dataType) -c->dataType = ProcessTypeString(c->dataTypeString, 0); -kind = c->dataType->kind; -} +if(_class->memberOffset % _class->structAlignment) +extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment); } -switch(kind) -{ -case 7: -if(exp->destType->classObjectType) +_class->structSize = (_class->base ? (_class->base->templateClass ? (_class->base->type == 5 ? _class->base->templateClass->memberOffset : _class->base->templateClass->structSize) : (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize)) : 0) + _class->memberOffset + extra; +if(!member) { -if(exp->destType) -exp->destType->refCount--; -if(exp->expType) -exp->expType->refCount--; -((newExp ? __extension__ ({ -void * __ecerePtrToDelete = (newExp); +struct __ecereNameSpace__ecere__com__Property * prop; -__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), newExp = 0); -} -else +for(prop = _class->membersAndProperties.first; prop; prop = prop->next) { -struct __ecereNameSpace__ecere__sys__OldList * specs; -struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); -struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); - -context = PushContext(); -ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0))))); -ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); -specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); -exp->type = 23; -exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); -ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp)))); -ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i"))))); -exp->__anon1.compound->__anon1.compound.context = context; -PopContext(context); +if(prop->isProperty && prop->isWatchable) +{ +prop->watcherOffset = _class->structSize; +_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList); } -break; -default: -exp->type = 11; -exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))); -if((exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1) || __ecereProp_Type_Get_isPointerType(exp->expType)) -exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp))); -else -exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); -exp->needCast = 1; -break; } } -else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate) { -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -struct Context * context; -int kind = exp->expType->kind; +struct __ecereNameSpace__ecere__sys__OldLink * derivative; -*newExp = *exp; -if(exp->destType) -exp->destType->refCount++; -if(exp->expType) -exp->expType->refCount++; -newExp->prev = (((void *)0)); -newExp->next = (((void *)0)); -if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered) +for(derivative = _class->derivatives.first; derivative; derivative = derivative->next) { -struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data; -if(c->type == 2 || c->type == 4 || c->type == 3) +if(deriv->computeSize) { -if(!c->dataType) -c->dataType = ProcessTypeString(c->dataTypeString, 0); -kind = c->dataType->kind; +deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize); +deriv->memberOffset = 0; +deriv->structSize = deriv->offset; +ComputeClassMembers(deriv, 0); } } -switch(kind) -{ -case 7: -if(exp->destType->classObjectType) -{ -if(exp->destType) -exp->destType->refCount--; -if(exp->expType) -exp->expType->refCount--; -((newExp ? __extension__ ({ -void * __ecerePtrToDelete = (newExp); - -__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), newExp = 0); } -else +} +} +} +if(context) +FinishTemplatesContext(context); +} + +int AddMembers(struct External * neededBy, struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember, unsigned int * retSize, struct __ecereNameSpace__ecere__com__Class * topClass, unsigned int * addedPadding) { -struct __ecereNameSpace__ecere__sys__OldList * specs; -struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); -struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); +struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0)); +unsigned int totalSize = 0; +unsigned int maxSize = 0; +int alignment; +unsigned int size; +struct __ecereNameSpace__ecere__com__DataMember * member; +int anonID = 1; +struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class); -context = PushContext(); -ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0))))); -ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); -specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); -exp->type = 23; -exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); -ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp)))); -ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d"))))); -exp->__anon1.compound->__anon1.compound.context = context; -PopContext(context); -} -break; -case 8: +if(addedPadding) +*addedPadding = 0; +if(!isMember && _class->base) { -if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1) +maxSize = _class->structSize; { -exp->type = 5; -newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp); -exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp))); -ProcessExpressionType((*exp->__anon1.list).first); -break; -} +if(_class->type == 1 || _class->type == 5) +AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0))); else { -exp->type = 5; -if(__ecereProp_Type_Get_isPointerType(exp->expType)) -{ -exp->needTemplateCast = 2; -newExp->needCast = 1; -newExp->needTemplateCast = 2; -newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp); +unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize; + +if(maxSize > baseSize) +maxSize -= baseSize; +else +maxSize = 0; } -exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp)); -exp->needTemplateCast = 2; -newExp->needCast = 1; -newExp->needTemplateCast = 2; -ProcessExpressionType((*exp->__anon1.list).first); -break; } } -default: +for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next) { -if(exp->expType->kind == 20) +if(!member->isProperty) { -struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter); - -if(type) +switch(member->type) { -FreeType(exp->destType); -FreeType(exp->expType); -((newExp ? __extension__ ({ -void * __ecerePtrToDelete = (newExp); - -__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), newExp = 0); -break; -} -} +case 0: { -char typeString[1024]; -struct Declarator * decl; -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +if(member->dataTypeString) +{ +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList(); +struct Declarator * decl; -typeString[0] = '\0'; -PrintType(exp->expType, typeString, 0, 0); -decl = SpecDeclFromString(typeString, specs, (((void *)0))); -exp->type = 11; -exp->__anon1.cast.typeName = MkTypeName(specs, decl); -exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); -exp->__anon1.cast.exp->needCast = 1; -exp->needTemplateCast = 2; -newExp->needTemplateCast = 2; -} -break; +decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name))); +ListAdd(decls, MkStructDeclarator(decl, (((void *)0)))); +ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0))))); +if(!member->dataType) +member->dataType = ProcessType(specs, decl); +ReplaceThisClassSpecifiers(specs, topClass); +{ +struct Type * type = ProcessType(specs, decl); + +DeclareType(neededBy, member->dataType, 1, 0); +FreeType(type); } +ComputeTypeSize(member->dataType); +size = member->dataType->size; +alignment = member->dataType->alignment; +if(alignment) +{ +if(totalSize % alignment) +totalSize += alignment - (totalSize % alignment); } +totalSize += size; } +break; } +case 1: +case 2: +{ +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList(); +char id[100]; -static void ProcessInitializer(struct Initializer * init, struct Type * type) +sprintf(id, "__anon%d", anonID++); +size = 0; +AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0))); +ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list)); +ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0))))); +alignment = member->structAlignment; +if(alignment) { -switch(init->type) +if(totalSize % alignment) +totalSize += alignment - (totalSize % alignment); +} +totalSize += size; +break; +} +} +} +} +if(retSize) { -case 0: -if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8) +unsigned int __simpleStruct0; + +if(topMember && topMember->type == 1) +*retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize); +else +*retSize += totalSize; +} +else if(totalSize < maxSize && _class->type != 1000) { -if(init->__anon1.exp && !init->__anon1.exp->destType) +int autoPadding = 0; + +if(!isMember && _class->structAlignment && totalSize % _class->structAlignment) +autoPadding = _class->structAlignment - (totalSize % _class->structAlignment); +if(totalSize + autoPadding < maxSize) { -FreeType(init->__anon1.exp->destType); -init->__anon1.exp->destType = type; -if(type) -type->refCount++; +char sizeString[50]; + +sprintf(sizeString, "%d", maxSize - totalSize); +ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0))))); +if(addedPadding) +*addedPadding = 1; } -if(init->__anon1.exp) -{ -ProcessExpressionType(init->__anon1.exp); -init->isConstant = init->__anon1.exp->isConstant; } -break; +if(context) +FinishTemplatesContext(context); +return topMember ? topMember->memberID : _class->memberID; } -else -{ -struct Expression * exp = init->__anon1.exp; -struct Instantiation * inst = exp->__anon1.instance; -struct MembersInit * members; -init->type = 1; -init->__anon1.list = MkList(); -if(inst->members) +unsigned int MatchTypes(struct Type * source, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, struct __ecereNameSpace__ecere__com__Class * owningClassSource, struct __ecereNameSpace__ecere__com__Class * owningClassDest, unsigned int doConversion, unsigned int enumBaseType, unsigned int acceptReversedParams, unsigned int isConversionExploration, unsigned int warnConst) { -for(members = (*inst->members).first; members; members = members->next) +if(source && dest) { -if(members->type == 0) +if(warnConst) +CheckConstCompatibility(source, dest, 1); +if(source->kind == 20 && dest->kind != 20) { -struct MemberInit * member; +struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter); -for(member = (*members->__anon1.dataMembers).first; member; member = member->next) +if(type) +source = type; +} +if(dest->kind == 20 && source->kind != 20) { -ListAdd(init->__anon1.list, member->initializer); -member->initializer = (((void *)0)); +struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter); + +if(type) +dest = type; } +if(dest->classObjectType == 2 && dest->kind != 11) +{ +if(source->classObjectType != 3) +return 1; +else +{ +if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class"))) +{ +return 1; } } } -FreeExpression(exp); +else +{ +if(source->kind != 11 && source->classObjectType == 3) +return 1; +if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2) +return 1; } -case 1: +if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10)) { -struct Initializer * i; -struct Type * initializerType = (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256]; -int subMemberStackPos = 0; - -if(type && type->kind == 12) -initializerType = Dereference(type); -else if(type && (type->kind == 9 || type->kind == 10)) -initializerType = type->__anon1.__anon1.members.first; -for(i = (*init->__anon1.list).first; i; i = i->next) +if((dest->__anon1.__anon1.enumName && source->__anon1.__anon1.enumName && !strcmp(dest->__anon1.__anon1.enumName, source->__anon1.__anon1.enumName)) || (source->__anon1.__anon1.members.first && source->__anon1.__anon1.members.first == dest->__anon1.__anon1.members.first)) +return 1; +} +if(dest->kind == 14 && source->kind != 0) +return 1; +if(dest->kind == 13 && dest->__anon1.type->kind == 0 && ((source->kind == 8 && (!source->__anon1._class || !source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type == 1 || source->__anon1._class->__anon1.registered->type == 0 || source->__anon1._class->__anon1.registered->type == 5 || source->__anon1._class->__anon1.registered->type == 1000)) || source->kind == 19 || source->kind == 13 || source->kind == 12 || source->kind == 11 || source->kind == 21)) +return 1; +if(!isConversionExploration && source->kind == 13 && source->__anon1.type->kind == 0 && ((dest->kind == 8 && (!dest->__anon1._class || !dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type == 1 || dest->__anon1._class->__anon1.registered->type == 0 || dest->__anon1._class->__anon1.registered->type == 5 || dest->__anon1._class->__anon1.registered->type == 1000)) || dest->kind == 19 || dest->kind == 13 || dest->kind == 12 || dest->kind == 11 || dest->kind == 21)) +return 1; +if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class) { -if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) +if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3) { -FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos); -if(curMember) +if(conversions != (((void *)0))) { -if(!curMember->dataType) -curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0); -initializerType = curMember->dataType; +if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered) +return 1; } +else +{ +struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase; + +for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base) +; +for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base) +; +if(sourceBase == destBase) +return 1; } -ProcessInitializer(i, initializerType); -if(initializerType && type && (type->kind == 9 || type->kind == 10)) -initializerType = initializerType->next; -if(!i->isConstant) -init->isConstant = 0; } -if(type && type->kind == 12) -FreeType(initializerType); -if(type && type->kind != 12 && type->kind != 9 && type->kind != 10 && (type->kind != 8 || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type != 1)) +else if(source->__anon1._class && dest->__anon1._class && (dest->classObjectType == source->classObjectType || !dest->classObjectType) && (enumBaseType || (!source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type != 4) || (!dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type != 4)) && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, dest->__anon1._class->__anon1.registered)) +return 1; +else { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0)))); +if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && source->__anon1._class && source->__anon1._class->__anon1.registered && (dest->casted || (enumBaseType && dest->__anon1._class->__anon1.registered->type == 4 && (source->kind == 8 || source->__anon1._class->__anon1.registered->type != 4)))) +{ +if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered)) +{ +return 1; } -break; } } } - -void PopulateInstance(struct Instantiation * inst) -{ -struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol; -struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered; -struct __ecereNameSpace__ecere__com__DataMember * dataMember; -struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList(); - -if(!inst->members) -inst->members = MkListOne(MkMembersInitList(memberList)); -else -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList)); -for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) -{ -if(!dataMember->isProperty) +if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class")) +return 1; +if(doConversion) { -if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1)) -PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset); -else +if(source->kind == 8) { -struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp)); -struct Type * type; -void * ptr = inst->data + dataMember->offset; -char * result = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * _class; -exp->loc = member->loc = inst->loc; -((struct Identifier *)(*member->identifiers).first)->loc = inst->loc; -if(!dataMember->dataType) -dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); -type = dataMember->dataType; -if(type->kind == 8) +for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Property * convert; -if(_class->type == 4) +for(convert = _class->conversions.first; convert; convert = convert->next) { -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); - -if(enumClass) +if(convert->memberAccess == 1 || _class->module == privateModule) { -struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); -struct __ecereNameSpace__ecere__sys__NamedLink64 * item; +struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0)); -for(item = e->values.first; item; item = item->next) +if(!convert->dataType) +convert->dataType = ProcessTypeString(convert->dataTypeString, 0); +if((!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), (convert->dataType->kind == 8 && !strcmp(convert->dataTypeString, "String")) ? 1 : 0, convert->dataType->kind == 8, 0, 1, warnConst)) { -if(item->data == GetEnumValue(_class, ptr)) +if(!conversions && !convert->Get) +return 1; +else if(conversions != (((void *)0))) { -result = item->name; -break; +if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base)) +return 1; +else +{ +struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv); + +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv); +return 1; } } } -if(result) -{ -exp->__anon1.__anon1.identifier = MkIdentifier(result); -exp->type = 0; -exp->destType = MkClassType(_class->fullName); -ProcessExpressionType(exp); } } -if(_class->type == 4 || _class->type == 3 || _class->type == 2) -{ -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -type = _class->dataType; } } -if(!result) +if(dest->kind == 8) { -switch(type->kind) +struct __ecereNameSpace__ecere__com__Class * _class; + +for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) { -case 6: +struct __ecereNameSpace__ecere__com__Property * convert; + +for(convert = _class->conversions.first; convert; convert = convert->next) { -exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr); -exp->type = 2; -break; -} -case 7: +if(convert->memberAccess == 1 || _class->module == privateModule) { -exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr); -exp->type = 2; -break; -} -case 3: +struct Type * constType = (((void *)0)); +unsigned int success = 0; + +if(!convert->dataType) +convert->dataType = ProcessTypeString(convert->dataTypeString, 0); +if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant) { -exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr); -exp->type = 2; -break; +struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); + +constType = __extension__ ({ +struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); + +__ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1; +}); +CopyTypeInto(ptrType, convert->dataType->__anon1.type); +ptrType->constant = 1; } -case 4: +if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst)) { -exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr); -exp->type = 2; -break; -} -case 22: +if(!conversions && !convert->Set) +success = 1; +else if(conversions != (((void *)0))) { -exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr); -exp->type = 2; -break; -} -default: -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0)))); -} +if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (source->kind != 8 || source->__anon1._class->__anon1.registered != _class->base)) +success = 1; +else +{ +struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv); + +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv); +success = 1; } -ListAdd(memberList, member); } } +if(constType) +FreeType(constType); +if(success) +return 1; } } - -int ComputeTypeSize(struct Type * type); - -void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember) -{ -struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0)); -struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class); - -if(member || ((_class->type == 2 || _class->type == 0 || _class->type == 1 || _class->type == 5) && (_class->type == 2 || (!_class->structSize || _class->structSize == _class->offset)) && _class->computeSize)) -{ -int unionMemberOffset = 0; -int bitFields = 0; - -if(member) -{ -member->memberOffset = 0; -if(targetBits < sizeof(void *) * 8) -member->structAlignment = 0; } -else if(targetBits < sizeof(void *) * 8) -_class->structAlignment = 0; -if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize))) -_class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0; -if(!member && _class->destructionWatchOffset) -_class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList); -{ -struct __ecereNameSpace__ecere__com__DataMember * dataMember; - -for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) +if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) { -if(!dataMember->isProperty) +if(!dest->__anon1._class->__anon1.registered->dataType) +dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0); +if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth) { -if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType) +if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, dest->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst)) { -dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +return 1; } } } } +if(source->kind == 8) { -struct __ecereNameSpace__ecere__com__DataMember * dataMember; - -for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) -{ -if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString)) -{ -if(!isMember && _class->type == 2 && dataMember->dataType) -{ -struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember; -uint64 mask = 0; -int d; +struct __ecereNameSpace__ecere__com__Class * _class; -ComputeTypeSize(dataMember->dataType); -if(bitMember->pos == -1) -bitMember->pos = _class->memberOffset; -if(!bitMember->size) -bitMember->size = dataMember->dataType->size * 8; -_class->memberOffset = bitMember->pos + bitMember->size; -for(d = 0; d < bitMember->size; d++) -{ -if(d) -mask <<= 1; -mask |= 1; -} -bitMember->mask = mask << bitMember->pos; -} -else if(dataMember->type == 0 && dataMember->dataType) +for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) { -int size; -int alignment = 0; +struct __ecereNameSpace__ecere__com__Property * convert; -if(dataMember->dataType->kind != 8 || ((!dataMember->dataType->__anon1._class || !dataMember->dataType->__anon1._class->__anon1.registered || dataMember->dataType->__anon1._class->__anon1.registered != _class || _class->type != 1))) -ComputeTypeSize(dataMember->dataType); -if(dataMember->dataType->bitFieldCount) -{ -bitFields += dataMember->dataType->bitFieldCount; -size = 0; -} -else -{ -if(bitFields) +for(convert = _class->conversions.first; convert; convert = convert->next) { -int size = (bitFields + 7) / 8; - -if(isMember) +if(convert->memberAccess == 1 || _class->module == privateModule) { -int __simpleStruct0; +struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0)); -if(alignment) +if(!convert->dataType) +convert->dataType = ProcessTypeString(convert->dataTypeString, 0); +if(convert->dataType != source && (!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), convert->dataType->kind == 8, convert->dataType->kind == 8, 0, 1, warnConst)) { -short __simpleStruct0; - -member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(member->memberOffset % alignment) -member->memberOffset += alignment - (member->memberOffset % alignment); -} -dataMember->offset = member->memberOffset; -if(member->type == 1) -unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); -else +if(!conversions && !convert->Get) +return 1; +else if(conversions != (((void *)0))) { -member->memberOffset += size; -} -} +if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base)) +return 1; else { -if(alignment) -{ -short __simpleStruct0; +struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv); -_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(_class->memberOffset % alignment) -_class->memberOffset += alignment - (_class->memberOffset % alignment); -} -dataMember->offset = _class->memberOffset; -_class->memberOffset += size; +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv); +return 1; } -bitFields = 0; } -size = dataMember->dataType->size; -alignment = dataMember->dataType->alignment; } -if(isMember) -{ -int __simpleStruct0; - -if(alignment) -{ -short __simpleStruct0; - -member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(member->memberOffset % alignment) -member->memberOffset += alignment - (member->memberOffset % alignment); } -dataMember->offset = member->memberOffset; -if(member->type == 1) -unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); -else -{ -member->memberOffset += size; } } -else +if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4) { -if(alignment) +if(!source->__anon1._class->__anon1.registered->dataType) +source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0); +if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String")) { -short __simpleStruct0; - -_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(_class->memberOffset % alignment) -_class->memberOffset += alignment - (_class->memberOffset % alignment); +if(MatchTypes(source->__anon1._class->__anon1.registered->dataType, dest, conversions, (((void *)0)), (((void *)0)), source->__anon1._class->__anon1.registered->dataType->kind == 8, source->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst)) +return 1; +else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst)) +return 1; } -dataMember->offset = _class->memberOffset; -_class->memberOffset += size; } } -else -{ -int alignment; - -ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1); -alignment = dataMember->structAlignment; -if(isMember) -{ -int __simpleStruct0; - -if(alignment) +} +if(source->kind == 8 || source->kind == 19) +; +else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16)) +return 1; +else if(dest->kind == 7 && source->kind == 6) +return 1; +else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24)) +return 1; +else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23)) +return 1; +else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23)) +return 1; +else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4)) +return 1; +else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22)) +return 1; +else if(source->kind == 15 && (dest->kind == 3 || dest->kind == 2 || dest->kind == 1 || source->kind == 24 || dest->kind == 5 || dest->kind == 4 || dest->kind == 22 || dest->kind == 23)) +return 1; +else if(dest->kind == 15 && !isConversionExploration && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 5 || source->kind == 4 || source->kind == 22 || source->kind == 23)) +return 1; +else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && ((source->kind == 11 || (source->kind == 13 && source->__anon1.type->kind == 11) || source->kind == 16))) { -short __simpleStruct0; +struct Type * paramSource, * paramDest; -if(member->memberOffset % alignment) -member->memberOffset += alignment - (member->memberOffset % alignment); -member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -} -dataMember->offset = member->memberOffset; -if(member->type == 1) -unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); +if(dest->kind == 16) +owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class; +if(source->kind == 16) +owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class; +if(dest->kind == 13 && dest->__anon1.type->kind == 11) +dest = dest->__anon1.type; +if(source->kind == 13 && source->__anon1.type->kind == 11) +source = source->__anon1.type; +if(dest->kind == 16) +dest = dest->__anon1.__anon3.method->dataType; +if(source->kind == 16) +source = source->__anon1.__anon3.method->dataType; +paramSource = source->__anon1.__anon2.params.first; +if(paramSource && paramSource->kind == 0) +paramSource = (((void *)0)); +paramDest = dest->__anon1.__anon2.params.first; +if(paramDest && paramDest->kind == 0) +paramDest = (((void *)0)); +if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource))) +{ +if(!paramDest || (!(paramDest->kind == 13 && paramDest->__anon1.type && paramDest->__anon1.type->kind == 0) && (paramDest->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, paramDest->__anon1._class->__anon1.registered)))) +{ +if(paramDest && paramDest->kind == 8) +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string); else -member->memberOffset += dataMember->memberOffset; +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0)))); +return 0; } -else +paramDest = paramDest->next; +} +else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest)) { -if(alignment) +if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource))) { -short __simpleStruct0; - -if(_class->memberOffset % alignment) -_class->memberOffset += alignment - (_class->memberOffset % alignment); -_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(dest->__anon1.__anon2.thisClass) +{ +if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered)) +{ +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string); +return 0; } -dataMember->offset = _class->memberOffset; -_class->memberOffset += dataMember->memberOffset; } +else +{ +if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest))) +{ +if(owningClassDest) +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName); +else +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0)))); +return 0; } } +paramSource = paramSource->next; } -if(bitFields) -{ -int alignment = 0; -int size = (bitFields + 7) / 8; - -if(isMember) +else { -int __simpleStruct0; - -if(alignment) +if(dest->__anon1.__anon2.thisClass) { -short __simpleStruct0; - -member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(member->memberOffset % alignment) -member->memberOffset += alignment - (member->memberOffset % alignment); -} -if(member->type == 1) -unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0); -else +if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered)) { -member->memberOffset += size; +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string); +return 0; } } else { -if(alignment) +if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest)) { -short __simpleStruct0; - -_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); -if(_class->memberOffset % alignment) -_class->memberOffset += alignment - (_class->memberOffset % alignment); +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName); +return 0; } -_class->memberOffset += size; } -bitFields = 0; } } -if(member && member->type == 1) +if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) { -member->memberOffset = unionMemberOffset; +Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0)))); +return 0; } -if(!isMember) -{ -if(_class->type != 2) +else +CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1); +for(; paramDest; paramDest = paramDest->next) { -int extra = 0; - -if(_class->structAlignment) +if(!paramSource) { -if(_class->memberOffset % _class->structAlignment) -extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment); +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0)))); +return 0; } -_class->structSize = (_class->base ? (_class->base->templateClass ? (_class->base->type == 5 ? _class->base->templateClass->memberOffset : _class->base->templateClass->structSize) : (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize)) : 0) + _class->memberOffset + extra; -if(!member) { -struct __ecereNameSpace__ecere__com__Property * prop; +struct Type * paramDestType = paramDest; +struct Type * paramSourceType = paramSource; +struct Type * type = paramDestType; -for(prop = _class->membersAndProperties.first; prop; prop = prop->next) +if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20) { -if(prop->isProperty && prop->isWatchable) +int id = 0; +struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * sClass; + +for(sClass = owningClassSource; sClass; sClass = sClass->base) { -prop->watcherOffset = _class->structSize; -_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList); +id = 0; +if(sClass->templateClass) +sClass = sClass->templateClass; +for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next) +{ +if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name)) +{ +for(sClass = sClass->base; sClass; sClass = sClass->base) +{ +if(sClass->templateClass) +sClass = sClass->templateClass; +id += sClass->templateParams.count; +} +break; } +id++; } +if(curParam) +break; } +if(curParam) { -struct __ecereNameSpace__ecere__sys__OldLink * derivative; +struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id]; -for(derivative = _class->derivatives.first; derivative; derivative = derivative->next) +paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0); +} +} +if(!MatchTypes(paramDestType, paramSourceType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst) && (!acceptReversedParams || !MatchTypes(paramSourceType, paramDestType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))) { -struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data; +char type[1024]; -if(deriv->computeSize) +type[0] = 0; +PrintType(paramDest, type, 0, 1); +Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type); +if(paramDestType != paramDest) +FreeType(paramDestType); +return 0; +} +if(paramDestType != paramDest) +FreeType(paramDestType); +} +paramSource = paramSource->next; +} +if(paramSource) { -deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize); -deriv->memberOffset = 0; -deriv->structSize = deriv->offset; -ComputeClassMembers(deriv, 0); +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0)))); +return 0; } +return 1; } +else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0)) +{ +return 1; } +else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13)) +{ +if(!(dest->__anon1.type && dest->__anon1.type->kind == 13 && source->__anon1.type->kind == 8 && source->__anon1.type->__anon1._class && source->__anon1.type->__anon1._class->__anon1.registered && (source->__anon1.type->__anon1._class->__anon1.registered->type != 0 && source->__anon1.type->__anon1._class->__anon1.registered->type != 5) && !source->__anon1.type->byReference)) +{ +ComputeTypeSize(source->__anon1.type); +ComputeTypeSize(dest->__anon1.type); +if(source->__anon1.type->size == dest->__anon1.type->size && MatchTypes(source->__anon1.type, dest->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) +return 1; } } } -if(context) -FinishTemplatesContext(context); +return 0; } -int AddMembers(struct External * neededBy, struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember, unsigned int * retSize, struct __ecereNameSpace__ecere__com__Class * topClass, unsigned int * addedPadding) -{ -struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0)); -unsigned int totalSize = 0; -unsigned int maxSize = 0; -int alignment; -unsigned int size; -struct __ecereNameSpace__ecere__com__DataMember * member; -int anonID = 1; -struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class); - -if(addedPadding) -*addedPadding = 0; -if(!isMember && _class->base) +void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2) { -maxSize = _class->structSize; +if(exp->__anon1.op.op == SIZEOF) { -if(_class->type == 1 || _class->type == 5) -AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0))); +FreeExpContents(exp); +exp->type = 2; +exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type)); +} else { -unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize; - -if(maxSize > baseSize) -maxSize -= baseSize; -else -maxSize = 0; -} -} -} -for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next) +if(!exp->__anon1.op.exp1) { -if(!member->isProperty) +switch(exp->__anon1.op.op) { -switch(member->type) -{ -case 0: -{ -if(member->dataTypeString) +case '+': { -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList(); -struct Declarator * decl; +struct Expression * exp2 = exp->__anon1.op.exp2; -decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name))); -ListAdd(decls, MkStructDeclarator(decl, (((void *)0)))); -ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0))))); -if(!member->dataType) -member->dataType = ProcessType(specs, decl); -ReplaceThisClassSpecifiers(specs, topClass); -{ -struct Type * type = ProcessType(specs, decl); +exp->__anon1.op.exp2 = (((void *)0)); +FreeExpContents(exp); +FreeType(exp->expType); +FreeType(exp->destType); +*exp = *exp2; +((exp2 ? __extension__ ({ +void * __ecerePtrToDelete = (exp2); -DeclareType(neededBy, member->dataType, 1, 0); -FreeType(type); +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), exp2 = 0); +break; } -ComputeTypeSize(member->dataType); -size = member->dataType->size; -alignment = member->dataType->alignment; -if(alignment) +case '-': +if(op1->ops.Neg) { -if(totalSize % alignment) -totalSize += alignment - (totalSize % alignment); -} -totalSize += size; +FreeExpContents(exp); +op1->ops.Neg(exp, op1); } break; -} -case 1: -case 2: -{ -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList(); -char id[100]; - -sprintf(id, "__anon%d", anonID++); -size = 0; -AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0))); -ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list)); -ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0))))); -alignment = member->structAlignment; -if(alignment) +case '~': +if(op1->ops.BitNot) { -if(totalSize % alignment) -totalSize += alignment - (totalSize % alignment); +FreeExpContents(exp); +op1->ops.BitNot(exp, op1); } -totalSize += size; break; +case '!': +if(op1->ops.Not) +{ +FreeExpContents(exp); +op1->ops.Not(exp, op1); } +break; } } -} -if(retSize) -{ -unsigned int __simpleStruct0; - -if(topMember && topMember->type == 1) -*retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize); else -*retSize += totalSize; -} -else if(totalSize < maxSize && _class->type != 1000) { -int autoPadding = 0; - -if(!isMember && _class->structAlignment && totalSize % _class->structAlignment) -autoPadding = _class->structAlignment - (totalSize % _class->structAlignment); -if(totalSize + autoPadding < maxSize) +if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind) { -char sizeString[50]; - -sprintf(sizeString, "%d", maxSize - totalSize); -ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0))))); -if(addedPadding) -*addedPadding = 1; -} -} -if(context) -FinishTemplatesContext(context); -return topMember ? topMember->memberID : _class->memberID; +if(Promote(op2, op1->kind, op1->type->isSigned)) +op2->kind = op1->kind, op2->ops = op1->ops; +else if(Promote(op1, op2->kind, op2->type->isSigned)) +op1->kind = op2->kind, op1->ops = op2->ops; } - -unsigned int MatchTypes(struct Type * source, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, struct __ecereNameSpace__ecere__com__Class * owningClassSource, struct __ecereNameSpace__ecere__com__Class * owningClassDest, unsigned int doConversion, unsigned int enumBaseType, unsigned int acceptReversedParams, unsigned int isConversionExploration, unsigned int warnConst) +switch(exp->__anon1.op.op) { -if(source && dest) +case '+': +if(op1->ops.Add) { -if(warnConst) -CheckConstCompatibility(source, dest, 1); -if(source->kind == 20 && dest->kind != 20) +FreeExpContents(exp); +op1->ops.Add(exp, op1, op2); +} +break; +case '-': +if(op1->ops.Sub) { -struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter); - -if(type) -source = type; +FreeExpContents(exp); +op1->ops.Sub(exp, op1, op2); } -if(dest->kind == 20 && source->kind != 20) +break; +case '*': +if(op1->ops.Mul) { -struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter); - -if(type) -dest = type; +FreeExpContents(exp); +op1->ops.Mul(exp, op1, op2); } -if(dest->classObjectType == 2 && dest->kind != 11) +break; +case '/': +if(op1->ops.Div) { -if(source->classObjectType != 3) -return 1; -else +FreeExpContents(exp); +op1->ops.Div(exp, op1, op2); +} +break; +case '%': +if(op1->ops.Mod) { -if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class"))) +FreeExpContents(exp); +op1->ops.Mod(exp, op1, op2); +} +break; +case '&': +if(exp->__anon1.op.exp2) { -return 1; +if(op1->ops.BitAnd) +{ +FreeExpContents(exp); +op1->ops.BitAnd(exp, op1, op2); } } +break; +case '|': +if(op1->ops.BitOr) +{ +FreeExpContents(exp); +op1->ops.BitOr(exp, op1, op2); } -else +break; +case '^': +if(op1->ops.BitXor) { -if(source->kind != 11 && source->classObjectType == 3) -return 1; -if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2) -return 1; +FreeExpContents(exp); +op1->ops.BitXor(exp, op1, op2); } -if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10)) +break; +case LEFT_OP: +if(op1->ops.LShift) { -if((dest->__anon1.__anon1.enumName && source->__anon1.__anon1.enumName && !strcmp(dest->__anon1.__anon1.enumName, source->__anon1.__anon1.enumName)) || (source->__anon1.__anon1.members.first && source->__anon1.__anon1.members.first == dest->__anon1.__anon1.members.first)) -return 1; +FreeExpContents(exp); +op1->ops.LShift(exp, op1, op2); } -if(dest->kind == 14 && source->kind != 0) -return 1; -if(dest->kind == 13 && dest->__anon1.type->kind == 0 && ((source->kind == 8 && (!source->__anon1._class || !source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type == 1 || source->__anon1._class->__anon1.registered->type == 0 || source->__anon1._class->__anon1.registered->type == 5 || source->__anon1._class->__anon1.registered->type == 1000)) || source->kind == 19 || source->kind == 13 || source->kind == 12 || source->kind == 11 || source->kind == 21)) -return 1; -if(!isConversionExploration && source->kind == 13 && source->__anon1.type->kind == 0 && ((dest->kind == 8 && (!dest->__anon1._class || !dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type == 1 || dest->__anon1._class->__anon1.registered->type == 0 || dest->__anon1._class->__anon1.registered->type == 5 || dest->__anon1._class->__anon1.registered->type == 1000)) || dest->kind == 19 || dest->kind == 13 || dest->kind == 12 || dest->kind == 11 || dest->kind == 21)) -return 1; -if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class) +break; +case RIGHT_OP: +if(op1->ops.RShift) { -if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3) +FreeExpContents(exp); +op1->ops.RShift(exp, op1, op2); +} +break; +case EQ_OP: +if(op1->ops.Equ) { -if(conversions != (((void *)0))) +FreeExpContents(exp); +op1->ops.Equ(exp, op1, op2); +} +break; +case NE_OP: +if(op1->ops.Nqu) { -if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered) -return 1; +FreeExpContents(exp); +op1->ops.Nqu(exp, op1, op2); } -else +break; +case AND_OP: +if(op1->ops.And) { -struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase; - -for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base) -; -for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base) -; -if(sourceBase == destBase) -return 1; +FreeExpContents(exp); +op1->ops.And(exp, op1, op2); } +break; +case OR_OP: +if(op1->ops.Or) +{ +FreeExpContents(exp); +op1->ops.Or(exp, op1, op2); } -else if(source->__anon1._class && dest->__anon1._class && (dest->classObjectType == source->classObjectType || !dest->classObjectType) && (enumBaseType || (!source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type != 4) || (!dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type != 4)) && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, dest->__anon1._class->__anon1.registered)) -return 1; -else +break; +case '>': +if(op1->ops.Grt) { -if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && source->__anon1._class && source->__anon1._class->__anon1.registered && (dest->casted || (enumBaseType && dest->__anon1._class->__anon1.registered->type == 4 && (source->kind == 8 || source->__anon1._class->__anon1.registered->type != 4)))) +FreeExpContents(exp); +op1->ops.Grt(exp, op1, op2); +} +break; +case '<': +if(op1->ops.Sma) { -if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered)) +FreeExpContents(exp); +op1->ops.Sma(exp, op1, op2); +} +break; +case GE_OP: +if(op1->ops.GrtEqu) { -return 1; +FreeExpContents(exp); +op1->ops.GrtEqu(exp, op1, op2); +} +break; +case LE_OP: +if(op1->ops.SmaEqu) +{ +FreeExpContents(exp); +op1->ops.SmaEqu(exp, op1, op2); +} +break; } } } } -if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class")) -return 1; -if(doConversion) -{ -if(source->kind == 8) -{ -struct __ecereNameSpace__ecere__com__Class * _class; -for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) +void ApplyAnyObjectLogic(struct Expression * e) { -struct __ecereNameSpace__ecere__com__Property * convert; +struct Type * destType = e->destType; -for(convert = _class->conversions.first; convert; convert = convert->next) +if(destType && (destType->classObjectType == 3)) { -if(convert->memberAccess == 1 || _class->module == privateModule) +if(e && e->expType) { -struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0)); +struct Type * type = e->expType; +struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0)); -if(!convert->dataType) -convert->dataType = ProcessTypeString(convert->dataTypeString, 0); -if((!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), (convert->dataType->kind == 8 && !strcmp(convert->dataTypeString, "String")) ? 1 : 0, convert->dataType->kind == 8, 0, 1, warnConst)) +if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) { -if(!conversions && !convert->Get) -return 1; -else if(conversions != (((void *)0))) +_class = type->__anon1._class->__anon1.registered; +} +else if(type->kind == 19) { -if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base)) -return 1; +_class = FindClass("ecere::com::Class")->__anon1.registered; +} else { -struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv); +char string[1024] = ""; +struct Symbol * classSym; -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv); -return 1; -} +PrintTypeNoConst(type, string, 0, 1); +classSym = FindClass(string); +if(classSym) +_class = classSym->__anon1.registered; } +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 != 8 || !type->__anon1._class || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type == 1))) || destType->byReference))) +{ +if(!_class || strcmp(_class->fullName, "char *")) +{ +struct Expression * checkedExp = e, * newExp; + +while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11) +{ +if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) +{ +if(checkedExp->type == 23) +{ +checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; } +else +checkedExp = (*checkedExp->__anon1.list).last; } +else if(checkedExp->type == 11) +checkedExp = checkedExp->__anon1.cast.exp; } +if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1) +{ +newExp = checkedExp->__anon1.op.exp2; +checkedExp->__anon1.op.exp2 = (((void *)0)); +FreeExpContents(checkedExp); +if(e->expType && e->expType->passAsTemplate) +{ +char size[100]; + +ComputeTypeSize(e->expType); +sprintf(size, "%d", e->expType->size); +newExp = MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp), '+', MkExpCall(MkExpIdentifier(MkIdentifier("__ENDIAN_PAD")), MkListOne(MkExpConstant(size)))))); } +ReplaceExpContents(checkedExp, newExp); +e->byReference = 1; } -if(dest->kind == 8) +else if(!e->byReference || (_class && _class->type == 5)) { -struct __ecereNameSpace__ecere__com__Class * _class; +struct Expression * checkedExp; -for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) { -struct __ecereNameSpace__ecere__com__Property * convert; +unsigned int hasAddress = e->type == 0 || (e->type == 8 && e->__anon1.member.memberType == 3) || (e->type == 9 && e->__anon1.member.memberType == 3) || (e->type == 4 && !e->__anon1.op.exp1 && e->__anon1.op.op == '*') || e->type == 6; -for(convert = _class->conversions.first; convert; convert = convert->next) -{ -if(convert->memberAccess == 1 || _class->module == privateModule) +if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress) { -struct Type * constType = (((void *)0)); -unsigned int success = 0; +struct Context * context = PushContext(); +struct Declarator * decl; +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +char typeString[1024]; +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -if(!convert->dataType) -convert->dataType = ProcessTypeString(convert->dataTypeString, 0); -if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant) +typeString[0] = '\0'; +*newExp = *e; +newExp->prev = (((void *)0)); +newExp->next = (((void *)0)); +newExp->expType = (((void *)0)); +PrintTypeNoConst(e->expType, typeString, 0, 1); +decl = SpecDeclFromString(typeString, specs, (((void *)0))); +newExp->destType = ProcessType(specs, decl); +curContext = context; +if(curCompound) { -struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); - -constType = __extension__ ({ -struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +char name[100]; +struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList(); -__ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1; -}); -CopyTypeInto(ptrType, convert->dataType->__anon1.type); -ptrType->constant = 1; +e->type = 23; +sprintf(name, "__internalValue%03X", internalValueCounter++); +if(!curCompound->__anon1.compound.declarations) +curCompound->__anon1.compound.declarations = MkList(); +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0)))))); +ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp)))); +ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name))))); +e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts); } -if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst)) -{ -if(!conversions && !convert->Set) -success = 1; -else if(conversions != (((void *)0))) -{ -if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (source->kind != 8 || source->__anon1._class->__anon1.registered != _class->base)) -success = 1; else +printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n"); { -struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv); +struct Type * type = e->destType; -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv); -success = 1; +e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(e->destType, type); +e->destType->refCount = 1; +e->destType->classObjectType = 0; +FreeType(type); } +e->__anon1.compound->__anon1.compound.context = context; +PopContext(context); +curContext = context->parent; } } -if(constType) -FreeType(constType); -if(success) -return 1; +checkedExp = e; +while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11) +{ +if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) +{ +if(checkedExp->type == 23) +{ +checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; } +else +checkedExp = (*checkedExp->__anon1.list).last; } +else if(checkedExp->type == 11) +checkedExp = checkedExp->__anon1.cast.exp; } -if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) -{ -if(!dest->__anon1._class->__anon1.registered->dataType) -dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0); -if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth) -{ -if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, dest->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst)) { -return 1; +struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); + +*operand = *checkedExp; +__ecereMethod_Expression_Clear(checkedExp); +checkedExp->destType = ProcessTypeString("void *", 0); +checkedExp->expType = checkedExp->destType; +checkedExp->destType->refCount++; +checkedExp->type = 4; +checkedExp->__anon1.op.op = '&'; +checkedExp->__anon1.op.exp1 = (((void *)0)); +checkedExp->__anon1.op.exp2 = operand; +} +} } } } } -if(source->kind == 8) { -struct __ecereNameSpace__ecere__com__Class * _class; - -for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base) +} +if((!destType || destType->kind == 14 || destType->kind == 0) && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && (e->expType->byReference || (e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3)))) { -struct __ecereNameSpace__ecere__com__Property * convert; - -for(convert = _class->conversions.first; convert; convert = convert->next) +if(e->expType->classObjectType && destType && destType->classObjectType) { -if(convert->memberAccess == 1 || _class->module == privateModule) +return ; +} +else { -struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0)); +struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -if(!convert->dataType) -convert->dataType = ProcessTypeString(convert->dataTypeString, 0); -if(convert->dataType != source && (!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), convert->dataType->kind == 8, convert->dataType->kind == 8, 0, 1, warnConst)) -{ -if(!conversions && !convert->Get) -return 1; -else if(conversions != (((void *)0))) +*thisExp = *e; +thisExp->prev = (((void *)0)); +thisExp->next = (((void *)0)); +__ecereMethod_Expression_Clear(e); +e->type = 5; +e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp)))); +if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5) +((struct Expression *)(*e->__anon1.list).first)->byReference = 1; { -if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base)) -return 1; -else +e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(e->expType, thisExp->expType); +e->expType->byReference = 0; +e->expType->refCount = 1; +if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3)) { -struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv); - -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv); -return 1; -} -} +e->expType->classObjectType = 0; } } } } -if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4) +else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0) { -if(!source->__anon1._class->__anon1.registered->dataType) -source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0); -if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String")) +if(destType->kind == 14) { -if(MatchTypes(source->__anon1._class->__anon1.registered->dataType, dest, conversions, (((void *)0)), (((void *)0)), source->__anon1._class->__anon1.registered->dataType->kind == 8, source->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst)) -return 1; -else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst)) -return 1; -} -} -} +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0)))); } -if(source->kind == 8 || source->kind == 19) -; -else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16)) -return 1; -else if(dest->kind == 7 && source->kind == 6) -return 1; -else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24)) -return 1; -else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23)) -return 1; -else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23)) -return 1; -else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4)) -return 1; -else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22)) -return 1; -else if(source->kind == 15 && (dest->kind == 3 || dest->kind == 2 || dest->kind == 1 || source->kind == 24 || dest->kind == 5 || dest->kind == 4 || dest->kind == 22 || dest->kind == 23)) -return 1; -else if(dest->kind == 15 && !isConversionExploration && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 5 || source->kind == 4 || source->kind == 22 || source->kind == 23)) -return 1; -else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && ((source->kind == 11 || (source->kind == 13 && source->__anon1.type->kind == 11) || source->kind == 16))) +else if(!(destType->truth && e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && e->expType->__anon1._class->__anon1.registered->type == 1)) { -struct Type * paramSource, * paramDest; +unsigned int byReference = e->expType->byReference; +struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct Declarator * decl; +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +char typeString[1024]; +struct Type * type; +int backupClassObjectType; +unsigned int backupByReference; -if(dest->kind == 16) -owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class; -if(source->kind == 16) -owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class; -if(dest->kind == 13 && dest->__anon1.type->kind == 11) -dest = dest->__anon1.type; -if(source->kind == 13 && source->__anon1.type->kind == 11) -source = source->__anon1.type; -if(dest->kind == 16) -dest = dest->__anon1.__anon3.method->dataType; -if(source->kind == 16) -source = source->__anon1.__anon3.method->dataType; -paramSource = source->__anon1.__anon2.params.first; -if(paramSource && paramSource->kind == 0) -paramSource = (((void *)0)); -paramDest = dest->__anon1.__anon2.params.first; -if(paramDest && paramDest->kind == 0) -paramDest = (((void *)0)); -if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource))) +if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class")) +type = e->expType; +else +type = destType; +backupClassObjectType = type->classObjectType; +backupByReference = type->byReference; +type->classObjectType = 0; +type->byReference = 0; +typeString[0] = '\0'; +PrintType(type, typeString, 0, 1); +decl = SpecDeclFromString(typeString, specs, (((void *)0))); +type->classObjectType = backupClassObjectType; +type->byReference = backupByReference; +*thisExp = *e; +thisExp->prev = (((void *)0)); +thisExp->next = (((void *)0)); +__ecereMethod_Expression_Clear(e); +if((type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 1000 || type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 4 || type->__anon1._class->__anon1.registered->type == 3)) || (type->kind != 13 && type->kind != 22 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13))) { -if(!paramDest || (!(paramDest->kind == 13 && paramDest->__anon1.type && paramDest->__anon1.type->kind == 0) && (paramDest->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, paramDest->__anon1._class->__anon1.registered)))) +unsigned int passAsTemplate = thisExp->destType->passAsTemplate; +struct Type * t; + +destType->refCount++; +e->type = 4; +e->__anon1.op.op = '*'; +e->__anon1.op.exp1 = (((void *)0)); +e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp); +t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(t, thisExp->destType); +t->passAsTemplate = 0; +FreeType(thisExp->destType); +thisExp->destType = t; +t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(t, destType); +t->passAsTemplate = passAsTemplate; +FreeType(destType); +destType = t; +destType->refCount = 0; +e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(e->expType, type); +if(type->passAsTemplate) { -if(paramDest && paramDest->kind == 8) -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string); +e->expType->classObjectType = 0; +e->expType->passAsTemplate = 0; +} +e->expType->byReference = 0; +e->expType->refCount = 1; +} else -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0)))); -return 0; +{ +e->type = 11; +e->__anon1.cast.typeName = MkTypeName(specs, decl); +e->__anon1.cast.exp = thisExp; +e->byReference = 1; +e->expType = type; +type->refCount++; } -paramDest = paramDest->next; +if(e->destType) +FreeType(e->destType); +e->destType = destType; +destType->refCount++; } -else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest)) +} +} + +void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module) { -if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource))) +struct __ecereNameSpace__ecere__com__Class * _class; +struct __ecereNameSpace__ecere__sys__OldLink * subModule; + +for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next) +ComputeModuleClasses(subModule->data); +for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next) +ComputeClassMembers(_class, 0); +} + +struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl) { -if(dest->__anon1.__anon2.thisClass) +struct External * external = (((void *)0)); +struct Symbol * classSym = FindClass(name); +struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0)); + +if(!inCompiler || !classSym) +return (((void *)0)); +if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4)) +return (((void *)0)); +if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base)) +_DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl); +external = classSym->__anon2.__anon1.structExternal; +if(external && external->__anon1.declaration) { -if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered)) +struct Specifier * spec; + +for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next) +if(spec->type == 3 || spec->type == 4) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string); -return 0; +curDeclarations = spec->__anon1.__anon2.definitions; +break; } } -else +if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations))) { -if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest))) +struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators; +struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0)); +char structName[1024]; +unsigned int addedPadding = 0; +struct Specifier * curSpec = (((void *)0)); + +classSym->declaring++; +if(strchr(classSym->string, '<')) { -if(owningClassDest) -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName); -else -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0)))); -return 0; -} -} -paramSource = paramSource->next; +if(classSym->__anon1.registered->templateClass) +external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl); +classSym->declaring--; +return external; } -else -{ -if(dest->__anon1.__anon2.thisClass) +structName[0] = 0; +FullClassNameCat(structName, name, 0); +classSym->declaredStructSym = 1; +if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations)) { -if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered)) +unsigned int add = 0; + +if(!external) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string); -return 0; +external = MkExternalDeclaration((((void *)0))); +classSym->__anon2.__anon1.structExternal = external; +external->symbol = classSym; +add = 1; } +if(!skipNoHead) +{ +declarations = MkList(); +AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding); } -else +if(external->__anon1.declaration) { -if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest)) +struct Specifier * spec; + +for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next) +if(spec->type == 3 || spec->type == 4) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName); -return 0; -} +curSpec = spec; +curDeclarations = spec->__anon1.__anon2.definitions; +break; } } +if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding))) +{ +FreeList(declarations, (void *)(FreeClassDef)); +declarations = (((void *)0)); } -if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) +if(classSym->__anon1.registered->type != 5 && !declarations) { -Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0)))); -return 0; +FreeExternal(external); +external = (((void *)0)); +classSym->__anon2.__anon1.structExternal = (((void *)0)); } else -CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1); -for(; paramDest; paramDest = paramDest->next) { -if(!paramSource) +if(curSpec) +curSpec->__anon1.__anon2.definitions = declarations; +else { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0)))); -return 0; +specifiers = MkList(); +declarators = MkList(); +ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations)); +external->__anon1.declaration = MkDeclaration(specifiers, declarators); +} +if(add) +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external); } +} +classSym->declaring--; +} +else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal) { -struct Type * paramDestType = paramDest; -struct Type * paramSourceType = paramSource; -struct Type * type = paramDestType; - -if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20) +classSym->declaredStructSym = 1; +if(classSym->__anon1.registered) +DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0); +if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers) { -int id = 0; -struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * sClass; +struct Specifier * spec; -for(sClass = owningClassSource; sClass; sClass = sClass->base) -{ -id = 0; -if(sClass->templateClass) -sClass = sClass->templateClass; -for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next) -{ -if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name)) -{ -for(sClass = sClass->base; sClass; sClass = sClass->base) +for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next) { -if(sClass->templateClass) -sClass = sClass->templateClass; -id += sClass->templateParams.count; +if(spec->__anon1.__anon2.definitions) +IdentifyAnonStructs(spec->__anon1.__anon2.definitions); } -break; } -id++; } -if(curParam) -break; -} -if(curParam) -{ -struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id]; - -paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0); -} -} -if(!MatchTypes(paramDestType, paramSourceType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst) && (!acceptReversedParams || !MatchTypes(paramSourceType, paramDestType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))) +if(inCompiler && neededBy && (external || !classSym->imported)) { -char type[1024]; - -type[0] = 0; -PrintType(paramDest, type, 0, 1); -Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type); -if(paramDestType != paramDest) -FreeType(paramDestType); -return 0; -} -if(paramDestType != paramDest) -FreeType(paramDestType); -} -paramSource = paramSource->next; -} -if(paramSource) +if(!external) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0)))); -return 0; -} -return 1; +classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0))); +external->symbol = classSym; +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external); } -else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0)) +if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5) { -return 1; +char structName[1024]; +struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators; + +structName[0] = 0; +FullClassNameCat(structName, name, 0); +specifiers = MkList(); +declarators = MkList(); +ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))); +external->__anon1.declaration = MkDeclaration(specifiers, declarators); } -else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13)) -{ -if(!(dest->__anon1.type && dest->__anon1.type->kind == 13 && source->__anon1.type->kind == 8 && source->__anon1.type->__anon1._class && source->__anon1.type->__anon1._class->__anon1.registered && (source->__anon1.type->__anon1._class->__anon1.registered->type != 0 && source->__anon1.type->__anon1._class->__anon1.registered->type != 5) && !source->__anon1.type->byReference)) +if(fwdDecl) { -ComputeTypeSize(source->__anon1.type); -ComputeTypeSize(dest->__anon1.type); -if(source->__anon1.type->size == dest->__anon1.type->size && MatchTypes(source->__anon1.type, dest->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) -return 1; -} +struct External * e = external->fwdDecl ? external->fwdDecl : external; + +if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count) +__ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl); } +else +__ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference); } -return 0; +return external; } -void ComputeInstantiation(struct Expression * exp) +unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions) { -struct Instantiation * inst = exp->__anon1.instance; -struct MembersInit * members; -struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256]; -int subMemberStackPos = 0; -uint64 bits = 0; +struct __ecereNameSpace__ecere__com__BTNamedLink * link; -if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5)) -{ -if(inst->data) -return ; -if(_class->type == 0 || _class->type == 5) -{ -inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class); -if(_class->type == 0) -((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++; -} -else -inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -} -if(inst->members) +for(link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->classes); link; link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)link))) { -for(members = (*inst->members).first; members; members = members->next) +struct __ecereNameSpace__ecere__com__Class * _class = link->data; + +if(_class->type == 4) { -switch(members->type) +struct __ecereNameSpace__ecere__sys__OldList converts = { -case 0: +0, 0, 0, 0, 0 +}; +struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); + +type->kind = 8; +if(!_class->symbol) +_class->symbol = FindClass(_class->fullName); +type->__anon1._class = _class->symbol; +if(MatchTypes(type, dest, &converts, (((void *)0)), (((void *)0)), dest->kind != 8 || !dest->__anon1._class || strcmp(dest->__anon1._class->string, "bool"), 0, 0, 0, 0)) { -if(members->__anon1.dataMembers) +struct __ecereNameSpace__ecere__sys__NamedLink64 * value; +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); + +if(enumClass) { -struct MemberInit * member; +struct __ecereNameSpace__ecere__com__Class * baseClass; -for(member = (*members->__anon1.dataMembers).first; member; member = member->next) +for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base) { -struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0)); -unsigned int found = 0; -struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0)); -unsigned int dataMemberOffset; +struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0))); -if(!ident) +for(value = e->values.first; value; value = value->next) { -__ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos); -if(curMember) +if(!strcmp(value->name, string)) +break; +} +if(value) { -if(curMember->isProperty) -prop = (struct __ecereNameSpace__ecere__com__Property *)curMember; +FreeType(sourceExp->expType); +sourceExp->isConstant = 1; +sourceExp->expType = MkClassType(baseClass->fullName); +if(inCompiler || inPreCompiler || inDebugger) +{ +char constant[256]; + +FreeExpContents(sourceExp); +sourceExp->type = 2; +if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char")) +sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data); else +sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data); +sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant); +} +while(converts.first) { -dataMember = curMember; -__ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0))); -if(_class->type == 0) -dataMemberOffset += _class->base->structSize; +struct Conversion * convert = converts.first; + +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert); +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert); } -found = 1; +((type ? __extension__ ({ +void * __ecerePtrToDelete = (type); + +__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), type = 0); +return 1; } } -else -{ -prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule); -if(prop) -{ -found = 1; -if(prop->memberAccess == 1) -{ -curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop; -curClass = prop->_class; } } -else -{ -struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256]; -int _subMemberStackPos = 0; +if(converts.first) +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert)); +((type ? __extension__ ({ +void * __ecerePtrToDelete = (type); -dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos); -if(dataMember) -{ -found = 1; -if(dataMember->memberAccess == 1) -{ -curMember = dataMember; -curClass = dataMember->_class; -memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos); -subMemberStackPos = _subMemberStackPos; -} +__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), type = 0); } } +for(nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->nameSpaces); nameSpace != (((void *)0)); nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)nameSpace))) +if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions)) +return 1; +return 0; } -if(found && member->initializer && member->initializer->type == 0) + +unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions) { -struct Expression * value = member->initializer->__anon1.exp; -struct Type * type = (((void *)0)); -unsigned int deepMember = 0; +struct __ecereNameSpace__ecere__com__Instance * module; -if(prop) +if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, sourceExp, dest, string, conversions)) +return 1; +if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, sourceExp, dest, string, conversions)) +return 1; +if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions)) +return 1; +for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next) { -type = prop->dataType; +if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions)) +return 1; } -else if(dataMember) -{ -if(!dataMember->dataType) -dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); -type = dataMember->dataType; +return 0; } -if(ident && ident->next) + +void ProcessExpressionType(struct Expression * exp); + +static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class) { -deepMember = 1; -for(ident = ident->next; ident && type; ident = ident->next) +if(exp->type == 0 && exp->__anon1.__anon1.identifier) { -if(type->kind == 8) +struct Identifier * id = exp->__anon1.__anon1.identifier; +struct Context * ctx; +struct Symbol * symbol = (((void *)0)); + +if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property")) { -prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule); -if(prop) -type = prop->dataType; -else +for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent) { -dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0))); -if(dataMember) -type = dataMember->dataType; +if(!ctx) +break; +symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string); +if(symbol) +break; } } -else if(type->kind == 9 || type->kind == 10) +if(!symbol && ((!id->_class || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))) || (id->classSym && __ecereNameSpace__ecere__com__eClass_IsDerived(_class, id->classSym->__anon1.registered)))) { -struct Type * memberType; +struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule); +struct __ecereNameSpace__ecere__com__Method * method = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0)); +struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0)); -for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next) +if(!prop) { -if(!strcmp(memberType->name, ident->string)) -{ -type = memberType; -break; -} -} -} +method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule); } +if(!prop && !method) +member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0))); +if(!prop && !method && !member) +{ +classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string); } -if(value) +if(prop || method || member || classProp) { -FreeType(value->destType); -value->destType = type; -if(type) -type->refCount++; -ComputeExpression(value); +exp->type = 8; +exp->__anon1.member.member = id; +exp->__anon1.member.memberType = 0; +exp->__anon1.member.exp = QMkExpId("this"); +exp->addedThis = 1; } -if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5)) +else if(_class && _class->templateParams.first) { -if(type->kind == 8) +struct __ecereNameSpace__ecere__com__Class * sClass; + +for(sClass = _class; sClass; sClass = sClass->base) { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +if(sClass->templateParams.first) +{ +struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param; -if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4)) +for(param = sClass->templateParams.first; param; param = param->next) { -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -type = _class->dataType; +if(param->type == 2 && !strcmp(param->name, id->string)) +{ +struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2); + +if(argExp) +{ +struct Declarator * decl; +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); + +FreeIdentifier(exp->__anon1.member.member); +ProcessExpressionType(argExp); +decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0))); +exp->expType = ProcessType(specs, decl); +exp->type = 5; +exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp)))); } } -if(dataMember) +} +} +} +} +} +} +} + +int ComputeTypeSize(struct Type * type) { -void * ptr = inst->data + dataMemberOffset; +unsigned int size = type ? type->size : 0; -if(value->type == 2) +if(!size && type && !type->computing) { +type->computing = 1; switch(type->kind) { +case 24: +type->alignment = size = sizeof(char); +break; +case 1: +type->alignment = size = sizeof(char); +break; case 3: -{ -GetInt(value, (int *)ptr); +type->alignment = size = sizeof(int); break; -} case 4: -{ -GetInt64(value, (long long *)ptr); +type->alignment = size = sizeof(long long); break; -} case 22: -{ -GetIntPtr(value, (intptr_t *)ptr); +type->alignment = size = targetBits / 8; +type->pointerAlignment = 1; break; -} case 23: -{ -GetIntSize(value, (ssize_t *)ptr); +type->alignment = size = targetBits / 8; +type->pointerAlignment = 1; +break; +case 5: +type->alignment = size = sizeof(long); +break; +case 2: +type->alignment = size = sizeof(short); break; -} case 6: -{ -GetFloat(value, (float *)ptr); +type->alignment = size = sizeof(float); break; -} case 7: -{ -GetDouble(value, (double *)ptr); +type->alignment = size = sizeof(double); break; -} -} -} -else if(value->type == 1) -{ -if(type->kind == 8) +case 8: { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)); -if(_class->type == 1) +if(_class && _class->type == 1) { -ComputeTypeSize(type); -if(value->__anon1.instance->data) -memcpy(ptr, value->__anon1.instance->data, type->size); +ComputeClassMembers(_class, 0); +type->alignment = _class->structAlignment; +type->pointerAlignment = (unsigned int)_class->pointerAlignment; +size = _class->structSize; +if(type->alignment && size % type->alignment) +size += type->alignment - (size % type->alignment); } +else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2)) +{ +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +size = type->alignment = ComputeTypeSize(_class->dataType); } +else +{ +size = type->alignment = targetBits / 8; +type->pointerAlignment = 1; } +break; } -else if(prop && prop->Set != (void *)(intptr_t)1) -{ -if(value->type == 1 && value->__anon1.instance->data) -{ -if(type->kind == 8) +case 13: +case 19: +size = type->alignment = targetBits / 8; +type->pointerAlignment = 1; +break; +case 12: +if(type->__anon1.__anon4.arraySizeExp) { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; - -if(_class && (_class->type != 0 || __ecereNameSpace__ecere__com__eClass_IsDerived(((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)value->__anon1.instance->data))->_class, _class))) +ProcessExpressionType(type->__anon1.__anon4.arraySizeExp); +ComputeExpression(type->__anon1.__anon4.arraySizeExp); +if(!type->__anon1.__anon4.arraySizeExp->isConstant || (type->__anon1.__anon4.arraySizeExp->expType->kind != 3 && type->__anon1.__anon4.arraySizeExp->expType->kind != 2 && type->__anon1.__anon4.arraySizeExp->expType->kind != 1 && type->__anon1.__anon4.arraySizeExp->expType->kind != 5 && type->__anon1.__anon4.arraySizeExp->expType->kind != 4 && type->__anon1.__anon4.arraySizeExp->expType->kind != 23 && type->__anon1.__anon4.arraySizeExp->expType->kind != 22 && type->__anon1.__anon4.arraySizeExp->expType->kind != 15 && (type->__anon1.__anon4.arraySizeExp->expType->kind != 8 || !type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered || type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered->type != 4))) { -void (* Set)(void *, void *) = (void *)prop->Set; +struct Location oldLoc = yylloc; +char expression[10240]; -Set(inst->data, value->__anon1.instance->data); -PopulateInstance(inst); -} +expression[0] = '\0'; +type->__anon1.__anon4.arraySizeExp->expType = (((void *)0)); +yylloc = type->__anon1.__anon4.arraySizeExp->loc; +if(inCompiler) +PrintExpression(type->__anon1.__anon4.arraySizeExp, expression); +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression); +yylloc = oldLoc; } +GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize); } -else if(value->type == 2) -{ -switch(type->kind) +else if(type->__anon1.__anon4.enumClass) { -case 7: +if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4) { -void (* Set)(void *, double) = (void *)prop->Set; - -Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0)))); -break; +type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize"); } -case 6: +else +type->__anon1.__anon4.arraySize = 0; +} +else { -void (* Set)(void *, float) = (void *)prop->Set; - -Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0))))); -break; +type->__anon1.__anon4.arraySize = 0; } -case 3: +size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize; +if(type->__anon1.type) { -void (* Set)(void *, int) = (void *)prop->Set; - -Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0)); -break; +type->alignment = type->__anon1.type->alignment; +type->pointerAlignment = type->__anon1.type->pointerAlignment; } -case 4: +break; +case 9: { -void (* Set)(void *, long long) = (void *)prop->Set; +if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName) +{ +struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName); -Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); -break; +if(symbol && symbol->type) +{ +ComputeTypeSize(symbol->type); +size = symbol->type->size; } -case 22: +} +else { -void (* Set)(void *, intptr_t) = (void *)prop->Set; +struct Type * member; -Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); -break; -} -case 23: +for(member = type->__anon1.__anon1.members.first; member; member = member->next) { -void (* Set)(void *, ssize_t) = (void *)prop->Set; +int __simpleStruct0, __simpleStruct1; +unsigned int addSize = ComputeTypeSize(member); -Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); -break; +member->offset = size; +if(member->alignment && size % member->alignment) +member->offset += member->alignment - (size % member->alignment); +size = member->offset; +if(member->pointerAlignment && type->size <= 4) +type->pointerAlignment = 1; +else if(!member->pointerAlignment && member->alignment >= 8) +type->pointerAlignment = 0; +type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1); +size += addSize; } +if(type->alignment && size % type->alignment) +size += type->alignment - (size % type->alignment); } +break; } -else if(value->type == 3) +case 10: { -char temp[1024]; +if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName) +{ +struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName); -ReadString(temp, value->__anon1.__anon2.string); -((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp); -} +if(symbol && symbol->type) +{ +ComputeTypeSize(symbol->type); +size = symbol->type->size; +type->alignment = symbol->type->alignment; } } -else if(!deepMember && type && _class->type == 3) +else { -if(prop) -{ -if(value->type == 2) +struct Type * member; + +for(member = type->__anon1.__anon1.members.first; member; member = member->next) { -if(type->kind == 8) +int __simpleStruct0, __simpleStruct1; +unsigned int addSize = ComputeTypeSize(member); + +member->offset = size; +if(member->alignment && size % member->alignment) +member->offset += member->alignment - (size % member->alignment); +size = member->offset; +if(member->pointerAlignment && type->size <= 4) +type->pointerAlignment = 1; +else if(!member->pointerAlignment && member->alignment >= 8) +type->pointerAlignment = 0; +type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1); +size = ((size > addSize) ? size : addSize); +} +if(type->alignment && size % type->alignment) +size += type->alignment - (size % type->alignment); +} +break; +} +case 20: { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +struct TemplateParameter * param = type->__anon1.templateParameter; +struct Type * baseType = ProcessTemplateParameterType(param); -if(_class->type == 3) +if(baseType) { -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -type = _class->dataType; +size = ComputeTypeSize(baseType); +type->alignment = baseType->alignment; +type->pointerAlignment = baseType->pointerAlignment; } +else +type->alignment = size = sizeof(uint64); +break; } -switch(type->kind) +case 15: { -case 6: +type->alignment = size = sizeof(enum { -float fValue; -float (* Set)(float) = (void *)prop->Set; - -GetFloat(member->initializer->__anon1.exp, &fValue); -exp->__anon1.__anon1.constant = PrintFloat(Set(fValue)); -exp->type = 2; +test +}); break; } -case 7: +case 21: { -double dValue; -double (* Set)(double) = (void *)prop->Set; - -GetDouble(member->initializer->__anon1.exp, &dValue); -exp->__anon1.__anon1.constant = PrintDouble(Set(dValue)); -exp->type = 2; +type->alignment = size = targetBits / 8; +type->pointerAlignment = 1; break; } } +type->size = size; +type->computing = 0; } +return size; } -} -else if(!deepMember && type && _class->type == 2) -{ -if(prop) -{ -if(value->type == 1 && value->__anon1.instance->data) + +unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst) { -unsigned int (* Set)(void *) = (void *)prop->Set; +struct Type * source; +struct Type * realDest = dest; +struct Type * backupSourceExpType = (((void *)0)); +struct Expression * nbExp = GetNonBracketsExp(sourceExp); +struct Expression * computedExp = nbExp; -bits = Set(value->__anon1.instance->data); +dest->refCount++; +if(sourceExp->isConstant && sourceExp->type != 2 && sourceExp->type != 0 && sourceExp->type != 11 && dest->kind == 8 && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) +{ +computedExp = CopyExpression(nbExp); +ComputeExpression(computedExp); } -else if(value->type == 2) +source = sourceExp->expType; +if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0)) +{ +if(computedExp != nbExp) { +FreeExpression(computedExp); +computedExp = nbExp; } +FreeType(dest); +return 1; } -else if(dataMember) +if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8) { -struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember; -struct Type * type; -uint64 part = 0; +if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3) +{ +struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase; -bits = (bits & ~bitMember->mask); -if(!bitMember->dataType) -bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0); -type = bitMember->dataType; -if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) +for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base) +; +for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base) +; +if(sourceBase == destBase) { -if(!type->__anon1._class->__anon1.registered->dataType) -type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0); -type = type->__anon1._class->__anon1.registered->dataType; -} -switch(type->kind) +if(computedExp != nbExp) { -case 24: -case 1: +FreeExpression(computedExp); +computedExp = nbExp; +} +FreeType(dest); +return 1; +} +} +} +if(source) { -unsigned char v; +struct __ecereNameSpace__ecere__sys__OldList * specs; +unsigned int flag = 0; +long long value = (((int)0x7fffffff)); -type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v); -part = (uint64)v; -break; +source->refCount++; +if(computedExp->type == 2) +{ +if(source->isSigned) +value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0); +else +value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0); } -case 2: +else if(computedExp->type == 4 && computedExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2) { -unsigned short v; - -type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v); -part = (uint64)v; -break; +if(source->isSigned) +value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0); +else +value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0); } -case 3: -case 5: +if(computedExp != nbExp) { -unsigned int v; - -type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v); -part = (uint64)v; -break; +FreeExpression(computedExp); +computedExp = nbExp; } -case 4: +if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar")) { -uint64 v; +FreeType(source); +source = __extension__ ({ +struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v); -part = v; -break; +__ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1; +}); } -case 22: +if(dest->kind == 8) { -uintptr_t v; +struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); -type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v); -part = (uint64)v; -break; -} -case 23: +if(_class && _class->type == 3) { -size_t v; +if(source->kind != 8) +{ +struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +struct Type * tempDest, * tempSource; -type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v); -part = (uint64)v; -break; -} -} -bits |= part << bitMember->pos; -} -} +for(; _class->base->type != 1000; _class = _class->base) +; +tempSource = dest; +tempDest = tempType; +tempType->kind = 8; +if(!_class->symbol) +_class->symbol = FindClass(_class->fullName); +tempType->__anon1._class = _class->symbol; +tempType->truth = dest->truth; +if(tempType->__anon1._class) +MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); +backupSourceExpType = sourceExp->expType; +if(dest->passAsTemplate) +{ +sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(sourceExp->expType, dest); +sourceExp->expType->passAsTemplate = 0; } else { -if(_class && _class->type == 3) -{ -ComputeExpression(member->initializer->__anon1.exp); -exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant; -exp->type = 2; -member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0)); -} -} -} -} -break; -} +sourceExp->expType = dest; +dest->refCount++; } +flag = 1; +((tempType ? __extension__ ({ +void * __ecerePtrToDelete = (tempType); + +__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), tempType = 0); } } -if(_class && _class->type == 2) +if(_class && _class->type == 2 && source->kind != 8) { -exp->__anon1.__anon1.constant = PrintHexUInt(bits); -exp->type = 2; -} -if(exp->type != 1) +if(!dest->__anon1._class->__anon1.registered->dataType) +dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0); +if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) { -FreeInstance(inst); +FreeType(source); +FreeType(sourceExp->expType); +source = sourceExp->expType = MkClassType(dest->__anon1._class->string); +source->refCount++; } } - -void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2) -{ -if(exp->__anon1.op.op == SIZEOF) +if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3) { -FreeExpContents(exp); -exp->type = 2; -exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type)); +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +struct Declarator * decl; +char string[1024]; + +ReadString(string, sourceExp->__anon1.__anon2.string); +decl = SpecDeclFromString(string, specs, (((void *)0))); +FreeExpContents(sourceExp); +FreeType(sourceExp->expType); +sourceExp->type = 24; +sourceExp->__anon1._classExp.specifiers = specs; +sourceExp->__anon1._classExp.decl = decl; +sourceExp->expType = dest; +dest->refCount++; +FreeType(source); +FreeType(dest); +if(backupSourceExpType) +FreeType(backupSourceExpType); +return 1; } -else -{ -if(!exp->__anon1.op.exp1) +} +else if(source->kind == 8) { -switch(exp->__anon1.op.op) +struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); + +if(_class && (_class->type == 3 || _class->type == 2)) { -case '+': +if(dest->kind != 8) { -struct Expression * exp2 = exp->__anon1.op.exp2; - -exp->__anon1.op.exp2 = (((void *)0)); -FreeExpContents(exp); -FreeType(exp->expType); -FreeType(exp->destType); -*exp = *exp2; -((exp2 ? __extension__ ({ -void * __ecerePtrToDelete = (exp2); +struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +struct Type * tempDest, * tempSource; -__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), exp2 = 0); -break; -} -case '-': -if(op1->ops.Neg) +if(!source->__anon1._class->__anon1.registered->dataType) +source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0); +for(; _class->base->type != 1000; _class = _class->base) +; +tempDest = source; +tempSource = tempType; +tempType->kind = 8; +tempType->__anon1._class = FindClass(_class->fullName); +tempType->truth = source->truth; +tempType->classObjectType = source->classObjectType; +if(tempType->__anon1._class) +MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); +if(conversions && conversions->last) { -FreeExpContents(exp); -op1->ops.Neg(exp, op1); +((struct Conversion *)conversions->last)->resultType = dest; +dest->refCount++; +modifyPassAsTemplate(&((struct Conversion *)conversions->last)->resultType, 0); } -break; -case '~': -if(op1->ops.BitNot) +FreeType(sourceExp->expType); +sourceExp->expType = MkClassType(_class->fullName); +sourceExp->expType->truth = source->truth; +sourceExp->expType->classObjectType = source->classObjectType; +if(!sourceExp->destType) { -FreeExpContents(exp); -op1->ops.BitNot(exp, op1); +FreeType(sourceExp->destType); +sourceExp->destType = sourceExp->expType; +if(sourceExp->expType) +sourceExp->expType->refCount++; } -break; -case '!': -if(op1->ops.Not) -{ -FreeExpContents(exp); -op1->ops.Not(exp, op1); +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +FreeType(dest); +dest = MkClassType(source->__anon1._class->string); +dest->truth = source->truth; +dest->classObjectType = source->classObjectType; +FreeType(source); +source = _class->dataType; +source->refCount++; +((tempType ? __extension__ ({ +void * __ecerePtrToDelete = (tempType); + +__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), tempType = 0); } -break; } } -else +if(!flag) { -if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind) +if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) { -if(Promote(op2, op1->kind, op1->type->isSigned)) -op2->kind = op1->kind, op2->ops = op1->ops; -else if(Promote(op1, op2->kind, op2->type->isSigned)) -op1->kind = op2->kind, op1->ops = op2->ops; +FreeType(source); +FreeType(dest); +return 1; } -switch(exp->__anon1.op.op) +} +if(dest->kind == 8) { -case '+': -if(op1->ops.Add) +struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); +unsigned int fittingValue = 0; + +if(_class && _class->type == 4) { -FreeExpContents(exp); -op1->ops.Add(exp, op1, op2); +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); +struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); + +if(c && value >= 0 && value <= c->largest) +fittingValue = 1; } -break; -case '-': -if(op1->ops.Sub) +if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2)) { -FreeExpContents(exp); -op1->ops.Sub(exp, op1, op2); -} -break; -case '*': -if(op1->ops.Mul) +if(_class->type == 0 || _class->type == 5) { -FreeExpContents(exp); -op1->ops.Mul(exp, op1, op2); -} -break; -case '/': -if(op1->ops.Div) +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); + +*newExp = *sourceExp; +if(sourceExp->destType) +sourceExp->destType->refCount++; +if(sourceExp->expType) +sourceExp->expType->refCount++; +sourceExp->type = 11; +sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))); +sourceExp->__anon1.cast.exp = newExp; +FreeType(sourceExp->expType); +sourceExp->expType = (((void *)0)); +ProcessExpressionType(sourceExp); +if(!inCompiler) { -FreeExpContents(exp); -op1->ops.Div(exp, op1, op2); +FreeType(sourceExp->expType); +sourceExp->expType = dest; } -break; -case '%': -if(op1->ops.Mod) +FreeType(source); +if(inCompiler) +FreeType(dest); +if(backupSourceExpType) +FreeType(backupSourceExpType); +return 1; +} +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +FreeType(dest); +dest = _class->dataType; +dest->refCount++; +} +if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24)) { -FreeExpContents(exp); -op1->ops.Mod(exp, op1, op2); +specs = MkListOne(MkSpecifier(DOUBLE)); } -break; -case '&': -if(exp->__anon1.op.exp2) +else if(dest->kind == 6 && (source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 7)) { -if(op1->ops.BitAnd) +specs = MkListOne(MkSpecifier(FLOAT)); +} +else if(dest->kind == 4 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7)) { -FreeExpContents(exp); -op1->ops.BitAnd(exp, op1, op2); +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(INT64)); } +else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7)) +{ +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(INT)); } -break; -case '|': -if(op1->ops.BitOr) +else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7)) { -FreeExpContents(exp); -op1->ops.BitOr(exp, op1, op2); +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(SHORT)); } -break; -case '^': -if(op1->ops.BitXor) +else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7)) { -FreeExpContents(exp); -op1->ops.BitXor(exp, op1, op2); +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(CHAR)); } -break; -case LEFT_OP: -if(op1->ops.LShift) +else { -FreeExpContents(exp); -op1->ops.LShift(exp, op1, op2); +FreeType(source); +FreeType(dest); +if(backupSourceExpType) +{ +if(sourceExp->expType) +FreeType(sourceExp->expType); +sourceExp->expType = backupSourceExpType; } -break; -case RIGHT_OP: -if(op1->ops.RShift) +return 0; +} +} +else if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || source->kind == 4 || source->kind == 3 || source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1)) { -FreeExpContents(exp); -op1->ops.RShift(exp, op1, op2); +specs = MkListOne(MkSpecifier(DOUBLE)); } -break; -case EQ_OP: -if(op1->ops.Equ) +else if(dest->kind == 6 && (source->kind == 6 || source->kind == 15 || source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1)) { -FreeExpContents(exp); -op1->ops.Equ(exp, op1, op2); +specs = MkListOne(MkSpecifier(FLOAT)); } -break; -case NE_OP: -if(op1->ops.Nqu) +else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0)) { -FreeExpContents(exp); -op1->ops.Nqu(exp, op1, op2); +specs = MkList(); +ListAdd(specs, MkSpecifier(BOOL)); } -break; -case AND_OP: -if(op1->ops.And) +else if(dest->kind == 1 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (dest->isSigned ? (value >= -128 && value <= 127) : (value >= 0 && value <= 255))) { -FreeExpContents(exp); -op1->ops.And(exp, op1, op2); -} -break; -case OR_OP: -if(op1->ops.Or) +if(source->kind == 3) { -FreeExpContents(exp); -op1->ops.Or(exp, op1, op2); +FreeType(dest); +FreeType(source); +if(backupSourceExpType) +FreeType(backupSourceExpType); +return 1; } -break; -case '>': -if(op1->ops.Grt) +else { -FreeExpContents(exp); -op1->ops.Grt(exp, op1, op2); +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(CHAR)); } -break; -case '<': -if(op1->ops.Sma) -{ -FreeExpContents(exp); -op1->ops.Sma(exp, op1, op2); } -break; -case GE_OP: -if(op1->ops.GrtEqu) +else if(dest->kind == 2 && (source->kind == 15 || source->kind == 24 || source->kind == 1 || source->kind == 2 || (source->kind == 3 && (dest->isSigned ? (value >= -32768 && value <= 32767) : (value >= 0 && value <= 65535))))) { -FreeExpContents(exp); -op1->ops.GrtEqu(exp, op1, op2); -} -break; -case LE_OP: -if(op1->ops.SmaEqu) +if(source->kind == 3) { -FreeExpContents(exp); -op1->ops.SmaEqu(exp, op1, op2); -} -break; -} +FreeType(dest); +FreeType(source); +if(backupSourceExpType) +FreeType(backupSourceExpType); +return 1; } +else +{ +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(SHORT)); } } - -void ApplyAnyObjectLogic(struct Expression * e) -{ -struct Type * destType = e->destType; - -if(destType && (destType->classObjectType == 3)) -{ -if(e && e->expType) +else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3)) { -struct Type * type = e->expType; -struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0)); - -if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(INT)); +} +else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4)) { -_class = type->__anon1._class->__anon1.registered; +specs = MkList(); +if(!dest->isSigned) +ListAdd(specs, MkSpecifier(UNSIGNED)); +ListAdd(specs, MkSpecifier(INT64)); } -else if(type->kind == 19) +else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1)) { -_class = FindClass("ecere::com::Class")->__anon1.registered; +specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0)))); } else { -char string[1024] = ""; -struct Symbol * classSym; - -PrintTypeNoConst(type, string, 0, 1); -classSym = FindClass(string); -if(classSym) -_class = classSym->__anon1.registered; -} -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 != 8 || !type->__anon1._class || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type == 1))) || destType->byReference))) +FreeType(source); +FreeType(dest); +if(backupSourceExpType) { -if(!_class || strcmp(_class->fullName, "char *")) +if(sourceExp->expType) +FreeType(sourceExp->expType); +sourceExp->expType = backupSourceExpType; +} +return 0; +} +if(!flag && !sourceExp->opDestType) { -struct Expression * checkedExp = e, * newExp; +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11) -{ -if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) +*newExp = *sourceExp; +newExp->prev = (((void *)0)); +newExp->next = (((void *)0)); +if(sourceExp->destType) +sourceExp->destType->refCount++; +if(sourceExp->expType) +sourceExp->expType->refCount++; +sourceExp->type = 11; +if(realDest->kind == 8) { -if(checkedExp->type == 23) +sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0))); +FreeList(specs, (void *)(FreeSpecifier)); +} +else +sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0))); +if(newExp->type == 4) { -checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; +sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); } else -checkedExp = (*checkedExp->__anon1.list).last; +sourceExp->__anon1.cast.exp = newExp; +FreeType(sourceExp->expType); +sourceExp->expType = (((void *)0)); +ProcessExpressionType(sourceExp); } -else if(checkedExp->type == 11) -checkedExp = checkedExp->__anon1.cast.exp; +else +FreeList(specs, (void *)(FreeSpecifier)); +FreeType(dest); +FreeType(source); +if(backupSourceExpType) +FreeType(backupSourceExpType); +return 1; } -if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1) +else { -newExp = checkedExp->__anon1.op.exp2; -checkedExp->__anon1.op.exp2 = (((void *)0)); -FreeExpContents(checkedExp); -if(e->expType && e->expType->passAsTemplate) +if(computedExp != nbExp) { -char size[100]; - -ComputeTypeSize(e->expType); -sprintf(size, "%d", e->expType->size); -newExp = MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp), '+', MkExpCall(MkExpIdentifier(MkIdentifier("__ENDIAN_PAD")), MkListOne(MkExpConstant(size)))))); -} -ReplaceExpContents(checkedExp, newExp); -e->byReference = 1; +FreeExpression(computedExp); +computedExp = nbExp; } -else if(!e->byReference || (_class && _class->type == 5)) +while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list) +sourceExp = (*sourceExp->__anon1.list).last; +if(sourceExp->type == 0) { -struct Expression * checkedExp; +struct Identifier * id = sourceExp->__anon1.__anon1.identifier; +if(dest->kind == 8) { -unsigned int hasAddress = e->type == 0 || (e->type == 8 && e->__anon1.member.memberType == 3) || (e->type == 9 && e->__anon1.member.memberType == 3) || (e->type == 4 && !e->__anon1.op.exp1 && e->__anon1.op.op == '*') || e->type == 6; - -if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress) +if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) { -struct Context * context = PushContext(); -struct Declarator * decl; -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); -char typeString[1024]; -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); -typeString[0] = '\0'; -*newExp = *e; -newExp->prev = (((void *)0)); -newExp->next = (((void *)0)); -newExp->expType = (((void *)0)); -PrintTypeNoConst(e->expType, typeString, 0, 1); -decl = SpecDeclFromString(typeString, specs, (((void *)0))); -newExp->destType = ProcessType(specs, decl); -curContext = context; -if(curCompound) +if(enumClass) { -char name[100]; -struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList(); +for(; _class && _class->type == 4; _class = _class->base) +{ +struct __ecereNameSpace__ecere__sys__NamedLink64 * value; +struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); -e->type = 23; -sprintf(name, "__internalValue%03X", internalValueCounter++); -if(!curCompound->__anon1.compound.declarations) -curCompound->__anon1.compound.declarations = MkList(); -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0)))))); -ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp)))); -ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name))))); -e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts); +for(value = e->values.first; value; value = value->next) +{ +if(!strcmp(value->name, id->string)) +break; } -else -printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n"); +if(value) { -struct Type * type = e->destType; - -e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(e->destType, type); -e->destType->refCount = 1; -e->destType->classObjectType = 0; -FreeType(type); +FreeType(sourceExp->expType); +sourceExp->isConstant = 1; +sourceExp->expType = MkClassType(_class->fullName); +if(inCompiler || inPreCompiler || inDebugger) +{ +FreeExpContents(sourceExp); +sourceExp->type = 2; +if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char"))) +sourceExp->__anon1.__anon1.constant = PrintInt64(value->data); +else +sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data); } -e->__anon1.compound->__anon1.compound.context = context; -PopContext(context); -curContext = context->parent; +FreeType(dest); +return 1; } } -checkedExp = e; -while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11) -{ -if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) -{ -if(checkedExp->type == 23) -{ -checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; } -else -checkedExp = (*checkedExp->__anon1.list).last; } -else if(checkedExp->type == 11) -checkedExp = checkedExp->__anon1.cast.exp; } +if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions)) { -struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); - -*operand = *checkedExp; -__ecereMethod_Expression_Clear(checkedExp); -checkedExp->destType = ProcessTypeString("void *", 0); -checkedExp->expType = checkedExp->destType; -checkedExp->destType->refCount++; -checkedExp->type = 4; -checkedExp->__anon1.op.op = '&'; -checkedExp->__anon1.op.exp1 = (((void *)0)); -checkedExp->__anon1.op.exp2 = operand; -} -} -} +FreeType(dest); +return 1; } } +FreeType(dest); } -{ +return 0; } -if((!destType || destType->kind == 14 || destType->kind == 0) && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && (e->expType->byReference || (e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3)))) + +static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset) { -if(e->expType->classObjectType && destType && destType->classObjectType) +struct __ecereNameSpace__ecere__com__DataMember * dataMember; + +for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next) { -return ; -} +if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1)) +PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset); else { -struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp)); +struct Type * type; +void * ptr = inst->data + dataMember->offset + offset; +char * result = (((void *)0)); -*thisExp = *e; -thisExp->prev = (((void *)0)); -thisExp->next = (((void *)0)); -__ecereMethod_Expression_Clear(e); -e->type = 5; -e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp)))); -if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5) -((struct Expression *)(*e->__anon1.list).first)->byReference = 1; -{ -e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(e->expType, thisExp->expType); -e->expType->byReference = 0; -e->expType->refCount = 1; -if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3)) -{ -e->expType->classObjectType = 0; -} -} -} -} -else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0) -{ -if(destType->kind == 14) +exp->loc = member->loc = inst->loc; +((struct Identifier *)(*member->identifiers).first)->loc = inst->loc; +if(!dataMember->dataType) +dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +type = dataMember->dataType; +if(type->kind == 8) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0)))); -} -else if(!(destType->truth && e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && e->expType->__anon1._class->__anon1.registered->type == 1)) +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; + +if(_class->type == 4) { -unsigned int byReference = e->expType->byReference; -struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -struct Declarator * decl; -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); -char typeString[1024]; -struct Type * type; -int backupClassObjectType; -unsigned int backupByReference; +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); -if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class")) -type = e->expType; -else -type = destType; -backupClassObjectType = type->classObjectType; -backupByReference = type->byReference; -type->classObjectType = 0; -type->byReference = 0; -typeString[0] = '\0'; -PrintType(type, typeString, 0, 1); -decl = SpecDeclFromString(typeString, specs, (((void *)0))); -type->classObjectType = backupClassObjectType; -type->byReference = backupByReference; -*thisExp = *e; -thisExp->prev = (((void *)0)); -thisExp->next = (((void *)0)); -__ecereMethod_Expression_Clear(e); -if((type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 1000 || type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 4 || type->__anon1._class->__anon1.registered->type == 3)) || (type->kind != 13 && type->kind != 22 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13))) +if(enumClass) { -unsigned int passAsTemplate = thisExp->destType->passAsTemplate; -struct Type * t; +struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); +struct __ecereNameSpace__ecere__sys__NamedLink64 * item; -destType->refCount++; -e->type = 4; -e->__anon1.op.op = '*'; -e->__anon1.op.exp1 = (((void *)0)); -e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp); -t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(t, thisExp->destType); -t->passAsTemplate = 0; -FreeType(thisExp->destType); -thisExp->destType = t; -t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(t, destType); -t->passAsTemplate = passAsTemplate; -FreeType(destType); -destType = t; -destType->refCount = 0; -e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(e->expType, type); -if(type->passAsTemplate) +for(item = e->values.first; item; item = item->next) { -e->expType->classObjectType = 0; -e->expType->passAsTemplate = 0; +if(item->data == GetEnumValue(_class, ptr)) +{ +result = item->name; +break; } -e->expType->byReference = 0; -e->expType->refCount = 1; } -else +if(result) { -e->type = 11; -e->__anon1.cast.typeName = MkTypeName(specs, decl); -e->__anon1.cast.exp = thisExp; -e->byReference = 1; -e->expType = type; -type->refCount++; -} -if(e->destType) -FreeType(e->destType); -e->destType = destType; -destType->refCount++; +exp->__anon1.__anon1.identifier = MkIdentifier(result); +exp->type = 0; +exp->destType = MkClassType(_class->fullName); +ProcessExpressionType(exp); } } } - -void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module) +if(_class->type == 4 || _class->type == 3 || _class->type == 2) { -struct __ecereNameSpace__ecere__com__Class * _class; -struct __ecereNameSpace__ecere__sys__OldLink * subModule; - -for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next) -ComputeModuleClasses(subModule->data); -for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next) -ComputeClassMembers(_class, 0); +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +type = _class->dataType; } - -int ComputeTypeSize(struct Type * type) -{ -unsigned int size = type ? type->size : 0; - -if(!size && type && !type->computing) +} +if(!result) { -type->computing = 1; switch(type->kind) { -case 24: -type->alignment = size = sizeof(char); +case 6: +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr); +exp->type = 2; break; -case 1: -type->alignment = size = sizeof(char); +} +case 7: +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr); +exp->type = 2; break; +} case 3: -type->alignment = size = sizeof(int); +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr); +exp->type = 2; break; +} case 4: -type->alignment = size = sizeof(long long); +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr); +exp->type = 2; break; +} case 22: -type->alignment = size = targetBits / 8; -type->pointerAlignment = 1; +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr); +exp->type = 2; break; +} case 23: -type->alignment = size = targetBits / 8; -type->pointerAlignment = 1; -break; -case 5: -type->alignment = size = sizeof(long); -break; -case 2: -type->alignment = size = sizeof(short); -break; -case 6: -type->alignment = size = sizeof(float); -break; -case 7: -type->alignment = size = sizeof(double); -break; -case 8: -{ -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)); - -if(_class && _class->type == 1) { -ComputeClassMembers(_class, 0); -type->alignment = _class->structAlignment; -type->pointerAlignment = (unsigned int)_class->pointerAlignment; -size = _class->structSize; -if(type->alignment && size % type->alignment) -size += type->alignment - (size % type->alignment); +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr); +exp->type = 2; +break; } -else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2)) -{ -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -size = type->alignment = ComputeTypeSize(_class->dataType); +default: +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0)))); } -else -{ -size = type->alignment = targetBits / 8; -type->pointerAlignment = 1; } -break; +ListAdd(memberList, member); } -case 13: -case 19: -size = type->alignment = targetBits / 8; -type->pointerAlignment = 1; +if(parentDataMember->type == 1) break; -case 12: -if(type->__anon1.__anon4.arraySizeExp) +} +} + +void CheckTemplateTypes(struct Expression * exp) { -ProcessExpressionType(type->__anon1.__anon4.arraySizeExp); -ComputeExpression(type->__anon1.__anon4.arraySizeExp); -if(!type->__anon1.__anon4.arraySizeExp->isConstant || (type->__anon1.__anon4.arraySizeExp->expType->kind != 3 && type->__anon1.__anon4.arraySizeExp->expType->kind != 2 && type->__anon1.__anon4.arraySizeExp->expType->kind != 1 && type->__anon1.__anon4.arraySizeExp->expType->kind != 5 && type->__anon1.__anon4.arraySizeExp->expType->kind != 4 && type->__anon1.__anon4.arraySizeExp->expType->kind != 23 && type->__anon1.__anon4.arraySizeExp->expType->kind != 22 && type->__anon1.__anon4.arraySizeExp->expType->kind != 15 && (type->__anon1.__anon4.arraySizeExp->expType->kind != 8 || !type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered || type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered->type != 4))) +struct Expression * nbExp = GetNonBracketsExp(exp); + +if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11)) { -struct Location oldLoc = yylloc; -char expression[10240]; +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct Context * context; +int kind = exp->expType->kind; -expression[0] = '\0'; -type->__anon1.__anon4.arraySizeExp->expType = (((void *)0)); -yylloc = type->__anon1.__anon4.arraySizeExp->loc; -if(inCompiler) -PrintExpression(type->__anon1.__anon4.arraySizeExp, expression); -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression); -yylloc = oldLoc; -} -GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize); -} -else if(type->__anon1.__anon4.enumClass) +*newExp = *exp; +if(exp->destType) +exp->destType->refCount++; +if(exp->expType) +exp->expType->refCount++; +newExp->prev = (((void *)0)); +newExp->next = (((void *)0)); +if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered) { -if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4) +struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered; + +if(c->type == 2 || c->type == 4 || c->type == 3) { -type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize"); +if(!c->dataType) +c->dataType = ProcessTypeString(c->dataTypeString, 0); +kind = c->dataType->kind; } -else -type->__anon1.__anon4.arraySize = 0; } -else +switch(kind) { -type->__anon1.__anon4.arraySize = 0; +case 7: +if(exp->destType->classObjectType) +{ +if(exp->destType) +exp->destType->refCount--; +if(exp->expType) +exp->expType->refCount--; +((newExp ? __extension__ ({ +void * __ecerePtrToDelete = (newExp); + +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), newExp = 0); } -size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize; -if(type->__anon1.type) +else { -type->alignment = type->__anon1.type->alignment; -type->pointerAlignment = type->__anon1.type->pointerAlignment; +struct __ecereNameSpace__ecere__sys__OldList * specs; +struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); +struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); + +context = PushContext(); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0))))); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); +specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); +exp->type = 23; +modifyPassAsTemplate(&exp->expType, 1); +modifyPassAsTemplate(&newExp->destType, 0); +modifyPassAsTemplate(&newExp->expType, 0); +exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp)))); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i"))))); +exp->__anon1.compound->__anon1.compound.context = context; +PopContext(context); } break; -case 9: -{ -if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName) +case 6: +if(exp->destType->classObjectType) { -struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName); +if(exp->destType) +exp->destType->refCount--; +if(exp->expType) +exp->expType->refCount--; +((newExp ? __extension__ ({ +void * __ecerePtrToDelete = (newExp); -if(symbol && symbol->type) -{ -ComputeTypeSize(symbol->type); -size = symbol->type->size; -} +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), newExp = 0); } else { -struct Type * member; - -for(member = type->__anon1.__anon1.members.first; member; member = member->next) -{ -int __simpleStruct0, __simpleStruct1; -unsigned int addSize = ComputeTypeSize(member); +struct __ecereNameSpace__ecere__sys__OldList * specs; +struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); +struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); -member->offset = size; -if(member->alignment && size % member->alignment) -member->offset += member->alignment - (size % member->alignment); -size = member->offset; -if(member->pointerAlignment && type->size <= 4) -type->pointerAlignment = 1; -else if(!member->pointerAlignment && member->alignment >= 8) -type->pointerAlignment = 0; -type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1); -size += addSize; -} -if(type->alignment && size % type->alignment) -size += type->alignment - (size % type->alignment); +context = PushContext(); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), (((void *)0))))); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); +specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); +exp->type = 23; +exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); +modifyPassAsTemplate(&exp->expType, 1); +modifyPassAsTemplate(&newExp->destType, 0); +modifyPassAsTemplate(&newExp->expType, 0); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f")), '=', newExp)))); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i"))))); +exp->__anon1.compound->__anon1.compound.context = context; +PopContext(context); } break; +case 0: +break; +default: +exp->type = 11; +exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))); +if((exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1) || __ecereProp_Type_Get_isPointerType(exp->expType)) +exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp))); +else +exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); +exp->needCast = 1; +break; } -case 10: +} +else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate) { -if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName) +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct Context * context; +int kind = exp->expType->kind; + +*newExp = *exp; +if(exp->destType) +exp->destType->refCount++; +if(exp->expType) +exp->expType->refCount++; +newExp->prev = (((void *)0)); +newExp->next = (((void *)0)); +if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered) { -struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName); +struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered; -if(symbol && symbol->type) +if(c->type == 2 || c->type == 4 || c->type == 3) { -ComputeTypeSize(symbol->type); -size = symbol->type->size; -type->alignment = symbol->type->alignment; +if(!c->dataType) +c->dataType = ProcessTypeString(c->dataTypeString, 0); +kind = c->dataType->kind; } } -else +switch(kind) { -struct Type * member; - -for(member = type->__anon1.__anon1.members.first; member; member = member->next) +case 7: +if(exp->destType->classObjectType) { -int __simpleStruct0, __simpleStruct1; -unsigned int addSize = ComputeTypeSize(member); +if(exp->destType) +exp->destType->refCount--; +if(exp->expType) +exp->expType->refCount--; +((newExp ? __extension__ ({ +void * __ecerePtrToDelete = (newExp); -member->offset = size; -if(member->alignment && size % member->alignment) -member->offset += member->alignment - (size % member->alignment); -size = member->offset; -if(member->pointerAlignment && type->size <= 4) -type->pointerAlignment = 1; -else if(!member->pointerAlignment && member->alignment >= 8) -type->pointerAlignment = 0; -type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1); -size = ((size > addSize) ? size : addSize); +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), newExp = 0); } -if(type->alignment && size % type->alignment) -size += type->alignment - (size % type->alignment); +else +{ +struct __ecereNameSpace__ecere__sys__OldList * specs; +struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); +struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); + +context = PushContext(); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0))))); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); +specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); +exp->type = 23; +exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); +modifyPassAsTemplate(&exp->expType, 0); +modifyPassAsTemplate(&newExp->destType, 1); +modifyPassAsTemplate(&newExp->expType, 1); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp)))); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d"))))); +exp->__anon1.compound->__anon1.compound.context = context; +PopContext(context); } break; -} -case 20: +case 6: +if(exp->destType->classObjectType) { -struct TemplateParameter * param = type->__anon1.templateParameter; -struct Type * baseType = ProcessTemplateParameterType(param); +if(exp->destType) +exp->destType->refCount--; +if(exp->expType) +exp->expType->refCount--; +((newExp ? __extension__ ({ +void * __ecerePtrToDelete = (newExp); -if(baseType) -{ -size = ComputeTypeSize(baseType); -type->alignment = baseType->alignment; -type->pointerAlignment = baseType->pointerAlignment; +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), newExp = 0); } else -type->alignment = size = sizeof(uint64); -break; +{ +struct __ecereNameSpace__ecere__sys__OldList * specs; +struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList(); +struct __ecereNameSpace__ecere__sys__OldList * statements = MkList(); + +context = PushContext(); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), (((void *)0))))); +ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0))))); +specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs)); +exp->type = 23; +exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements); +modifyPassAsTemplate(&exp->expType, 0); +modifyPassAsTemplate(&newExp->destType, 1); +modifyPassAsTemplate(&newExp->expType, 1); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp)))); +ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f"))))); +exp->__anon1.compound->__anon1.compound.context = context; +PopContext(context); } -case 15: +break; +case 8: { -type->alignment = size = sizeof(enum +if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1) { -test -}); +exp->type = 5; +newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp); +exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp))); +ProcessExpressionType((*exp->__anon1.list).first); break; } -case 21: +else { -type->alignment = size = targetBits / 8; -type->pointerAlignment = 1; -break; -} +exp->type = 5; +if(__ecereProp_Type_Get_isPointerType(exp->expType)) +{ +exp->needTemplateCast = 2; +newExp->needCast = 1; +newExp->needTemplateCast = 2; +newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp); } -type->size = size; -type->computing = 0; +exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp)); +exp->needTemplateCast = 2; +newExp->needCast = 1; +newExp->needTemplateCast = 2; +ProcessExpressionType((*exp->__anon1.list).first); +break; } -return size; } - -struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl) +default: { -struct External * external = (((void *)0)); -struct Symbol * classSym = FindClass(name); -struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0)); - -if(!inCompiler || !classSym) -return (((void *)0)); -if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4)) -return (((void *)0)); -if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base)) -_DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl); -external = classSym->__anon2.__anon1.structExternal; -if(external && external->__anon1.declaration) +if(exp->expType->kind == 20) { -struct Specifier * spec; +struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter); -for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next) -if(spec->type == 3 || spec->type == 4) +if(type) { -curDeclarations = spec->__anon1.__anon2.definitions; +FreeType(exp->destType); +FreeType(exp->expType); +((newExp ? __extension__ ({ +void * __ecerePtrToDelete = (newExp); + +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), newExp = 0); break; } } -if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations))) { -struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators; -struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0)); -char structName[1024]; -unsigned int addedPadding = 0; -struct Specifier * curSpec = (((void *)0)); +char typeString[1024]; +struct Declarator * decl; +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); -classSym->declaring++; -if(strchr(classSym->string, '<')) -{ -if(classSym->__anon1.registered->templateClass) -external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl); -classSym->declaring--; -return external; +typeString[0] = '\0'; +PrintType(exp->expType, typeString, 0, 0); +decl = SpecDeclFromString(typeString, specs, (((void *)0))); +exp->type = 11; +exp->__anon1.cast.typeName = MkTypeName(specs, decl); +exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); +exp->__anon1.cast.exp->needCast = 1; +exp->needTemplateCast = 2; +newExp->needTemplateCast = 2; +} +break; +} +} +} } -structName[0] = 0; -FullClassNameCat(structName, name, 0); -classSym->declaredStructSym = 1; -if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations)) -{ -unsigned int add = 0; -if(!external) +static void ProcessInitializer(struct Initializer * init, struct Type * type) { -external = MkExternalDeclaration((((void *)0))); -classSym->__anon2.__anon1.structExternal = external; -external->symbol = classSym; -add = 1; -} -if(!skipNoHead) +switch(init->type) { -declarations = MkList(); -AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding); -} -if(external->__anon1.declaration) +case 0: +if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8) { -struct Specifier * spec; - -for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next) -if(spec->type == 3 || spec->type == 4) +if(init->__anon1.exp && !init->__anon1.exp->destType) { -curSpec = spec; -curDeclarations = spec->__anon1.__anon2.definitions; -break; -} +FreeType(init->__anon1.exp->destType); +init->__anon1.exp->destType = type; +if(type) +type->refCount++; } -if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding))) +if(init->__anon1.exp) { -FreeList(declarations, (void *)(FreeClassDef)); -declarations = (((void *)0)); +ProcessExpressionType(init->__anon1.exp); +init->isConstant = init->__anon1.exp->isConstant; } -if(classSym->__anon1.registered->type != 5 && !declarations) -{ -FreeExternal(external); -external = (((void *)0)); -classSym->__anon2.__anon1.structExternal = (((void *)0)); +break; } else { -if(curSpec) -curSpec->__anon1.__anon2.definitions = declarations; -else +struct Expression * exp = init->__anon1.exp; +struct Instantiation * inst = exp->__anon1.instance; +struct MembersInit * members; + +init->type = 1; +init->__anon1.list = MkList(); +if(inst->members) { -specifiers = MkList(); -declarators = MkList(); -ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations)); -external->__anon1.declaration = MkDeclaration(specifiers, declarators); -} -if(add) -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external); -} -} -classSym->declaring--; -} -else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal) +for(members = (*inst->members).first; members; members = members->next) { -classSym->declaredStructSym = 1; -if(classSym->__anon1.registered) -DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0); -if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers) +if(members->type == 0) { -struct Specifier * spec; +struct MemberInit * member; -for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next) +for(member = (*members->__anon1.dataMembers).first; member; member = member->next) { -if(spec->__anon1.__anon2.definitions) -IdentifyAnonStructs(spec->__anon1.__anon2.definitions); +ListAdd(init->__anon1.list, member->initializer); +member->initializer = (((void *)0)); } } } -if(inCompiler && neededBy && (external || !classSym->imported)) -{ -if(!external) -{ -classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0))); -external->symbol = classSym; -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external); } -if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5) -{ -char structName[1024]; -struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators; - -structName[0] = 0; -FullClassNameCat(structName, name, 0); -specifiers = MkList(); -declarators = MkList(); -ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))); -external->__anon1.declaration = MkDeclaration(specifiers, declarators); +FreeExpression(exp); } -if(fwdDecl) +case 1: { -struct External * e = external->fwdDecl ? external->fwdDecl : external; - -if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count) -__ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl); -} -else -__ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference); -} -return external; -} +struct Initializer * i; +struct Type * initializerType = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256]; +int subMemberStackPos = 0; -void ProcessMemberInitData(struct MemberInit * member, struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class ** curClass, struct __ecereNameSpace__ecere__com__DataMember ** curMember, struct __ecereNameSpace__ecere__com__DataMember ** subMemberStack, int * subMemberStackPos) +if(type && type->kind == 12) +initializerType = Dereference(type); +else if(type && (type->kind == 9 || type->kind == 10)) +initializerType = type->__anon1.__anon1.members.first; +for(i = (*init->__anon1.list).first; i; i = i->next) { -struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0)); -unsigned int found = 0; -struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0)); -struct __ecereNameSpace__ecere__com__Method * method = (((void *)0)); -unsigned int freeType = 0; - -yylloc = member->loc; -if(!ident) +if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) { +FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos); if(curMember) { -__ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos); -if(*curMember) -{ -found = 1; -dataMember = *curMember; +if(!curMember->dataType) +curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0); +initializerType = curMember->dataType; } } +ProcessInitializer(i, initializerType); +if(initializerType && type && (type->kind == 9 || type->kind == 10)) +initializerType = initializerType->next; +if(!i->isConstant) +init->isConstant = 0; } -else -{ -struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule); -struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256]; -int _subMemberStackPos = 0; - -if(!thisMember) -thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos); -if(thisMember) -{ -dataMember = thisMember; -if(curMember && thisMember->memberAccess == 1) +if(type && type->kind == 12) +FreeType(initializerType); +if(type && type->kind != 12 && type->kind != 9 && type->kind != 10 && (type->kind != 8 || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type != 1)) { -*curMember = thisMember; -*curClass = thisMember->_class; -memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos); -*subMemberStackPos = _subMemberStackPos; +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0)))); } -found = 1; +break; } -else -{ -method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule); -if(method && method->type == 1) -found = 1; -else -method = (((void *)0)); } } -if(found) -{ -struct Type * type = (((void *)0)); -if(dataMember) +static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst) { -if(!dataMember->dataType && dataMember->dataTypeString) +unsigned int result = 1; + +if(destType) { -struct Context * context = SetupTemplatesContext(_class); +struct __ecereNameSpace__ecere__sys__OldList converts = +{ +0, 0, 0, 0, 0 +}; +struct Conversion * convert; -dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); -FinishTemplatesContext(context); -} -type = dataMember->dataType; -} -else if(method) +if(destType->kind == 0) +return 0; +if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst)) +result = 0; +if(converts.count) { -if(!method->dataType) -ProcessMethodType(method); -type = method->dataType; -} -if(ident && ident->next) +for(convert = converts.first; convert; convert = convert->next) { -for(ident = ident->next; ident && type; ident = ident->next) +unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set); + +if(!empty) { -if(type->kind == 8) +struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +int objectType = exp->expType ? exp->expType->classObjectType : 0; + +*newExp = *exp; +newExp->prev = (((void *)0)); +newExp->next = (((void *)0)); +newExp->destType = (((void *)0)); +if(convert->isGet) { -dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule); -if(!dataMember) -dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0))); -if(dataMember) -type = dataMember->dataType; +exp->type = 8; +exp->addedThis = 1; +exp->__anon1.member.exp = newExp; +FreeType(exp->__anon1.member.exp->expType); +exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName); +exp->__anon1.member.exp->expType->classObjectType = objectType; +exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString); +exp->__anon1.member.memberType = 1; +exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType; +exp->needCast = 1; +if(exp->expType) +exp->expType->refCount++; +ApplyAnyObjectLogic(exp->__anon1.member.exp); } -else if(type->kind == 9 || type->kind == 10) +else { -struct Type * memberType; - -for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next) { -if(!strcmp(memberType->name, ident->string)) +exp->type = 8; +exp->addedThis = 1; +exp->__anon1.member.exp = newExp; +if(newExp->expType && newExp->expType->kind == 8 && newExp->expType->__anon1._class && newExp->expType->__anon1._class->__anon1.registered && newExp->expType->__anon1._class->__anon1.registered->type == 5) { -type = memberType; -break; +newExp->byReference = 1; } +FreeType(exp->__anon1.member.exp->expType); +exp->__anon1.member.exp->expType = (((void *)0)); +if(convert->convert->dataType) +{ +exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType); +exp->__anon1.member.exp->expType->refCount = 1; +exp->__anon1.member.exp->expType->classObjectType = objectType; +ApplyAnyObjectLogic(exp->__anon1.member.exp); } +exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName); +exp->__anon1.member.memberType = 4; +exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName); +exp->needCast = 1; +if(convert->resultType) +convert->resultType->refCount++; } } } -if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs) -{ -int id = 0; -struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * sClass; - -for(sClass = _class; sClass; sClass = sClass->base) -{ -id = 0; -if(sClass->templateClass) -sClass = sClass->templateClass; -for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next) +else { -if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name)) +FreeType(exp->expType); +if(convert->isGet) { -for(sClass = sClass->base; sClass; sClass = sClass->base) +exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType; +if(exp->destType->casted) +exp->needCast = 1; +if(exp->expType) +exp->expType->refCount++; +} +else { -if(sClass->templateClass) -sClass = sClass->templateClass; -id += sClass->templateParams.count; +exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName); +if(exp->destType->casted) +exp->needCast = 1; +if(convert->resultType) +convert->resultType->refCount++; } -break; } -id++; } -if(curParam) -break; +if(exp->isConstant && inCompiler) +ComputeExpression(exp); +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert)); } -if(curParam) -{ -struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id]; - -if(arg.__anon1.__anon1.dataTypeString) -{ -unsigned int constant = type->constant; - -type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0); -if(type->kind == 8 && constant) -type->constant = 1; -else if(type->kind == 13) +if(!result && exp->expType && converts.count) { -struct Type * t = type->__anon1.type; - -while(t->kind == 13) -t = t->__anon1.type; -if(constant) -t->constant = constant; +result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); } -freeType = 1; -if(type && _class->templateClass) -type->passAsTemplate = 1; -if(type) +if(!result && exp->expType && exp->destType) { +if((exp->destType->kind == 8 && exp->expType->kind == 13 && exp->expType->__anon1.type->kind == 8 && exp->expType->__anon1.type->__anon1._class == exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && exp->destType->__anon1._class->__anon1.registered->type == 1) || (exp->expType->kind == 8 && exp->destType->kind == 13 && exp->destType->__anon1.type->kind == 8 && exp->destType->__anon1.type->__anon1._class == exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)) +result = 1; } } +return result; } -} -if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<')) -{ -struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered; -struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0)); -int paramCount = 0; -int lastParam = -1; -char templateString[1024]; -struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param; -sprintf(templateString, "%s<", expClass->templateClass->fullName); -for(cClass = expClass; cClass; cClass = cClass->base) +void PopulateInstance(struct Instantiation * inst) { -int p = 0; +struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol; +struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered; +struct __ecereNameSpace__ecere__com__DataMember * dataMember; +struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList(); -if(cClass->templateClass) -cClass = cClass->templateClass; -for(param = cClass->templateParams.first; param; param = param->next) +if(!inst->members) +inst->members = MkListOne(MkMembersInitList(memberList)); +else +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList)); +for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next) { -int id = p; -struct __ecereNameSpace__ecere__com__Class * sClass; -struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg; - -for(sClass = cClass->base; sClass; sClass = sClass->base) +if(!dataMember->isProperty) { -if(sClass->templateClass) -sClass = sClass->templateClass; -id += sClass->templateParams.count; -} -arg = expClass->templateArgs[id]; -for(sClass = _class; sClass; sClass = sClass->base) +if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1)) +PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset); +else { -struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam; -int p = 0; -struct __ecereNameSpace__ecere__com__Class * nextClass; +struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp)); +struct Type * type; +void * ptr = inst->data + dataMember->offset; +char * result = (((void *)0)); -if(sClass->templateClass) -sClass = sClass->templateClass; -for(nextClass = sClass->base; nextClass; nextClass = nextClass->base) +exp->loc = member->loc = inst->loc; +((struct Identifier *)(*member->identifiers).first)->loc = inst->loc; +if(!dataMember->dataType) +dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +type = dataMember->dataType; +if(type->kind == 8) { -if(nextClass->templateClass) -nextClass = nextClass->templateClass; -p += nextClass->templateParams.count; -} -for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++) +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; + +if(_class->type == 4) { -if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString)) +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); + +if(enumClass) { -if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString))) +struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); +struct __ecereNameSpace__ecere__sys__NamedLink64 * item; + +for(item = e->values.first; item; item = item->next) { -arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString; -arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass; +if(item->data == GetEnumValue(_class, ptr)) +{ +result = item->name; break; } } } +if(result) +{ +exp->__anon1.__anon1.identifier = MkIdentifier(result); +exp->type = 0; +exp->destType = MkClassType(_class->fullName); +ProcessExpressionType(exp); +} } +if(_class->type == 4 || _class->type == 3 || _class->type == 2) { -char argument[256]; - -argument[0] = '\0'; -switch(param->type) +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +type = _class->dataType; +} +} +if(!result) { -case 2: +switch(type->kind) { -char expString[1024]; -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); -struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0))); -struct Expression * exp; -char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64); - -exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string)); -(__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0); -ProcessExpressionType(exp); -ComputeExpression(exp); -expString[0] = '\0'; -PrintExpression(exp, expString); -strcat(argument, expString); -FreeExpression(exp); +case 6: +{ +exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr); +exp->type = 2; break; } -case 1: +case 7: { -strcat(argument, arg.__anon1.__anon2.__anon1.member->name); +exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr); +exp->type = 2; break; } -case 0: +case 3: { -if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString))) -strcat(argument, arg.__anon1.__anon1.dataTypeString); +exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr); +exp->type = 2; break; } -} -if(argument[0]) +case 4: { -if(paramCount) -strcat(templateString, ", "); -if(lastParam != p - 1) +exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr); +exp->type = 2; +break; +} +case 22: { -strcat(templateString, param->name); -strcat(templateString, " = "); +exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr); +exp->type = 2; +break; } -strcat(templateString, argument); -paramCount++; -lastParam = p; +default: +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0)))); } -p++; } +ListAdd(memberList, member); } } -{ -int len = strlen(templateString); - -if(templateString[len - 1] == '<') -len--; -else -{ -if(templateString[len - 1] == '>') -templateString[len++] = ' '; -templateString[len++] = '>'; } -templateString[len++] = '\0'; } + +void ProcessMemberInitData(struct MemberInit * member, struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class ** curClass, struct __ecereNameSpace__ecere__com__DataMember ** curMember, struct __ecereNameSpace__ecere__com__DataMember ** subMemberStack, int * subMemberStackPos) { -struct Context * context = SetupTemplatesContext(_class); +struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0)); +unsigned int found = 0; +struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0)); +struct __ecereNameSpace__ecere__com__Method * method = (((void *)0)); +unsigned int freeType = 0; -if(freeType) -FreeType(type); -type = ProcessTypeString(templateString, 0); -freeType = 1; -FinishTemplatesContext(context); -} -} -if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp) +yylloc = member->loc; +if(!ident) { -ProcessExpressionType(member->initializer->__anon1.exp); -if(!member->initializer->__anon1.exp->expType) +if(curMember) { -if(inCompiler) +__ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos); +if(*curMember) { -char expString[10240]; - -expString[0] = '\0'; -PrintExpression(member->initializer->__anon1.exp, expString); -__ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' '); -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString); +found = 1; +dataMember = *curMember; } } -else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1)) +} +else { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string); +struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule); +struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256]; +int _subMemberStackPos = 0; + +if(!thisMember) +thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos); +if(thisMember) +{ +dataMember = thisMember; +if(curMember && thisMember->memberAccess == 1) +{ +*curMember = thisMember; +*curClass = thisMember->_class; +memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos); +*subMemberStackPos = _subMemberStackPos; } +found = 1; } -else if(member->initializer) +else { -ProcessInitializer(member->initializer, type); +method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule); +if(method && method->type == 1) +found = 1; +else +method = (((void *)0)); } -if(freeType) -FreeType(type); } -else +if(found) { -if(_class && _class->type == 3) +struct Type * type = (((void *)0)); + +if(dataMember) { -if(member->initializer) +if(!dataMember->dataType && dataMember->dataTypeString) { -struct Type * type = MkClassType(_class->fullName); +struct Context * context = SetupTemplatesContext(_class); -ProcessInitializer(member->initializer, type); -FreeType(type); +dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +FinishTemplatesContext(context); } +type = dataMember->dataType; } -else -{ -if(member->initializer) +else if(method) { -ProcessInitializer(member->initializer, (((void *)0))); +if(!method->dataType) +ProcessMethodType(method); +type = method->dataType; } -if(ident) +if(ident && ident->next) { -if(method) +for(ident = ident->next; ident && type; ident = ident->next) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName); +if(type->kind == 8) +{ +dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule); +if(!dataMember) +dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0))); +if(dataMember) +type = dataMember->dataType; } -else if(_class) +else if(type->kind == 9 || type->kind == 10) { -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName); -if(inCompiler) -__ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1); +struct Type * memberType; + +for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next) +{ +if(!strcmp(memberType->name, ident->string)) +{ +type = memberType; +break; } } -else if(_class) -Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName); } } } - -unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions) +if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs) { -struct __ecereNameSpace__ecere__com__BTNamedLink * link; +int id = 0; +struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * sClass; -for(link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->classes); link; link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)link))) +for(sClass = _class; sClass; sClass = sClass->base) { -struct __ecereNameSpace__ecere__com__Class * _class = link->data; - -if(_class->type == 4) +id = 0; +if(sClass->templateClass) +sClass = sClass->templateClass; +for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next) { -struct __ecereNameSpace__ecere__sys__OldList converts = +if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name)) { -0, 0, 0, 0, 0 -}; -struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); - -type->kind = 8; -if(!_class->symbol) -_class->symbol = FindClass(_class->fullName); -type->__anon1._class = _class->symbol; -if(MatchTypes(type, dest, &converts, (((void *)0)), (((void *)0)), dest->kind != 8 || !dest->__anon1._class || strcmp(dest->__anon1._class->string, "bool"), 0, 0, 0, 0)) +for(sClass = sClass->base; sClass; sClass = sClass->base) { -struct __ecereNameSpace__ecere__sys__NamedLink64 * value; -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); - -if(enumClass) +if(sClass->templateClass) +sClass = sClass->templateClass; +id += sClass->templateParams.count; +} +break; +} +id++; +} +if(curParam) +break; +} +if(curParam) { -struct __ecereNameSpace__ecere__com__Class * baseClass; +struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id]; -for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base) +if(arg.__anon1.__anon1.dataTypeString) { -struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0))); +unsigned int constant = type->constant; -for(value = e->values.first; value; value = value->next) +type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0); +if(type->kind == 8 && constant) +type->constant = 1; +else if(type->kind == 13) { -if(!strcmp(value->name, string)) -break; +struct Type * t = type->__anon1.type; + +while(t->kind == 13) +t = t->__anon1.type; +if(constant) +t->constant = constant; } -if(value) +freeType = 1; +if(type && _class->templateClass) +type->passAsTemplate = 1; +if(type) { -FreeType(sourceExp->expType); -sourceExp->isConstant = 1; -sourceExp->expType = MkClassType(baseClass->fullName); -if(inCompiler || inPreCompiler || inDebugger) +} +} +} +} +if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<')) { -char constant[256]; +struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0)); +int paramCount = 0; +int lastParam = -1; +char templateString[1024]; +struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param; -FreeExpContents(sourceExp); -sourceExp->type = 2; -if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char")) -sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data); -else -sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data); -sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant); -} -while(converts.first) +sprintf(templateString, "%s<", expClass->templateClass->fullName); +for(cClass = expClass; cClass; cClass = cClass->base) { -struct Conversion * convert = converts.first; - -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert); -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert); -} -((type ? __extension__ ({ -void * __ecerePtrToDelete = (type); - -__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), type = 0); -return 1; -} -} -} -} -if(converts.first) -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert)); -((type ? __extension__ ({ -void * __ecerePtrToDelete = (type); - -__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), type = 0); -} -} -for(nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->nameSpaces); nameSpace != (((void *)0)); nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)nameSpace))) -if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions)) -return 1; -return 0; -} +int p = 0; -void ComputeExpression(struct Expression * exp) +if(cClass->templateClass) +cClass = cClass->templateClass; +for(param = cClass->templateParams.first; param; param = param->next) { -switch(exp->type) +int id = p; +struct __ecereNameSpace__ecere__com__Class * sClass; +struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg; + +for(sClass = cClass->base; sClass; sClass = sClass->base) { -case 0: +if(sClass->templateClass) +sClass = sClass->templateClass; +id += sClass->templateParams.count; +} +arg = expClass->templateArgs[id]; +for(sClass = _class; sClass; sClass = sClass->base) { -struct Identifier * id = exp->__anon1.__anon1.identifier; +struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam; +int p = 0; +struct __ecereNameSpace__ecere__com__Class * nextClass; -if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger) +if(sClass->templateClass) +sClass = sClass->templateClass; +for(nextClass = sClass->base; nextClass; nextClass = nextClass->base) { -struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0)); - -if(c && c->type == 4) +if(nextClass->templateClass) +nextClass = nextClass->templateClass; +p += nextClass->templateParams.count; +} +for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++) { -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); - -if(enumClass) +if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString)) { -struct __ecereNameSpace__ecere__sys__NamedLink64 * value; -struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0))); - -for(value = e->values.first; value; value = value->next) +if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString))) { -if(!strcmp(value->name, id->string)) +arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString; +arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass; break; } -if(value) -{ -const char * dts = c->dataTypeString; - -FreeExpContents(exp); -exp->type = 2; -exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data); -} } } } +{ +char argument[256]; + +argument[0] = '\0'; +switch(param->type) +{ +case 2: +{ +char expString[1024]; +struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); +struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0))); +struct Expression * exp; +char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64); + +exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string)); +(__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0); +ProcessExpressionType(exp); +ComputeExpression(exp); +expString[0] = '\0'; +PrintExpression(exp, expString); +strcat(argument, expString); +FreeExpression(exp); break; } case 1: { -ComputeInstantiation(exp); +strcat(argument, arg.__anon1.__anon2.__anon1.member->name); break; } -case 4: +case 0: { -struct Expression * exp1, * exp2 = (((void *)0)); -struct Operand op1 = +if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString))) +strcat(argument, arg.__anon1.__anon1.dataTypeString); +break; +} +} +if(argument[0]) { -0, 0, 0, -.__anon1 = { -.c = 0 -}, +if(paramCount) +strcat(templateString, ", "); +if(lastParam != p - 1) { -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +strcat(templateString, param->name); +strcat(templateString, " = "); +} +strcat(templateString, argument); +paramCount++; +lastParam = p; +} +p++; +} +} } -}; -struct Operand op2 = { -0, 0, 0, -.__anon1 = { -.c = 0 -}, +int len = strlen(templateString); + +if(templateString[len - 1] == '<') +len--; +else { -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +if(templateString[len - 1] == '>') +templateString[len++] = ' '; +templateString[len++] = '>'; +} +templateString[len++] = '\0'; } -}; - -if(exp->__anon1.op.exp2) { -struct Expression * e = exp->__anon1.op.exp2; +struct Context * context = SetupTemplatesContext(_class); -while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list) +if(freeType) +FreeType(type); +type = ProcessTypeString(templateString, 0); +freeType = 1; +FinishTemplatesContext(context); +} +} +if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp) { -if(e->type == 5 || e->type == 32 || e->type == 23) +ProcessExpressionType(member->initializer->__anon1.exp); +if(!member->initializer->__anon1.exp->expType) { -if(e->type == 23) -e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; -else -e = (*e->__anon1.list).last; +if(inCompiler) +{ +char expString[10240]; + +expString[0] = '\0'; +PrintExpression(member->initializer->__anon1.exp, expString); +__ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' '); +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString); } } -if(exp->__anon1.op.op == 261 && e && e->expType) +else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1)) { -if(e->type == 3 && e->__anon1.__anon2.string) +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string); +} +} +else if(member->initializer) { -char * string = e->__anon1.__anon2.string; -int len = strlen(string); -char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1)); - -len = UnescapeString(tmp, string + 1, len - 2); -(__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0); -FreeExpContents(exp); -exp->type = 2; -exp->__anon1.__anon1.constant = PrintUInt(len + 1); +ProcessInitializer(member->initializer, type); +} +if(freeType) +FreeType(type); } else { -struct Type * type = e->expType; +if(_class && _class->type == 3) +{ +if(member->initializer) +{ +struct Type * type = MkClassType(_class->fullName); -type->refCount++; -FreeExpContents(exp); -exp->type = 2; -exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type)); +ProcessInitializer(member->initializer, type); FreeType(type); } -break; } else -ComputeExpression(exp->__anon1.op.exp2); -} -if(exp->__anon1.op.exp1) { -ComputeExpression(exp->__anon1.op.exp1); -exp1 = exp->__anon1.op.exp1; -exp2 = exp->__anon1.op.exp2; -op1 = GetOperand(exp1); -if(op1.type) -op1.type->refCount++; -if(exp2) +if(member->initializer) { -op2 = GetOperand(exp2); -if(op2.type) -op2.type->refCount++; +ProcessInitializer(member->initializer, (((void *)0))); } +if(ident) +{ +if(method) +{ +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName); } -else +else if(_class) { -exp1 = exp->__anon1.op.exp2; -op1 = GetOperand(exp1); -if(op1.type) -op1.type->refCount++; +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName); +if(inCompiler) +__ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1); } -CallOperator(exp, exp1, exp2, &op1, &op2); -if(op1.type) -FreeType(op1.type); -if(op2.type) -FreeType(op2.type); -break; } -case 5: -case 32: +else if(_class) +Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName); +} +} +} + +void ComputeInstantiation(struct Expression * exp) { -struct Expression * e, * n; +struct Instantiation * inst = exp->__anon1.instance; +struct MembersInit * members; +struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256]; +int subMemberStackPos = 0; +uint64 bits = 0; -for(e = (*exp->__anon1.list).first; e; e = n) +if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5)) { -n = e->next; -if(!n) +if(inst->data) +return ; +if(_class->type == 0 || _class->type == 5) { -struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list; -struct Expression * prev = exp->prev; -struct Expression * next = exp->next; +inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class); +if(_class->type == 0) +((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++; +} +else +inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +} +if(inst->members) +{ +for(members = (*inst->members).first; members; members = members->next) +{ +switch(members->type) +{ +case 0: +{ +if(members->__anon1.dataMembers) +{ +struct MemberInit * member; -if(exp->expType && exp->expType->kind == 8 && (!e->expType || e->expType->kind != 8)) +for(member = (*members->__anon1.dataMembers).first; member; member = member->next) { -FreeType(e->expType); -e->expType = exp->expType; -e->expType->refCount++; -} -ComputeExpression(e); -FreeType(exp->expType); -FreeType(exp->destType); -*exp = *e; -exp->prev = prev; -exp->next = next; -((e ? __extension__ ({ -void * __ecerePtrToDelete = (e); +struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0)); +unsigned int found = 0; +struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0)); +unsigned int dataMemberOffset; -__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), e = 0); -(__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0); -} +if(!ident) +{ +__ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos); +if(curMember) +{ +if(curMember->isProperty) +prop = (struct __ecereNameSpace__ecere__com__Property *)curMember; else { -FreeExpression(e); +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 = 1; } -break; } -case 8: +else { -struct Expression * memberExp = exp->__anon1.member.exp; -struct Identifier * memberID = exp->__anon1.member.member; -struct Type * type; - -ComputeExpression(exp->__anon1.member.exp); -type = exp->__anon1.member.exp->expType; -if(type) +prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule); +if(prop) { -struct __ecereNameSpace__ecere__com__Class * _class = (exp->__anon1.member.member && exp->__anon1.member.member->classSym) ? exp->__anon1.member.member->classSym->__anon1.registered : (((type->kind == 8 || type->kind == 19) && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0))); -struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0)); -struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0)); -struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0)); - -if(type->kind == 19 && exp->__anon1.member.exp->type == 24) -_class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class"); -if(!_class) +found = 1; +if(prop->memberAccess == 1) { -char string[256]; -struct Symbol * classSym; - -string[0] = '\0'; -PrintTypeNoConst(type, string, 0, 1); -classSym = FindClass(string); -_class = classSym ? classSym->__anon1.registered : (((void *)0)); +curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop; +curClass = prop->_class; } -if(exp->__anon1.member.member) +} +else { -prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule); -if(!prop) -member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0))); +struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256]; +int _subMemberStackPos = 0; + +dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos); +if(dataMember) +{ +found = 1; +if(dataMember->memberAccess == 1) +{ +curMember = dataMember; +curClass = dataMember->_class; +memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos); +subMemberStackPos = _subMemberStackPos; } -if(!prop && !member && _class && exp->__anon1.member.member) +} +} +} +if(found && member->initializer && member->initializer->type == 0) { -struct Symbol * classSym = FindClass(exp->__anon1.member.member->string); +struct Expression * value = member->initializer->__anon1.exp; +struct Type * type = (((void *)0)); +unsigned int deepMember = 0; -convertTo = _class; -_class = classSym ? classSym->__anon1.registered : (((void *)0)); -prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule); +if(prop) +{ +type = prop->dataType; +} +else if(dataMember) +{ +if(!dataMember->dataType) +dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0); +type = dataMember->dataType; } +if(ident && ident->next) +{ +deepMember = 1; +for(ident = ident->next; ident && type; ident = ident->next) +{ +if(type->kind == 8) +{ +prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule); if(prop) +type = prop->dataType; +else { -if(prop->compiled) +dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0))); +if(dataMember) +type = dataMember->dataType; +} +} +else if(type->kind == 9 || type->kind == 10) { -struct Type * type = prop->dataType; +struct Type * memberType; -if(_class->type == 3) +for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next) +{ +if(!strcmp(memberType->name, ident->string)) +{ +type = memberType; +break; +} +} +} +} +} +if(value) +{ +FreeType(value->destType); +value->destType = type; +if(type) +type->refCount++; +ComputeExpression(value); +} +if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5)) { if(type->kind == 8) { struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; -if(_class->type == 3) +if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4)) { if(!_class->dataType) _class->dataType = ProcessTypeString(_class->dataTypeString, 0); type = _class->dataType; } } +if(dataMember) +{ +void * ptr = inst->data + dataMemberOffset; + +if(value->type == 2) +{ switch(type->kind) { +case 3: +{ +GetInt(value, (int *)ptr); +break; +} +case 4: +{ +GetInt64(value, (long long *)ptr); +break; +} +case 22: +{ +GetIntPtr(value, (intptr_t *)ptr); +break; +} +case 23: +{ +GetIntSize(value, (ssize_t *)ptr); +break; +} case 6: { -float value; -float (* Get)(float) = (void *)prop->Get; - -GetFloat(exp->__anon1.member.exp, &value); -exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value); -exp->type = 2; +GetFloat(value, (float *)ptr); break; } case 7: { -double value; -double (* Get)(double); - -GetDouble(exp->__anon1.member.exp, &value); -if(convertTo) -Get = (void *)prop->Set; -else -Get = (void *)prop->Get; -exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value); -exp->type = 2; +GetDouble(value, (double *)ptr); break; } } } -else +else if(value->type == 1) { -if(convertTo) +if(type->kind == 8) { -struct Expression * value = exp->__anon1.member.exp; -struct Type * type; +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; -if(!prop->dataType) -ProcessPropertyType(prop); -type = prop->dataType; -if(!type) +if(_class->type == 1) { -} -else if(_class->type == 1) +ComputeTypeSize(type); +if(value->__anon1.instance->data) +memcpy(ptr, value->__anon1.instance->data, type->size); +} +} +} +} +else if(prop && prop->Set != (void *)(intptr_t)1) { -switch(type->kind) +if(value->type == 1 && value->__anon1.instance->data) { -case 8: +if(type->kind == 8) { -struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; -if(propertyClass->type == 1 && value->type == 1) +if(_class && (_class->type != 0 || __ecereNameSpace__ecere__com__eClass_IsDerived(((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)value->__anon1.instance->data))->_class, _class))) { void (* Set)(void *, void *) = (void *)prop->Set; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -Set(exp->__anon1.instance->data, value->__anon1.instance->data); -PopulateInstance(exp->__anon1.instance); +Set(inst->data, value->__anon1.instance->data); +PopulateInstance(inst); +} +} +} +else if(value->type == 2) +{ +switch(type->kind) +{ +case 7: +{ +void (* Set)(void *, double) = (void *)prop->Set; + +Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0)))); +break; } +case 6: +{ +void (* Set)(void *, float) = (void *)prop->Set; + +Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0))))); break; } case 3: { -int intValue; void (* Set)(void *, int) = (void *)prop->Set; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetInt(value, &intValue); -Set(exp->__anon1.instance->data, intValue); -PopulateInstance(exp->__anon1.instance); +Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0)); break; } case 4: { -long long intValue; void (* Set)(void *, long long) = (void *)prop->Set; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetInt64(value, &intValue); -Set(exp->__anon1.instance->data, intValue); -PopulateInstance(exp->__anon1.instance); +Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); break; } case 22: { -intptr_t intValue; void (* Set)(void *, intptr_t) = (void *)prop->Set; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetIntPtr(value, &intValue); -Set(exp->__anon1.instance->data, intValue); -PopulateInstance(exp->__anon1.instance); +Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); break; } case 23: { -ssize_t intValue; void (* Set)(void *, ssize_t) = (void *)prop->Set; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetIntSize(value, &intValue); -Set(exp->__anon1.instance->data, intValue); -PopulateInstance(exp->__anon1.instance); +Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0)); break; } -case 6: -{ -float floatValue; -void (* Set)(void *, float) = (void *)prop->Set; - -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetFloat(value, &floatValue); -Set(exp->__anon1.instance->data, floatValue); -PopulateInstance(exp->__anon1.instance); -break; } -case 7: +} +else if(value->type == 3) { -double doubleValue; -void (* Set)(void *, double) = (void *)prop->Set; +char temp[1024]; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -GetDouble(value, &doubleValue); -Set(exp->__anon1.instance->data, doubleValue); -PopulateInstance(exp->__anon1.instance); -break; +ReadString(temp, value->__anon1.__anon2.string); +((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp); } } } -else if(_class->type == 2) +else if(!deepMember && type && _class->type == 3) { -switch(type->kind) +if(prop) { -case 8: +if(value->type == 2) { -struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered; +if(type->kind == 8) +{ +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; -if(propertyClass->type == 1 && value->__anon1.instance->data) +if(_class->type == 3) { -unsigned int (* Set)(void *) = (void *)prop->Set; -unsigned int bits = Set(value->__anon1.instance->data); +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +type = _class->dataType; +} +} +switch(type->kind) +{ +case 6: +{ +float fValue; +float (* Set)(float) = (void *)prop->Set; -exp->__anon1.__anon1.constant = PrintHexUInt(bits); +GetFloat(member->initializer->__anon1.exp, &fValue); +exp->__anon1.__anon1.constant = PrintFloat(Set(fValue)); exp->type = 2; break; } -else if(_class->type == 2) +case 7: { -unsigned int value; -unsigned int (* Set)(unsigned int) = (void *)prop->Set; -unsigned int bits; +double dValue; +double (* Set)(double) = (void *)prop->Set; -GetUInt(exp->__anon1.member.exp, &value); -bits = Set(value); -exp->__anon1.__anon1.constant = PrintHexUInt(bits); +GetDouble(member->initializer->__anon1.exp, &dValue); +exp->__anon1.__anon1.constant = PrintDouble(Set(dValue)); exp->type = 2; +break; } } } } } -else +else if(!deepMember && type && _class->type == 2) { -if(_class->type == 2) +if(prop) { -unsigned int value; +if(value->type == 1 && value->__anon1.instance->data) +{ +unsigned int (* Set)(void *) = (void *)prop->Set; -GetUInt(exp->__anon1.member.exp, &value); -switch(type->kind) +bits = Set(value->__anon1.instance->data); +} +else if(value->type == 2) { -case 8: +} +} +else if(dataMember) { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember; +struct Type * type; +uint64 part = 0; -if(_class->type == 1) +bits = (bits & ~bitMember->mask); +if(!bitMember->dataType) +bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0); +type = bitMember->dataType; +if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered) { -void (* Get)(unsigned int, void *) = (void *)prop->Get; - -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -Get(value, exp->__anon1.instance->data); -PopulateInstance(exp->__anon1.instance); +if(!type->__anon1._class->__anon1.registered->dataType) +type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0); +type = type->__anon1._class->__anon1.registered->dataType; } -else if(_class->type == 2) +switch(type->kind) { -unsigned int (* Get)(unsigned int) = (void *)prop->Get; -uint64 bits = Get(value); +case 24: +case 1: +{ +unsigned char v; -exp->__anon1.__anon1.constant = PrintHexUInt64(bits); -exp->type = 2; -} +type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v); +part = (uint64)v; break; } -} -} -else if(_class->type == 1) +case 2: { -unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0)); +unsigned short v; -switch(type->kind) +type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v); +part = (uint64)v; +break; +} +case 3: +case 5: { -case 8: +unsigned int v; + +type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v); +part = (uint64)v; +break; +} +case 4: { -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; +uint64 v; -if(_class->type == 1 && value) +type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v); +part = v; +break; +} +case 22: { -void (* Get)(void *, void *) = (void *)prop->Get; +uintptr_t v; -exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); -exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); -exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); -exp->__anon1.instance->loc = exp->loc; -exp->type = 1; -Get(value, exp->__anon1.instance->data); -PopulateInstance(exp->__anon1.instance); +type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v); +part = (uint64)v; +break; } +case 23: +{ +size_t v; + +type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v); +part = (uint64)v; break; } } -} +bits |= part << bitMember->pos; } } } else { -exp->isConstant = 0; -} -} -else if(member) -{ -} -} -if(exp->type != 8) -{ -FreeExpression(memberExp); -FreeIdentifier(memberID); -} -break; -} -case 10: +if(_class && _class->type == 3) { -struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator); - -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type)); +ComputeExpression(member->initializer->__anon1.exp); +exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant; exp->type = 2; -FreeType(type); -break; +member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0)); } -case 15: -{ -struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol; - -if(classSym && classSym->__anon1.registered) -{ -if(classSym->__anon1.registered->fixed) -{ -FreeSpecifier(exp->__anon1._class); -exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize); -exp->type = 2; } -else -{ -char className[1024]; - -strcpy(className, "__ecereClass_"); -FullClassNameCat(className, classSym->string, 1); -DeclareClass(curExternal, classSym, className); -FreeExpContents(exp); -exp->type = 9; -exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className)); -exp->__anon1.member.member = MkIdentifier("structSize"); } } break; } -case 11: -{ -struct Type * type; -struct Expression * e = exp; - -if(exp->type == 11) -{ -if(exp->__anon1.cast.exp) -ComputeExpression(exp->__anon1.cast.exp); -e = exp->__anon1.cast.exp; } -if(e && exp->expType) -{ -type = exp->expType; -if(type->kind == 8) -{ -struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; - -if(_class && (_class->type == 3 || _class->type == 2)) -{ -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -type = _class->dataType; } } -switch(type->kind) -{ -case 24: -case 1: -if(type->isSigned) -{ -char value = 0; - -if(GetChar(e, &value)) +if(_class && _class->type == 2) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintChar(value); +exp->__anon1.__anon1.constant = PrintHexUInt(bits); exp->type = 2; } -} -else -{ -unsigned char value = 0; - -if(GetUChar(e, &value)) +if(exp->type != 1) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUChar(value); -exp->type = 2; +FreeInstance(inst); } } -break; -case 2: -if(type->isSigned) -{ -short value = 0; -if(GetShort(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintShort(value); -exp->type = 2; -} -} -else +void ComputeExpression(struct Expression * exp) { -unsigned short value = 0; - -if(GetUShort(e, &value)) +switch(exp->type) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUShort(value); -exp->type = 2; -} -} -break; -case 3: -if(type->isSigned) +case 0: { -int value = 0; +struct Identifier * id = exp->__anon1.__anon1.identifier; -if(GetInt(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt(value); -exp->type = 2; -} -} -else +if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger) { -unsigned int value = 0; +struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0)); -if(GetUInt(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUInt(value); -exp->type = 2; -} -} -break; -case 4: -if(type->isSigned) +if(c && c->type == 4) { -long long value = 0; +struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); -if(GetInt64(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64(value); -exp->type = 2; -} -} -else +if(enumClass) { -uint64 value = 0; +struct __ecereNameSpace__ecere__sys__NamedLink64 * value; +struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0))); -if(GetUInt64(e, &value)) +for(value = e->values.first; value; value = value->next) { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUInt64(value); -exp->type = 2; -} -} +if(!strcmp(value->name, id->string)) break; -case 22: -if(type->isSigned) -{ -intptr_t value = 0; - -if(GetIntPtr(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64((long long)value); -exp->type = 2; -} -} -else -{ -uintptr_t value = 0; - -if(GetUIntPtr(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUInt64((uint64)value); -exp->type = 2; } -} -break; -case 23: -if(type->isSigned) +if(value) { -ssize_t value = 0; +const char * dts = c->dataTypeString; -if(GetIntSize(e, &value)) -{ FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintInt64((long long)value); exp->type = 2; +exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data); } } -else -{ -size_t value = 0; - -if(GetUIntSize(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintUInt64((uint64)value); -exp->type = 2; -} } -break; -case 6: -{ -float value = 0; - -if(GetFloat(e, &value)) -{ -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintFloat(value); -exp->type = 2; } break; } -case 7: -{ -double value = 0; - -if(GetDouble(e, &value)) +case 1: { -FreeExpContents(exp); -exp->__anon1.__anon1.constant = PrintDouble(value); -exp->type = 2; -} -break; -} -} -} +ComputeInstantiation(exp); break; } -case 12: +case 4: { +struct Expression * exp1, * exp2 = (((void *)0)); struct Operand op1 = { 0, 0, 0, @@ -13845,678 +13866,747 @@ struct Operand op2 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -struct Operand op3 = + +if(exp->__anon1.op.exp2) { -0, 0, 0, -.__anon1 = { -.c = 0 -}, +struct Expression * e = exp->__anon1.op.exp2; + +while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list) { -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +if(e->type == 5 || e->type == 32 || e->type == 23) +{ +if(e->type == 23) +e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last; +else +e = (*e->__anon1.list).last; } -}; - -if(exp->__anon1.cond.exp) -ComputeExpression((*exp->__anon1.cond.exp).last); -if(exp->__anon1.cond.elseExp) -ComputeExpression(exp->__anon1.cond.elseExp); -if(exp->__anon1.cond.cond) -ComputeExpression(exp->__anon1.cond.cond); -op1 = GetOperand(exp->__anon1.cond.cond); +} +if(exp->__anon1.op.op == 261 && e && e->expType) +{ +if(e->type == 3 && e->__anon1.__anon2.string) +{ +char * string = e->__anon1.__anon2.string; +int len = strlen(string); +char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1)); + +len = UnescapeString(tmp, string + 1, len - 2); +(__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0); +FreeExpContents(exp); +exp->type = 2; +exp->__anon1.__anon1.constant = PrintUInt(len + 1); +} +else +{ +struct Type * type = e->expType; + +type->refCount++; +FreeExpContents(exp); +exp->type = 2; +exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type)); +FreeType(type); +} +break; +} +else +ComputeExpression(exp->__anon1.op.exp2); +} +if(exp->__anon1.op.exp1) +{ +ComputeExpression(exp->__anon1.op.exp1); +exp1 = exp->__anon1.op.exp1; +exp2 = exp->__anon1.op.exp2; +op1 = GetOperand(exp1); if(op1.type) op1.type->refCount++; -op2 = GetOperand((*exp->__anon1.cond.exp).last); +if(exp2) +{ +op2 = GetOperand(exp2); if(op2.type) op2.type->refCount++; -op3 = GetOperand(exp->__anon1.cond.elseExp); -if(op3.type) -op3.type->refCount++; -if(op1.ops.Cond) +} +} +else { -FreeExpContents(exp); -op1.ops.Cond(exp, &op1, &op2, &op3); +exp1 = exp->__anon1.op.exp2; +op1 = GetOperand(exp1); +if(op1.type) +op1.type->refCount++; } +CallOperator(exp, exp1, exp2, &op1, &op2); if(op1.type) FreeType(op1.type); if(op2.type) FreeType(op2.type); -if(op3.type) -FreeType(op3.type); break; } -} -} +case 5: +case 32: +{ +struct Expression * e, * n; -unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions) +for(e = (*exp->__anon1.list).first; e; e = n) { -struct __ecereNameSpace__ecere__com__Instance * module; +n = e->next; +if(!n) +{ +struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list; +struct Expression * prev = exp->prev; +struct Expression * next = exp->next; -if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, sourceExp, dest, string, conversions)) -return 1; -if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, sourceExp, dest, string, conversions)) -return 1; -if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions)) -return 1; -for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next) +if(exp->expType && exp->expType->kind == 8 && (!e->expType || e->expType->kind != 8)) { -if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions)) -return 1; +FreeType(e->expType); +e->expType = exp->expType; +e->expType->refCount++; } -return 0; +ComputeExpression(e); +FreeType(exp->expType); +FreeType(exp->destType); +*exp = *e; +exp->prev = prev; +exp->next = next; +((e ? __extension__ ({ +void * __ecerePtrToDelete = (e); + +__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); +}) : 0), e = 0); +(__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0); } +else +{ +FreeExpression(e); +} +} +break; +} +case 8: +{ +struct Expression * memberExp = exp->__anon1.member.exp; +struct Identifier * memberID = exp->__anon1.member.member; +struct Type * type; -unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst) +ComputeExpression(exp->__anon1.member.exp); +type = exp->__anon1.member.exp->expType; +if(type) { -struct Type * source; -struct Type * realDest = dest; -struct Type * backupSourceExpType = (((void *)0)); -struct Expression * nbExp = GetNonBracketsExp(sourceExp); -struct Expression * computedExp = nbExp; +struct __ecereNameSpace__ecere__com__Class * _class = (exp->__anon1.member.member && exp->__anon1.member.member->classSym) ? exp->__anon1.member.member->classSym->__anon1.registered : (((type->kind == 8 || type->kind == 19) && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0))); +struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0)); +struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0)); +struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0)); -dest->refCount++; -if(sourceExp->isConstant && sourceExp->type != 2 && sourceExp->type != 0 && sourceExp->type != 11 && dest->kind == 8 && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) +if(type->kind == 19 && exp->__anon1.member.exp->type == 24) +_class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class"); +if(!_class) { -computedExp = CopyExpression(nbExp); -ComputeExpression(computedExp); +char string[256]; +struct Symbol * classSym; + +string[0] = '\0'; +PrintTypeNoConst(type, string, 0, 1); +classSym = FindClass(string); +_class = classSym ? classSym->__anon1.registered : (((void *)0)); } -source = sourceExp->expType; -if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0)) -{ -if(computedExp != nbExp) +if(exp->__anon1.member.member) { -FreeExpression(computedExp); -computedExp = nbExp; +prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule); +if(!prop) +member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0))); } -FreeType(dest); -return 1; +if(!prop && !member && _class && exp->__anon1.member.member) +{ +struct Symbol * classSym = FindClass(exp->__anon1.member.member->string); + +convertTo = _class; +_class = classSym ? classSym->__anon1.registered : (((void *)0)); +prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule); } -if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8) +if(prop) { -if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3) +if(prop->compiled) { -struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase; +struct Type * type = prop->dataType; -for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base) -; -for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base) -; -if(sourceBase == destBase) +if(_class->type == 3) { -if(computedExp != nbExp) +if(type->kind == 8) { -FreeExpression(computedExp); -computedExp = nbExp; -} -FreeType(dest); -return 1; -} +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; + +if(_class->type == 3) +{ +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +type = _class->dataType; } } -if(source) +switch(type->kind) { -struct __ecereNameSpace__ecere__sys__OldList * specs; -unsigned int flag = 0; -long long value = (((int)0x7fffffff)); - -source->refCount++; -if(computedExp->type == 2) +case 6: { -if(source->isSigned) -value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0); -else -value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0); +float value; +float (* Get)(float) = (void *)prop->Get; + +GetFloat(exp->__anon1.member.exp, &value); +exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value); +exp->type = 2; +break; } -else if(computedExp->type == 4 && computedExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2) +case 7: { -if(source->isSigned) -value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0); +double value; +double (* Get)(double); + +GetDouble(exp->__anon1.member.exp, &value); +if(convertTo) +Get = (void *)prop->Set; else -value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0); +Get = (void *)prop->Get; +exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value); +exp->type = 2; +break; } -if(computedExp != nbExp) -{ -FreeExpression(computedExp); -computedExp = nbExp; } -if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar")) +} +else { -FreeType(source); -source = __extension__ ({ -struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); +if(convertTo) +{ +struct Expression * value = exp->__anon1.member.exp; +struct Type * type; -__ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1; -}); +if(!prop->dataType) +ProcessPropertyType(prop); +type = prop->dataType; +if(!type) +{ } -if(dest->kind == 8) +else if(_class->type == 1) { -struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); - -if(_class && _class->type == 3) +switch(type->kind) { -if(source->kind != 8) +case 8: { -struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -struct Type * tempDest, * tempSource; +struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered; -for(; _class->base->type != 1000; _class = _class->base) -; -tempSource = dest; -tempDest = tempType; -tempType->kind = 8; -if(!_class->symbol) -_class->symbol = FindClass(_class->fullName); -tempType->__anon1._class = _class->symbol; -tempType->truth = dest->truth; -if(tempType->__anon1._class) -MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); -backupSourceExpType = sourceExp->expType; -if(dest->passAsTemplate) +if(propertyClass->type == 1 && value->type == 1) { -sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(sourceExp->expType, dest); -sourceExp->expType->passAsTemplate = 0; +void (* Set)(void *, void *) = (void *)prop->Set; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +Set(exp->__anon1.instance->data, value->__anon1.instance->data); +PopulateInstance(exp->__anon1.instance); } -else -{ -sourceExp->expType = dest; -dest->refCount++; +break; } -flag = 1; -((tempType ? __extension__ ({ -void * __ecerePtrToDelete = (tempType); +case 3: +{ +int intValue; +void (* Set)(void *, int) = (void *)prop->Set; -__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), tempType = 0); +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetInt(value, &intValue); +Set(exp->__anon1.instance->data, intValue); +PopulateInstance(exp->__anon1.instance); +break; } +case 4: +{ +long long intValue; +void (* Set)(void *, long long) = (void *)prop->Set; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetInt64(value, &intValue); +Set(exp->__anon1.instance->data, intValue); +PopulateInstance(exp->__anon1.instance); +break; } -if(_class && _class->type == 2 && source->kind != 8) +case 22: { -if(!dest->__anon1._class->__anon1.registered->dataType) -dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0); -if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) +intptr_t intValue; +void (* Set)(void *, intptr_t) = (void *)prop->Set; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetIntPtr(value, &intValue); +Set(exp->__anon1.instance->data, intValue); +PopulateInstance(exp->__anon1.instance); +break; +} +case 23: { -FreeType(source); -FreeType(sourceExp->expType); -source = sourceExp->expType = MkClassType(dest->__anon1._class->string); -source->refCount++; +ssize_t intValue; +void (* Set)(void *, ssize_t) = (void *)prop->Set; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetIntSize(value, &intValue); +Set(exp->__anon1.instance->data, intValue); +PopulateInstance(exp->__anon1.instance); +break; } +case 6: +{ +float floatValue; +void (* Set)(void *, float) = (void *)prop->Set; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetFloat(value, &floatValue); +Set(exp->__anon1.instance->data, floatValue); +PopulateInstance(exp->__anon1.instance); +break; } -if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3) +case 7: { -struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(); -struct Declarator * decl; -char string[1024]; +double doubleValue; +void (* Set)(void *, double) = (void *)prop->Set; -ReadString(string, sourceExp->__anon1.__anon2.string); -decl = SpecDeclFromString(string, specs, (((void *)0))); -FreeExpContents(sourceExp); -FreeType(sourceExp->expType); -sourceExp->type = 24; -sourceExp->__anon1._classExp.specifiers = specs; -sourceExp->__anon1._classExp.decl = decl; -sourceExp->expType = dest; -dest->refCount++; -FreeType(source); -FreeType(dest); -if(backupSourceExpType) -FreeType(backupSourceExpType); -return 1; +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +GetDouble(value, &doubleValue); +Set(exp->__anon1.instance->data, doubleValue); +PopulateInstance(exp->__anon1.instance); +break; } } -else if(source->kind == 8) +} +else if(_class->type == 2) { -struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); - -if(_class && (_class->type == 3 || _class->type == 2)) +switch(type->kind) { -if(dest->kind != 8) +case 8: { -struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -struct Type * tempDest, * tempSource; +struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered; -if(!source->__anon1._class->__anon1.registered->dataType) -source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0); -for(; _class->base->type != 1000; _class = _class->base) -; -tempDest = source; -tempSource = tempType; -tempType->kind = 8; -tempType->__anon1._class = FindClass(_class->fullName); -tempType->truth = source->truth; -tempType->classObjectType = source->classObjectType; -if(tempType->__anon1._class) -MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); -if(conversions && conversions->last) +if(propertyClass->type == 1 && value->__anon1.instance->data) { -((struct Conversion *)conversions->last)->resultType = dest; -dest->refCount++; +unsigned int (* Set)(void *) = (void *)prop->Set; +unsigned int bits = Set(value->__anon1.instance->data); + +exp->__anon1.__anon1.constant = PrintHexUInt(bits); +exp->type = 2; +break; } -FreeType(sourceExp->expType); -sourceExp->expType = MkClassType(_class->fullName); -sourceExp->expType->truth = source->truth; -sourceExp->expType->classObjectType = source->classObjectType; -if(!sourceExp->destType) +else if(_class->type == 2) { -FreeType(sourceExp->destType); -sourceExp->destType = sourceExp->expType; -if(sourceExp->expType) -sourceExp->expType->refCount++; -} -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -FreeType(dest); -dest = MkClassType(source->__anon1._class->string); -dest->truth = source->truth; -dest->classObjectType = source->classObjectType; -FreeType(source); -source = _class->dataType; -source->refCount++; -((tempType ? __extension__ ({ -void * __ecerePtrToDelete = (tempType); +unsigned int value; +unsigned int (* Set)(unsigned int) = (void *)prop->Set; +unsigned int bits; -__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete); -}) : 0), tempType = 0); +GetUInt(exp->__anon1.member.exp, &value); +bits = Set(value); +exp->__anon1.__anon1.constant = PrintHexUInt(bits); +exp->type = 2; } } } -if(!flag) -{ -if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)) -{ -FreeType(source); -FreeType(dest); -return 1; } } -if(dest->kind == 8) +else { -struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); -unsigned int fittingValue = 0; - -if(_class && _class->type == 4) +if(_class->type == 2) { -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); -struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); +unsigned int value; -if(c && value >= 0 && value <= c->largest) -fittingValue = 1; -} -if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2)) +GetUInt(exp->__anon1.member.exp, &value); +switch(type->kind) { -if(_class->type == 0 || _class->type == 5) +case 8: { -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; -*newExp = *sourceExp; -if(sourceExp->destType) -sourceExp->destType->refCount++; -if(sourceExp->expType) -sourceExp->expType->refCount++; -sourceExp->type = 11; -sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))); -sourceExp->__anon1.cast.exp = newExp; -FreeType(sourceExp->expType); -sourceExp->expType = (((void *)0)); -ProcessExpressionType(sourceExp); -if(!inCompiler) +if(_class->type == 1) { -FreeType(sourceExp->expType); -sourceExp->expType = dest; -} -FreeType(source); -if(inCompiler) -FreeType(dest); -if(backupSourceExpType) -FreeType(backupSourceExpType); -return 1; -} -if(!_class->dataType) -_class->dataType = ProcessTypeString(_class->dataTypeString, 0); -FreeType(dest); -dest = _class->dataType; -dest->refCount++; +void (* Get)(unsigned int, void *) = (void *)prop->Get; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +Get(value, exp->__anon1.instance->data); +PopulateInstance(exp->__anon1.instance); } -if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24)) +else if(_class->type == 2) { -specs = MkListOne(MkSpecifier(DOUBLE)); +unsigned int (* Get)(unsigned int) = (void *)prop->Get; +uint64 bits = Get(value); + +exp->__anon1.__anon1.constant = PrintHexUInt64(bits); +exp->type = 2; } -else if(dest->kind == 6 && (source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 7)) -{ -specs = MkListOne(MkSpecifier(FLOAT)); +break; } -else if(dest->kind == 4 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7)) -{ -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(INT64)); } -else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7)) -{ -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(INT)); } -else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7)) +else if(_class->type == 1) { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(SHORT)); -} -else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7)) +unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0)); + +switch(type->kind) { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(CHAR)); -} -else +case 8: { -FreeType(source); -FreeType(dest); -if(backupSourceExpType) +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; + +if(_class->type == 1 && value) { -if(sourceExp->expType) -FreeType(sourceExp->expType); -sourceExp->expType = backupSourceExpType; +void (* Get)(void *, void *) = (void *)prop->Get; + +exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation); +exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize)); +exp->__anon1.instance->_class = MkSpecifierName(_class->fullName); +exp->__anon1.instance->loc = exp->loc; +exp->type = 1; +Get(value, exp->__anon1.instance->data); +PopulateInstance(exp->__anon1.instance); } -return 0; +break; } } -else if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || source->kind == 4 || source->kind == 3 || source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1)) -{ -specs = MkListOne(MkSpecifier(DOUBLE)); } -else if(dest->kind == 6 && (source->kind == 6 || source->kind == 15 || source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1)) -{ -specs = MkListOne(MkSpecifier(FLOAT)); } -else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0)) -{ -specs = MkList(); -ListAdd(specs, MkSpecifier(BOOL)); } -else if(dest->kind == 1 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (dest->isSigned ? (value >= -128 && value <= 127) : (value >= 0 && value <= 255))) -{ -if(source->kind == 3) -{ -FreeType(dest); -FreeType(source); -if(backupSourceExpType) -FreeType(backupSourceExpType); -return 1; } else { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(CHAR)); +exp->isConstant = 0; } } -else if(dest->kind == 2 && (source->kind == 15 || source->kind == 24 || source->kind == 1 || source->kind == 2 || (source->kind == 3 && (dest->isSigned ? (value >= -32768 && value <= 32767) : (value >= 0 && value <= 65535))))) -{ -if(source->kind == 3) +else if(member) { -FreeType(dest); -FreeType(source); -if(backupSourceExpType) -FreeType(backupSourceExpType); -return 1; } -else +} +if(exp->type != 8) { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(SHORT)); +FreeExpression(memberExp); +FreeIdentifier(memberID); } +break; } -else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3)) +case 10: { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(INT)); +struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator); + +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type)); +exp->type = 2; +FreeType(type); +break; } -else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4)) +case 15: { -specs = MkList(); -if(!dest->isSigned) -ListAdd(specs, MkSpecifier(UNSIGNED)); -ListAdd(specs, MkSpecifier(INT64)); -} -else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1)) +struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol; + +if(classSym && classSym->__anon1.registered) { -specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0)))); +if(classSym->__anon1.registered->fixed) +{ +FreeSpecifier(exp->__anon1._class); +exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize); +exp->type = 2; } else { -FreeType(source); -FreeType(dest); -if(backupSourceExpType) -{ -if(sourceExp->expType) -FreeType(sourceExp->expType); -sourceExp->expType = backupSourceExpType; +char className[1024]; + +strcpy(className, "__ecereClass_"); +FullClassNameCat(className, classSym->string, 1); +DeclareClass(curExternal, classSym, className); +FreeExpContents(exp); +exp->type = 9; +exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className)); +exp->__anon1.member.member = MkIdentifier("structSize"); } -return 0; } -if(!flag && !sourceExp->opDestType) +break; +} +case 11: { -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); +struct Type * type; +struct Expression * e = exp; -*newExp = *sourceExp; -newExp->prev = (((void *)0)); -newExp->next = (((void *)0)); -if(sourceExp->destType) -sourceExp->destType->refCount++; -if(sourceExp->expType) -sourceExp->expType->refCount++; -sourceExp->type = 11; -if(realDest->kind == 8) +if(exp->type == 11) { -sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0))); -FreeList(specs, (void *)(FreeSpecifier)); +if(exp->__anon1.cast.exp) +ComputeExpression(exp->__anon1.cast.exp); +e = exp->__anon1.cast.exp; } -else -sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0))); -if(newExp->type == 4) +if(e && exp->expType) { -sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp)); -} -else -sourceExp->__anon1.cast.exp = newExp; -FreeType(sourceExp->expType); -sourceExp->expType = (((void *)0)); -ProcessExpressionType(sourceExp); +type = exp->expType; +if(type->kind == 8) +{ +struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered; + +if(_class && (_class->type == 3 || _class->type == 2)) +{ +if(!_class->dataType) +_class->dataType = ProcessTypeString(_class->dataTypeString, 0); +type = _class->dataType; } -else -FreeList(specs, (void *)(FreeSpecifier)); -FreeType(dest); -FreeType(source); -if(backupSourceExpType) -FreeType(backupSourceExpType); -return 1; } -else +switch(type->kind) { -if(computedExp != nbExp) +case 24: +case 1: +if(type->isSigned) { -FreeExpression(computedExp); -computedExp = nbExp; +char value = 0; + +if(GetChar(e, &value)) +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintChar(value); +exp->type = 2; } -while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list) -sourceExp = (*sourceExp->__anon1.list).last; -if(sourceExp->type == 0) +} +else { -struct Identifier * id = sourceExp->__anon1.__anon1.identifier; +unsigned char value = 0; -if(dest->kind == 8) +if(GetUChar(e, &value)) { -if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4) +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUChar(value); +exp->type = 2; +} +} +break; +case 2: +if(type->isSigned) { -struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered; -struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum"); +short value = 0; -if(enumClass) +if(GetShort(e, &value)) { -for(; _class && _class->type == 4; _class = _class->base) +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintShort(value); +exp->type = 2; +} +} +else { -struct __ecereNameSpace__ecere__sys__NamedLink64 * value; -struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0))); +unsigned short value = 0; -for(value = e->values.first; value; value = value->next) +if(GetUShort(e, &value)) { -if(!strcmp(value->name, id->string)) -break; +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUShort(value); +exp->type = 2; } -if(value) +} +break; +case 3: +if(type->isSigned) { -FreeType(sourceExp->expType); -sourceExp->isConstant = 1; -sourceExp->expType = MkClassType(_class->fullName); -if(inCompiler || inPreCompiler || inDebugger) +int value = 0; + +if(GetInt(e, &value)) { -FreeExpContents(sourceExp); -sourceExp->type = 2; -if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char"))) -sourceExp->__anon1.__anon1.constant = PrintInt64(value->data); -else -sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data); +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt(value); +exp->type = 2; } -FreeType(dest); -return 1; } +else +{ +unsigned int value = 0; + +if(GetUInt(e, &value)) +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUInt(value); +exp->type = 2; } } +break; +case 4: +if(type->isSigned) +{ +long long value = 0; + +if(GetInt64(e, &value)) +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64(value); +exp->type = 2; } } -if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions)) +else { -FreeType(dest); -return 1; +uint64 value = 0; + +if(GetUInt64(e, &value)) +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUInt64(value); +exp->type = 2; } } -FreeType(dest); +break; +case 22: +if(type->isSigned) +{ +intptr_t value = 0; + +if(GetIntPtr(e, &value)) +{ +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64((long long)value); +exp->type = 2; } -return 0; } - -static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst) +else { -unsigned int result = 1; +uintptr_t value = 0; -if(destType) +if(GetUIntPtr(e, &value)) { -struct __ecereNameSpace__ecere__sys__OldList converts = +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUInt64((uint64)value); +exp->type = 2; +} +} +break; +case 23: +if(type->isSigned) { -0, 0, 0, 0, 0 -}; -struct Conversion * convert; +ssize_t value = 0; -if(destType->kind == 0) -return 0; -if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst)) -result = 0; -if(converts.count) +if(GetIntSize(e, &value)) { -for(convert = converts.first; convert; convert = convert->next) +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintInt64((long long)value); +exp->type = 2; +} +} +else { -unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set); +size_t value = 0; -if(!empty) +if(GetUIntSize(e, &value)) { -struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression); -int objectType = exp->expType ? exp->expType->classObjectType : 0; +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintUInt64((uint64)value); +exp->type = 2; +} +} +break; +case 6: +{ +float value = 0; -*newExp = *exp; -newExp->prev = (((void *)0)); -newExp->next = (((void *)0)); -newExp->destType = (((void *)0)); -if(convert->isGet) +if(GetFloat(e, &value)) { -exp->type = 8; -exp->addedThis = 1; -exp->__anon1.member.exp = newExp; -FreeType(exp->__anon1.member.exp->expType); -exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName); -exp->__anon1.member.exp->expType->classObjectType = objectType; -exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString); -exp->__anon1.member.memberType = 1; -exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType; -exp->needCast = 1; -if(exp->expType) -exp->expType->refCount++; -ApplyAnyObjectLogic(exp->__anon1.member.exp); +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintFloat(value); +exp->type = 2; } -else -{ +break; +} +case 7: { -exp->type = 8; -exp->addedThis = 1; -exp->__anon1.member.exp = newExp; -if(newExp->expType && newExp->expType->kind == 8 && newExp->expType->__anon1._class && newExp->expType->__anon1._class->__anon1.registered && newExp->expType->__anon1._class->__anon1.registered->type == 5) +double value = 0; + +if(GetDouble(e, &value)) { -newExp->byReference = 1; +FreeExpContents(exp); +exp->__anon1.__anon1.constant = PrintDouble(value); +exp->type = 2; } -FreeType(exp->__anon1.member.exp->expType); -exp->__anon1.member.exp->expType = (((void *)0)); -if(convert->convert->dataType) -{ -exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type); -CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType); -exp->__anon1.member.exp->expType->refCount = 1; -exp->__anon1.member.exp->expType->classObjectType = objectType; -ApplyAnyObjectLogic(exp->__anon1.member.exp); +break; } -exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName); -exp->__anon1.member.memberType = 4; -exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName); -exp->needCast = 1; -if(convert->resultType) -convert->resultType->refCount++; } } +break; } -else +case 12: { -FreeType(exp->expType); -if(convert->isGet) +struct Operand op1 = { -exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType; -if(exp->destType->casted) -exp->needCast = 1; -if(exp->expType) -exp->expType->refCount++; -} -else +0, 0, 0, +.__anon1 = { +.c = 0 +}, { -exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName); -if(exp->destType->casted) -exp->needCast = 1; -if(convert->resultType) -convert->resultType->refCount++; -} -} +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -if(exp->isConstant && inCompiler) -ComputeExpression(exp); -__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert)); +}; +struct Operand op2 = +{ +0, 0, 0, +.__anon1 = { +.c = 0 +}, +{ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -if(!result && exp->expType && converts.count) +}; +struct Operand op3 = { -result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst); +0, 0, 0, +.__anon1 = { +.c = 0 +}, +{ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -if(!result && exp->expType && exp->destType) +}; + +if(exp->__anon1.cond.exp) +ComputeExpression((*exp->__anon1.cond.exp).last); +if(exp->__anon1.cond.elseExp) +ComputeExpression(exp->__anon1.cond.elseExp); +if(exp->__anon1.cond.cond) +ComputeExpression(exp->__anon1.cond.cond); +op1 = GetOperand(exp->__anon1.cond.cond); +if(op1.type) +op1.type->refCount++; +op2 = GetOperand((*exp->__anon1.cond.exp).last); +if(op2.type) +op2.type->refCount++; +op3 = GetOperand(exp->__anon1.cond.elseExp); +if(op3.type) +op3.type->refCount++; +if(op1.ops.Cond) { -if((exp->destType->kind == 8 && exp->expType->kind == 13 && exp->expType->__anon1.type->kind == 8 && exp->expType->__anon1.type->__anon1._class == exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && exp->destType->__anon1._class->__anon1.registered->type == 1) || (exp->expType->kind == 8 && exp->destType->kind == 13 && exp->destType->__anon1.type->kind == 8 && exp->destType->__anon1.type->__anon1._class == exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)) -result = 1; +FreeExpContents(exp); +op1.ops.Cond(exp, &op1, &op2, &op3); +} +if(op1.type) +FreeType(op1.type); +if(op2.type) +FreeType(op2.type); +if(op3.type) +FreeType(op3.type); +break; } } -return result; } static void ProcessFunction(struct FunctionDefinition * function); @@ -19657,6 +19747,7 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1); +__ecereNameSpace__ecere__com__eSystem_RegisterFunction("modifyPassAsTemplate", "void modifyPassAsTemplate(Type * typePtr, bool value)", modifyPassAsTemplate, module, 1); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1); diff --git a/compiler/bootstrap/libec/bootstrap/pass16.c b/compiler/bootstrap/libec/bootstrap/pass16.c index 0c0a305..05922fc 100644 --- a/compiler/bootstrap/libec/bootstrap/pass16.c +++ b/compiler/bootstrap/libec/bootstrap/pass16.c @@ -481,6 +481,8 @@ extern struct Type * MkClassType(const char * name); extern void CopyTypeInto(struct Type * type, struct Type * src); +extern void modifyPassAsTemplate(struct Type ** typePtr, unsigned int value); + extern struct Type * ProcessTypeString(const char * string, unsigned int staticMethod); struct Initializer; @@ -3347,6 +3349,8 @@ if(!e->next) e->usage |= (exp->usage & ((((unsigned int)(1)) | (((unsigned int)(1)) << 2)))); } ProcessExpression(e); +if(!e->next && e->expType && e->expType->passAsTemplate && exp->expType && !exp->expType->passAsTemplate) +modifyPassAsTemplate(&exp->expType, 1); exp->tempCount = (__simpleStruct2 = exp->tempCount, __simpleStruct3 = e->tempCount, (__simpleStruct2 > __simpleStruct3) ? __simpleStruct2 : __simpleStruct3); } break; diff --git a/compiler/bootstrap/libec/bootstrap/pass2.c b/compiler/bootstrap/libec/bootstrap/pass2.c index dbb420a..79350d5 100644 --- a/compiler/bootstrap/libec/bootstrap/pass2.c +++ b/compiler/bootstrap/libec/bootstrap/pass2.c @@ -273,6 +273,8 @@ extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__Ol extern struct Expression * QMkExpId(const char * id); +extern void CheckTemplateTypes(struct Expression * exp); + extern struct Expression * MkExpConstant(const char * string); extern struct Expression * MkExpString(const char * string); @@ -392,6 +394,8 @@ unsigned int isWatchable; extern struct Type * MkClassType(const char * name); +extern void modifyPassAsTemplate(struct Type ** typePtr, unsigned int value); + extern void FreeType(struct Type * type); extern struct Type * ProcessTypeString(const char * string, unsigned int staticMethod); @@ -1994,8 +1998,11 @@ struct __ecereNameSpace__ecere__com__Class * c = memberExp->__anon1.index.exp->e if(strcmp((c->templateClass ? c->templateClass : c)->name, "Array")) { -exp->__anon1.op.exp2 = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2))); -exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2))))); +if(exp->__anon1.op.exp2 && exp->__anon1.op.op == '=') +{ +modifyPassAsTemplate(&exp->__anon1.op.exp2->destType, 1); +CheckTemplateTypes(exp->__anon1.op.exp2); +} isIndexedContainerAssignment = 1; } ProcessExpression(memberExp); @@ -2187,6 +2194,20 @@ exp2 = (((void *)0)); value->expType = memberExp->expType; memberExp->expType->refCount++; value->usage = (value->usage & ~0x4) | (((unsigned int)(1)) << 2); +if(isIndexedContainerAssignment) +{ +value->__anon1.op.exp1->usage = (value->__anon1.op.exp1->usage & ~0x1) | (((unsigned int)(1)) << 0); +value->__anon1.op.exp2->usage = (value->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0); +modifyPassAsTemplate(&value->__anon1.op.exp1->destType, 0); +modifyPassAsTemplate(&value->__anon1.op.exp2->destType, 0); +CheckTemplateTypes(value->__anon1.op.exp1); +CheckTemplateTypes(value->__anon1.op.exp2); +modifyPassAsTemplate(&value->expType, 0); +value->destType = value->expType; +value->expType->refCount++; +modifyPassAsTemplate(&value->destType, 1); +CheckTemplateTypes(value); +} } else if(value) { @@ -2196,7 +2217,10 @@ if(value) value->usage = (value->usage & ~0x4) | (((unsigned int)(1)) << 2); DeclareProperty(curExternal, prop, setName, getName); if(memberExp->__anon1.member.exp) +{ ProcessExpression(memberExp->__anon1.member.exp); +CheckTemplateTypes(memberExp->__anon1.member.exp); +} if(((unsigned int)((exp->usage & 0x1) >> 0)) && ((!convertTo && prop->Get) || (convertTo && prop->Set))) { int __simpleStruct0, __simpleStruct1; @@ -3250,6 +3274,19 @@ newExp->expType = (((void *)0)); PrintTypeNoConst(e->expType, typeString, 0, 1); decl = SpecDeclFromString(typeString, specs, (((void *)0))); newExp->destType = ProcessType(specs, decl); +if(newExp->destType && e->expType && e->expType->passAsTemplate) +{ +struct Expression * nbExp = GetNonBracketsExp(newExp); + +if(nbExp->type == 11) +{ +FreeTypeName(nbExp->__anon1.cast.typeName); +nbExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0))); +} +newExp->expType = newExp->destType; +newExp->destType->refCount++; +modifyPassAsTemplate(&newExp->expType, 1); +} curContext = context; e->type = 23; if(curCompound) @@ -3263,6 +3300,7 @@ curCompound->__anon1.compound.declarations = MkList(); __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0)))))); ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp)))); ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name))))); +CheckTemplateTypes(newExp); e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts); } else diff --git a/compiler/libec/src/pass15.ec b/compiler/libec/src/pass15.ec index 4d4d489..16fbc22 100644 --- a/compiler/libec/src/pass15.ec +++ b/compiler/libec/src/pass15.ec @@ -3758,6 +3758,9 @@ bool MatchTypeExpression(Expression sourceExp, Type dest, OldList conversions, b { ((Conversion)(conversions.last)).resultType = dest; dest.refCount++; + + // This fixes passing unit as template to a double + modifyPassAsTemplate(&((Conversion)(conversions.last)).resultType, false); } FreeType(sourceExp.expType); @@ -6528,6 +6531,18 @@ static bool CheckExpressionType(Expression exp, Type destType, bool skipUnitBla, return result; } +void modifyPassAsTemplate(Type * typePtr, bool value) +{ + if(*typePtr && typePtr->passAsTemplate != value) + { + Type type { refCount = 1 }; + CopyTypeInto(type, *typePtr); + type.passAsTemplate = value; + FreeType(*typePtr); + *typePtr = type; + } +} + void CheckTemplateTypes(Expression exp) { /* @@ -6570,8 +6585,8 @@ void CheckTemplateTypes(Expression exp) } else { - // If we're looking for value: - // ({ union { double d; uint64 i; } u; u.i = [newExp]; u.d; }) + // We want to pass as a template argument + // ({ union { double d; uint64 i; } u; u.d = [newExp]; u.i; }) OldList * specs; OldList * unionDefs = MkList(); OldList * statements = MkList(); @@ -6580,6 +6595,11 @@ void CheckTemplateTypes(Expression exp) ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), null))); specs = MkListOne(MkStructOrUnion(unionSpecifier, null, unionDefs )); exp.type = extensionCompoundExp; + + modifyPassAsTemplate(&exp.expType, true); + modifyPassAsTemplate(&newExp.destType, false); + modifyPassAsTemplate(&newExp.expType, false); + exp.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), null)))),statements); ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp)))); ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i"))))); @@ -6587,6 +6607,41 @@ void CheckTemplateTypes(Expression exp) PopContext(context); } break; + case floatType: + if(exp.destType.classObjectType) + { + // We need to pass the address, just pass it along (Undo what was done above) + if(exp.destType) exp.destType.refCount--; + if(exp.expType) exp.expType.refCount--; + delete newExp; + } + else + { + // We want to pass as a template argument + // ({ union { float f; uint64 i; } u; u.f = [newExp]; u.i; }) + OldList * specs; + OldList * unionDefs = MkList(); + OldList * statements = MkList(); + context = PushContext(); + ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), null))); + ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), null))); + specs = MkListOne(MkStructOrUnion(unionSpecifier, null, unionDefs )); + exp.type = extensionCompoundExp; + exp.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), null)))),statements); + + modifyPassAsTemplate(&exp.expType, true); + modifyPassAsTemplate(&newExp.destType, false); + modifyPassAsTemplate(&newExp.expType, false); + + ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f")), '=', newExp)))); + ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i"))))); + exp.compound.compound.context = context; + PopContext(context); + } + break; + case voidType: + // Generated code already processed... + break; default: exp.type = castExp; exp.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), null); @@ -6643,12 +6698,49 @@ void CheckTemplateTypes(Expression exp) specs = MkListOne(MkStructOrUnion(unionSpecifier, null, unionDefs )); exp.type = extensionCompoundExp; exp.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), null)))),statements); + + modifyPassAsTemplate(&exp.expType, false); + modifyPassAsTemplate(&newExp.destType, true); + modifyPassAsTemplate(&newExp.expType, true); + ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp)))); ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d"))))); exp.compound.compound.context = context; PopContext(context); } break; + case floatType: + if(exp.destType.classObjectType) + { + // We need to pass the address, just pass it along (Undo what was done above) + if(exp.destType) exp.destType.refCount--; + if(exp.expType) exp.expType.refCount--; + delete newExp; + } + else + { + // If we're looking for value: + // ({ union { float f; uint64 i; } u; u.i = [newExp]; u.f; }) + OldList * specs; + OldList * unionDefs = MkList(); + OldList * statements = MkList(); + context = PushContext(); + ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), null))); + ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), null))); + specs = MkListOne(MkStructOrUnion(unionSpecifier, null, unionDefs )); + exp.type = extensionCompoundExp; + exp.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), null)))),statements); + + modifyPassAsTemplate(&exp.expType, false); + modifyPassAsTemplate(&newExp.destType, true); + modifyPassAsTemplate(&newExp.expType, true); + + ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp)))); + ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f"))))); + exp.compound.compound.context = context; + PopContext(context); + } + break; case classType: { if(exp.expType._class && exp.expType._class.registered && exp.expType._class.registered.type == structClass) diff --git a/compiler/libec/src/pass16.ec b/compiler/libec/src/pass16.ec index 9b874c5..c816974 100644 --- a/compiler/libec/src/pass16.ec +++ b/compiler/libec/src/pass16.ec @@ -1302,6 +1302,8 @@ static void ProcessExpression(Expression exp) e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true })); } ProcessExpression(e); + if(!e.next && e.expType && e.expType.passAsTemplate && exp.expType && !exp.expType.passAsTemplate) + modifyPassAsTemplate(&exp.expType, true); exp.tempCount = Max(exp.tempCount, e.tempCount); } break; diff --git a/compiler/libec/src/pass2.ec b/compiler/libec/src/pass2.ec index c3ebc36..f836a5f 100644 --- a/compiler/libec/src/pass2.ec +++ b/compiler/libec/src/pass2.ec @@ -592,8 +592,11 @@ static void ProcessExpression(Expression exp) Class c = memberExp.index.exp.expType._class.registered; if(strcmp((c.templateClass ? c.templateClass : c).name, "Array")) { - exp.op.exp2 = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), null), MkExpBrackets(MkListOne(exp.op.exp2))); - exp.op.exp2 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), null), MkExpBrackets(MkListOne(exp.op.exp2))))); + if(exp.op.exp2 && exp.op.op == '=') + { + modifyPassAsTemplate(&exp.op.exp2.destType, true); + CheckTemplateTypes(exp.op.exp2); + } isIndexedContainerAssignment = true; } @@ -800,6 +803,22 @@ static void ProcessExpression(Expression exp) value.expType = memberExp.expType; memberExp.expType.refCount++; value.usage.usageArg = true; + + if(isIndexedContainerAssignment) + { + value.op.exp1.usage.usageGet = true; + value.op.exp2.usage.usageGet = true; + modifyPassAsTemplate(&value.op.exp1.destType, false); + modifyPassAsTemplate(&value.op.exp2.destType, false); + CheckTemplateTypes(value.op.exp1); + CheckTemplateTypes(value.op.exp2); + + modifyPassAsTemplate(&value.expType, false); + value.destType = value.expType; + value.expType.refCount++; + modifyPassAsTemplate(&value.destType, true); + CheckTemplateTypes(value); + } } else if(value) { @@ -813,7 +832,10 @@ static void ProcessExpression(Expression exp) DeclareProperty(curExternal, prop, setName, getName); if(memberExp.member.exp) + { ProcessExpression(memberExp.member.exp); + CheckTemplateTypes(memberExp.member.exp); + } // If get flag present if(exp.usage.usageGet && @@ -2258,6 +2280,21 @@ static void ProcessExpression(Expression exp) PrintTypeNoConst(e.expType, typeString, false, true); decl = SpecDeclFromString(typeString, specs, null); newExp.destType = ProcessType(specs, decl); + if(newExp.destType && e.expType && e.expType.passAsTemplate) + { + Expression nbExp = GetNonBracketsExp(newExp); + if(nbExp.type == castExp) + { + // Because we're correcting this after the cast was added from the argument for loop at the beginning of this case block + // (CheckTemplateTypes() already called), we'll revert the cast to generic uint64 template type + FreeTypeName(nbExp.cast.typeName); + nbExp.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), null); + } + + newExp.expType = newExp.destType; + newExp.destType.refCount++; + modifyPassAsTemplate(&newExp.expType, true); + } curContext = context; e.type = extensionCompoundExp; @@ -2273,6 +2310,7 @@ static void ProcessExpression(Expression exp) curCompound.compound.declarations->Insert(null, MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), null)))); ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp)))); ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name))))); + CheckTemplateTypes(newExp); e.compound = MkCompoundStmt(null, stmts); } else