compiler/libec: Map & AVLTree fixes with float/double values
authorJerome St-Louis <jerome@ecere.com>
Fri, 24 Apr 2015 06:48:04 +0000 (02:48 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 15 Oct 2015 00:19:44 +0000 (20:19 -0400)
compiler/bootstrap/ecere/bootstrap/i18n.c
compiler/bootstrap/ecs/bootstrap/ecs.c
compiler/bootstrap/libec/bootstrap/ast.c
compiler/bootstrap/libec/bootstrap/loadSymbols.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/bootstrap/libec/bootstrap/pass16.c
compiler/bootstrap/libec/bootstrap/pass2.c
compiler/libec/src/pass15.ec
compiler/libec/src/pass16.ec
compiler/libec/src/pass2.ec

index b83974d..5437ce4 100644 (file)
@@ -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
index 787e534..550a9f9 100644 (file)
@@ -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_);
 }
index 5ce57bd..3ec4dbd 100644 (file)
@@ -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
index 77606c2..418d91e 100644 (file)
@@ -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
index 8bd85f8..7f495cb 100644 (file)
@@ -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);
index 0c0a305..05922fc 100644 (file)
@@ -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;
index dbb420a..79350d5 100644 (file)
@@ -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
index 4d4d489..16fbc22 100644 (file)
@@ -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)
index 9b874c5..c816974 100644 (file)
@@ -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;
index c3ebc36..f836a5f 100644 (file)
@@ -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