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;
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,
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);
__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);