3 #define YYLTYPE Location
6 extern External curExternal;
7 static Statement curCompound;
8 static Statement createInstancesBody;
9 static Statement destroyInstancesBody;
11 static void CreateInstancesBody()
13 if(inCompiler && !createInstancesBody)
15 char registerName[1024], moduleName[MAX_FILENAME];
17 Declarator declarator;
19 createInstancesBody = MkCompoundStmt(null, MkList());
20 createInstancesBody.compound.context = Context { parent = globalContext };
22 specifiers = MkList();
23 ListAdd(specifiers, MkSpecifier(VOID));
25 //strcpy(moduleName, outputFile);
26 GetLastDirectory(outputFile, moduleName);
27 StripExtension(moduleName);
28 ChangeCh(moduleName, ' ', '_');
29 ChangeCh(moduleName, '.', '_');
30 ChangeCh(moduleName, '-', '_');
31 sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
33 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
36 FunctionDefinition function = MkFunction(specifiers, declarator, null);
37 ProcessFunctionBody(function, createInstancesBody);
38 ListAdd(ast, MkExternalFunction(function));
41 // Destroy Instances Body
42 destroyInstancesBody = MkCompoundStmt(null, MkList());
43 destroyInstancesBody.compound.context = Context { parent = globalContext };
45 specifiers = MkList();
46 ListAdd(specifiers, MkSpecifier(VOID));
48 sprintf(registerName, "__ecereDestroyModuleInstances_%s", moduleName);
50 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
53 FunctionDefinition function = MkFunction(specifiers, declarator, null);
54 ProcessFunctionBody(function, destroyInstancesBody);
55 ListAdd(ast, MkExternalFunction(function));
60 // ***************** EXPRESSION PROCESSING ***************************
61 static void ProcessMemberInitData(MemberInit member)
63 if(member.initializer)
64 ProcessInitializer(member.initializer);
67 static void ProcessInstantiation(Instantiation inst)
69 if(inst.members && inst.members->first)
72 for(members = inst.members->first; members; members = members.next)
74 if(members.type == dataMembersInit)
76 if(members.dataMembers)
79 for(member = members.dataMembers->first; member; member = member.next)
80 ProcessMemberInitData(member);
83 else if(members.type == methodMembersInit)
85 ProcessFunction((FunctionDefinition)members.function);
91 // ADDED TO SUPPORT NESTED UNNAMED STRUCTURES
92 static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Instantiation inst, Expression instExp, OldList list, bool zeroOut)
94 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
96 // For simple classes, ensure all members are initialized
98 DataMember dataMember;
99 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
101 if(!dataMember.isProperty)
103 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
105 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
110 bool memberFilled = false;
111 if(inst.members && inst.members->first)
113 Class curClass = null;
114 DataMember curMember = null;
115 DataMember subMemberStack[256];
116 int subMemberStackPos = 0;
119 for(members = inst.members->first; members; members = members.next)
121 if(members.type == dataMembersInit)
123 MemberInit member = null;
124 for(member = members.dataMembers->first; member; member = member.next)
126 if(member.identifiers)
128 Identifier firstID = member.identifiers->first;
129 DataMember _subMemberStack[256];
130 int _subMemberStackPos = 0;
131 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
134 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
137 if(thisMember && thisMember.memberAccess == publicAccess)
139 curMember = thisMember;
140 curClass = curMember._class;
141 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
142 subMemberStackPos = _subMemberStackPos;
144 if(!firstID.next && thisMember == dataMember)
152 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
155 curMember = link.data;
156 if(!firstID.next && curMember == dataMember)
166 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
167 if(curMember == dataMember)
174 curMember = curMember.next;
176 curMember = parentMember.members.first;
180 // curMember = curMember.next;
183 if(memberFilled) break;
185 if(memberFilled) break;
192 Expression instExpCopy = CopyExpression(instExp);
193 Expression memberExp;
195 Expression value = MkExpConstant("0");
197 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
198 memberExp.member.memberType = MemberType::dataMember;
200 value.usage.usageGet = true;
201 setExp = MkExpOp(memberExp, '=', value);
203 value.loc = inst.loc;
206 setExp.loc = inst.loc;
208 FreeType(instExpCopy.expType);
209 instExpCopy.expType = instExp.expType;
210 if(instExp.expType) instExp.expType.refCount++;
212 ProcessExpressionType(setExp);
213 ProcessExpression(setExp);
215 ListAdd(list, setExp);
222 if(parentMember.type == unionMember)
229 // Returns if all members are set
230 static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList list, bool zeroOut)
233 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
234 bool fullSet = true, convert = false;
235 if(classSym && classSym.registered && classSym.registered.type == bitClass)
237 Expression exp = null;
238 if(inst.members && inst.members->first)
240 // Ensure all members are initialized only once
242 while(_class != classSym.registered)
244 BitMember bitMember = null;
245 Class lastClass = _class;
247 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
249 for(bitMember = _class.membersAndProperties.first; bitMember; bitMember = bitMember.next)
251 BitMember curMember = null;
252 Class curClass = null;
253 DataMember subMemberStack[256];
254 int subMemberStackPos = 0;
255 MemberInit member = null;
257 for(members = inst.members->first; members; members = members.next)
259 if(members.type == dataMembersInit)
261 for(member = members.dataMembers->first; member; member = member.next)
263 if(member.identifiers)
265 Identifier firstID = member.identifiers->first;
266 DataMember _subMemberStack[256];
267 int _subMemberStackPos = 0;
270 BitMember thisMember = (BitMember)eClass_FindDataMember(_class, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
273 // WARNING: Brackets needed here, awaiting precomp fix
274 thisMember = (BitMember)eClass_FindProperty(_class, firstID.string, privateModule);
276 if(thisMember && thisMember.memberAccess == publicAccess)
278 curMember = thisMember;
279 curClass = curMember._class;
280 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
281 subMemberStackPos = _subMemberStackPos;
283 if(thisMember == bitMember)
291 eClass_FindNextMember(classSym.registered, &curClass, (DataMember *)&curMember, subMemberStack, &subMemberStackPos);
292 if(curMember == bitMember)
305 if(!bitMember.isProperty)
307 Expression part = null;
308 OldList * specs = MkList();
310 //decl = SpecDeclFromString(bitMember.dataTypeString, specs, null);
311 decl = SpecDeclFromString(_class.dataTypeString, specs, null);
313 ProcessInitializer(member.initializer);
315 if(member.initializer && member.initializer.type == expInitializer)
320 sprintf(pos, "%d", bitMember.pos);
321 // (((type) value) << bitPos)
322 part = MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(
323 MkTypeName(specs, decl), MkExpBrackets(MkListOne(member.initializer.exp))))), LEFT_OP, MkExpConstant(pos))));
326 part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl),
327 MkExpBrackets(MkListOne(member.initializer.exp)))));
329 member.initializer.exp = null;
330 FreeInitializer(member.initializer);
331 member.initializer = null;
335 exp = MkExpOp(exp,'|', part);
339 // Clean this up... should only be used for Conversion properties...
342 char setName[1024], getName[1024];
343 DeclareProperty((Property)bitMember, setName, getName);
344 if(member.initializer && member.initializer.type == expInitializer)
346 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)),
347 MkListOne(member.initializer.exp));
350 member.initializer.exp = null;
351 FreeInitializer(member.initializer);
352 member.initializer = null;
360 exp = MkExpBrackets(MkListOne(exp));
362 exp = MkExpConstant("0");
364 // Just added this one...
365 exp.expType = MkClassType(classSym.string);
367 ProcessExpression(exp);
371 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
373 Class _class = classSym.registered;
374 Expression exp = null;
375 if(inst.members && inst.members->first)
377 MemberInit member = null;
378 Property prop = null;
380 for(members = inst.members->first; members; members = members.next)
382 if(members.type == dataMembersInit)
384 for(member = members.dataMembers->first; member; member = member.next)
386 if(member.identifiers)
388 Identifier firstID = member.identifiers->first;
389 prop = eClass_FindProperty(_class, firstID.string, privateModule);
411 char setName[1024], getName[1024];
412 DeclareProperty(prop, setName, getName);
413 if(member.initializer && member.initializer.type == expInitializer)
415 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member.initializer.exp));
418 member.initializer.exp = null;
419 FreeInitializer(member.initializer);
420 member.initializer = null;
425 ProcessInitializer(member.initializer);
426 if(member.initializer && member.initializer.type == expInitializer)
428 //exp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(_class.fullName, null), member.exp)));
429 exp = MkExpCast(QMkClass(_class.fullName, null), MkExpBrackets(MkListOne(member.initializer.exp)));
432 member.initializer.exp = null;
433 FreeInitializer(member.initializer);
434 member.initializer = null;
440 exp = MkExpBrackets(MkListOne(exp));
442 exp = MkExpConstant("0");
444 ProcessExpression(exp);
448 else if(classSym && classSym.registered)
450 if(classSym.registered.type == structClass)
452 // For simple classes, ensure all members are initialized
454 while(_class != classSym.registered)
456 DataMember dataMember;
457 Class lastClass = _class;
459 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
461 if(_class.structSize != _class.memberOffset)
464 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
466 if(!dataMember.isProperty)
468 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
470 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
475 bool memberFilled = false;
476 if(inst.members && inst.members->first)
478 Class curClass = null;
479 DataMember curMember = null;
480 DataMember subMemberStack[256];
481 int subMemberStackPos = 0;
483 for(members = inst.members->first; members; members = members.next)
485 if(members.type == dataMembersInit && members.dataMembers)
487 MemberInit member = null;
488 for(member = members.dataMembers->first; member; member = member.next)
490 if(member.identifiers)
492 DataMember _subMemberStack[256];
493 int _subMemberStackPos = 0;
494 Identifier firstID = member.identifiers->first;
495 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
498 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
501 if(thisMember.memberAccess == publicAccess)
503 curMember = thisMember;
504 curClass = curMember._class;
505 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
506 subMemberStackPos = _subMemberStackPos;
508 if(!firstID.next && curMember == dataMember)
517 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
518 if(curMember == dataMember)
525 if(memberFilled) break;
527 if(memberFilled) break;
534 Expression instExpCopy = CopyExpression(instExp);
535 Expression memberExp;
537 Expression value = MkExpConstant("0");
539 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
540 memberExp.member.memberType = MemberType::dataMember;
542 value.usage.usageGet = true;
543 setExp = MkExpOp(memberExp, '=', value);
545 value.loc = inst.loc;
548 setExp.loc = inst.loc;
550 FreeType(instExpCopy.expType);
551 instExpCopy.expType = instExp.expType;
552 if(instExp.expType) instExp.expType.refCount++;
554 ProcessExpressionType(setExp);
555 ProcessExpression(setExp);
557 ListAdd(list, setExp);
567 // THEN SET EVERYTHING IN THE ORDER IT IS SET
568 if(inst.members && inst.members->first)
570 Class curClass = null;
571 DataMember curMember = null;
572 DataMember subMemberStack[256];
573 int subMemberStackPos = 0;
575 for(members = inst.members->first; members; members = members.next)
577 if(members.type == dataMembersInit && members.dataMembers)
579 MemberInit member = null;
580 Method method = null;
582 for(member = members.dataMembers->first; member; member = member.next)
584 Identifier ident = null;
585 DataMember thisMember = null;
586 if(member.identifiers)
588 DataMember _subMemberStack[256];
589 int _subMemberStackPos = 0;
590 Identifier firstID = member.identifiers->first;
591 thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
594 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
598 if(thisMember.memberAccess == publicAccess)
600 curMember = thisMember;
601 curClass = curMember._class;
602 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
603 subMemberStackPos = _subMemberStackPos;
606 else if(classSym.registered.type != structClass)
608 method = eClass_FindMethod(classSym.registered, ident.string, privateModule);
609 if(!method || method.type != virtualMethod)
615 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
616 thisMember = curMember;
619 if(thisMember || method)
621 Expression instExpCopy = CopyExpression(instExp);
622 Expression setExp = null;
624 instExpCopy.tempCount = instExp.tempCount;
627 ident = MkIdentifier(thisMember.name);
630 Expression memberExp;
631 bool freeMemberExp = false;
633 if(thisMember && thisMember.isProperty && ((Property)thisMember).conversion)
635 if(member.identifiers && member.identifiers->count > 1)
637 Identifier id = member.identifiers->first;
638 // TODO: Set the member types for those
639 memberExp = MkExpMember(instExpCopy, id);
640 for(id = id.next; id; id = id.next)
641 memberExp = MkExpMember(memberExp, id);
644 memberExp = MkExpMember(instExpCopy, ident);
646 if(member.initializer && member.initializer.type == expInitializer && member.initializer.exp)
648 member.initializer.exp.usage.usageGet = true;
649 setExp = MkExpOp(memberExp, '=', member.initializer.exp);
652 member.initializer.exp = null;
653 FreeInitializer(member.initializer);
654 member.initializer = null;
658 freeMemberExp = true;
659 // TOCHECK: WHat happens in here?
661 // TODO: list initializer not working...
662 memberExp.loc = inst.loc;
664 if(member.identifiers)
665 member.identifiers->Clear();
669 setExp.loc = inst.loc;
671 FreeType(instExpCopy.expType);
672 instExpCopy.expType = instExp.expType;
673 if(instExp.expType) instExp.expType.refCount++;
677 ProcessExpressionType(setExp);
678 ProcessExpression(setExp);
680 ListAdd(list, setExp);
683 FreeExpression(memberExp);
691 return fullSet || convert;
694 public void DeclareClass(Symbol classSym, char * className)
696 /*if(classSym.registered.templateClass)
699 char className[1024];
700 strcpy(className, "__ecereClass_");
701 templateSym = FindClass(classSym.registered.templateClass.fullName);
702 FullClassNameCat(className, templateSym.string, true);
703 MangleClassName(className);
705 DeclareClass(templateSym, className);
707 if(classSym && classSym.id == MAXINT)
709 // Add Class declaration as extern
711 OldList * specifiers, * declarators;
714 if(!classSym._import)
716 // TESTING: DANGER HERE... CHECK FOR TEMPLATES ONLY? SET classSym.module ELSEWHERE?
717 // if(!classSym.module) return;
718 if(!classSym.module) classSym.module = mainModule;
719 if(!classSym.module) return;
720 classSym._import = ClassImport
722 isRemote = classSym.registered ? classSym.registered.isRemote : false;
723 name = CopyString(classSym.string);
725 classSym.module.classes.Add(classSym._import);
727 classSym._import.itself = true;
729 specifiers = MkList();
730 declarators = MkList();
732 ListAdd(specifiers, MkSpecifier(EXTERN));
733 ListAdd(specifiers, MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null));
735 d = MkDeclaratorPointer(MkPointer(null, null),
736 MkDeclaratorIdentifier(MkIdentifier(className)));
738 ListAdd(declarators, MkInitDeclarator(d, null));
740 decl = MkDeclaration(specifiers, declarators);
744 ast->Insert(curExternal.prev, (classSym.pointerExternal = MkExternalDeclaration(decl)));
745 // classSym.id = curExternal.symbol.id;
748 classSym.id = curExternal.symbol ? curExternal.symbol.idCode : 0;
750 classSym.idCode = classSym.id;
753 else if(classSym && curExternal.symbol.idCode < classSym.id)
754 //else if(curExternal.symbol.id <= classSym.id)
756 // DANGER: (Moved here)
757 if(classSym.structExternal)
758 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
760 // Move _class declaration higher...
761 ast->Move(classSym.pointerExternal, curExternal.prev);
765 if(classSym.structExternal)
766 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
769 // TOFIX: For non simple classes, Class is in pointerExternal and actual struct in structExternal
770 if(classSym.structExternal)
771 ast->Move(classSym.structExternal, classSym.pointerExternal);
773 classSym.id = curExternal.symbol.idCode;
775 classSym.idCode = classSym.id;
779 void ProcessExpressionInstPass(Expression exp)
781 ProcessExpression(exp);
784 static void ProcessExpression(Expression exp)
787 char debugExpString[1024] = "";
788 PrintExpression(exp, debugExpString);
796 Instantiation inst = exp.instance;
797 if(inCompiler && inst._class)
799 char className[1024];
800 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
803 if(classSym && classSym.registered && classSym.registered.type == bitClass)
807 OldList list = { 0 };
809 ProcessInstMembers(inst, null, &list, false);
811 ProcessExpression(inst.exp);
813 //Why was this here twice? ProcessInstMembers(inst, null, &list);
816 exp.op.exp1 = inst.exp;
817 exp.op.exp2 = list.first;
819 // Take expression out... (Why was the comment alone?)
824 Type expType = exp.expType;
825 Expression prev = exp.prev, next = exp.next;
827 ProcessInstMembers(inst, null, &list, false);
830 FreeType(exp.destType);
832 *exp = *(Expression)list.first;
835 Expression firstExp = list.first;
839 FreeType(exp.destType);
840 exp.destType = expType;
841 //if(expType) expType.refCount++;
847 else if(classSym && classSym.registered && (classSym.registered.type == unitClass || classSym.registered.type == enumClass))
851 OldList list = { 0 };
854 ProcessInstMembers(inst, null, &list, false);
856 ProcessExpression(inst.exp);
858 //Why was this here twice? ProcessInstMembers(inst, null, &list);
861 exp.op.exp1 = inst.exp;
862 exp.op.exp2 = list.first;
864 // Take expression out... (Why was the comment alone?)
867 list.Remove(list.first);
868 while(e = list.first)
876 Expression prev = exp.prev, next = exp.next;
877 Type expType = exp.expType;
878 OldList list = { 0 };
879 ProcessInstMembers(inst, null, &list, false);
884 Expression e = list.first;
885 FreeType(exp.destType);
889 exp.expType = expType;
892 while(e = list.first)
900 exp.type = constantExp;
901 exp.constant = CopyString("0");
905 else if(classSym && classSym.registered && classSym.registered.type == structClass)
910 exp.type = bracketsExp;
913 ProcessInstMembers(inst, inst.exp, exp.list, false);
915 ProcessExpression(inst.exp);
919 exp.type = (ExpressionType)1000; // remove expression
922 // Take expression out...
928 Declaration dummyDecl;
929 // Unnamed instantiation
931 // Make a declaration in the closest compound statement
932 // (Do not reuse (since using address for function calls)...)
935 ListAdd(decls, MkInitDeclarator(
936 MkDeclaratorIdentifier(MkIdentifier(className)), null));
937 decl = MkDeclaration(specs, decls);
939 /* Never mind this... somebody might modify the values...
943 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
944 inst.id = MkIdentifier(className);
945 decl = MkDeclarationInst(inst);
946 exp.type = ExpIdentifier;
947 exp.identifier = inst.id;
948 if(!curCompound.compound.declarations)
949 curCompound.compound.declarations = MkList();
950 curCompound.compound.declarations->Insert(null, decl);
951 ProcessDeclaration(decl);
957 //OldList * specs = MkList(), * decls = MkList();
958 //sprintf(className, "__ecereClassData_%s", inst._class.name);
959 //ListAdd(specs, MkStructOrUnion(SpecifierStruct, MkIdentifier(className), null));
962 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
963 dummyDecl = MkDeclaration(null,null);
964 if(!curCompound.compound.declarations)
965 curCompound.compound.declarations = MkList();
966 curCompound.compound.declarations->Insert(null, dummyDecl);
968 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
971 OldList * list = MkList();
972 if(inst.isConstant && ProcessBracketInst(inst, list))
974 decl = MkDeclaration(MkList(), MkList());
976 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
977 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)),
978 MkInitializerList(list)));
980 exp.type = identifierExp;
981 exp.identifier = MkIdentifier(className);
988 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst._class), MkExpIdentifier(MkIdentifier(className)), null));
991 // Set properties & data members in expression
992 // to handle jump and control statements
993 // Set unset data members to 0
994 exp.type = bracketsExp;
997 instExp = QMkExpId(className);
998 instExp.loc = exp.loc;
999 instExp.expType = MkClassType(inst._class.name);
1001 // Mark the declarated instance as fullset so it doesn't need to be zeroed out
1002 decl.inst.fullSet = ProcessInstMembers(inst, instExp, exp.list, false);
1004 ListAdd(exp.list, instExp);
1008 FreeType(exp.expType);
1009 exp.expType = MkClassType(inst._class.name);
1011 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
1013 void * prev = dummyDecl.prev, * next = dummyDecl.next;
1015 dummyDecl.prev = prev;
1016 dummyDecl.next = next;
1020 ProcessDeclaration(decl);
1023 if(!curCompound.compound.declarations)
1024 curCompound.compound.declarations = MkList();
1025 curCompound.compound.declarations->Insert(null, decl);
1034 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
1035 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
1038 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
1039 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
1040 newCall.byReference = true;
1044 strcpy(className, "__ecereClass_");
1045 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
1047 classSym = FindClass(classSym.registered.templateClass.fullName);
1048 FullClassNameCat(className, classSym.string, true);
1051 FullClassNameCat(className, inst._class.name, true);
1053 MangleClassName(className);
1054 DeclareClass(classSym, className);
1055 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
1057 ProcessExpressionType(newCall);
1058 newCall.byReference = true;
1063 if(inst.members && inst.members->first)
1065 exp.type = bracketsExp;
1066 exp.list = MkList();
1070 ListAdd(exp.list, MkExpOp(inst.exp, '=', newCall));
1073 FreeExpression(newCall);
1075 ProcessInstMembers(inst, inst.exp, exp.list, false);
1078 FreeExpression(inst.exp);
1084 exp.op.exp1 = inst.exp;
1085 exp.op.exp2 = newCall;
1087 ProcessExpression(inst.exp);
1093 // Unnamed instantiation
1094 if(inst.members && inst.members->first)
1096 char ecereTemp[100];
1097 MembersInit members;
1098 int tempCount = exp.tempCount;
1101 // Check if members use temp count...
1102 for(members = inst.members->first; members; members = members.next)
1104 if(members.type == dataMembersInit && members.dataMembers)
1107 for(member = members.dataMembers->first; member; member = member.next)
1109 if(member.initializer && member.initializer.type == expInitializer)
1111 ProcessMemberInitData(member); // ADDED THIS TO HAVE PROPER tempCount ALREADY...
1112 tempCount = Max(tempCount, member.initializer.exp.tempCount);
1118 tempCount = Max(tempCount, declTempCount);
1121 curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
1122 sprintf(ecereTemp, "__ecereInstance%d", tempCount);
1123 exp.type = extensionCompoundExp;
1124 exp.compound = MkCompoundStmt(null, null);
1125 exp.compound.compound.context = PushContext();
1126 exp.compound.compound.context.simpleID = exp.compound.compound.context.parent.simpleID;
1127 exp.compound.compound.declarations = MkListOne(QMkDeclaration(inst._class.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)),
1128 MkInitializerAssignment(newCall))));
1129 exp.compound.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
1131 instExp = QMkExpId(ecereTemp);
1132 instExp.tempCount = tempCount;
1133 instExp.expType = MkClassType(inst._class.name);
1134 instExp.byReference = true;
1135 ProcessInstMembers(inst, instExp, expList, false);
1136 FreeExpression(instExp);
1140 Expression tmpExp = QMkExpId(ecereTemp);
1141 tmpExp.byReference = true;
1142 ListAdd(expList, tmpExp);
1144 exp.tempCount = tempCount;
1146 declTempCount = Max(declTempCount, tempCount);
1147 PopContext(exp.compound.compound.context);
1151 FreeType(newCall.destType);
1152 FreeType(newCall.expType);
1153 newCall.destType = exp.destType;
1154 newCall.expType = exp.expType;
1160 if(exp.type != instanceExp)
1164 ProcessInstantiation(inst);
1173 // if(exp._new.size) exp._new.size.usage.usageGet = true;
1174 ProcessExpression(exp._new.size);
1178 // if(exp._renew.size) exp._renew.size.usage.usageGet = true;
1179 ProcessExpression(exp._renew.size);
1180 // if(exp._renew.exp) exp._renew.exp.usage.usageGet = true;
1181 ProcessExpression(exp._renew.exp);
1185 bool assign = false;
1189 // Assignment Operators
1192 exp.op.exp2.usage.usageGet = true;
1194 exp.op.exp1.usage.usageSet = true;
1208 exp.op.exp2.usage.usageGet = true;
1211 exp.op.exp1.usage.usageSet = true;
1217 exp.op.exp1.usage.usageSet = true;
1222 if(exp.op.exp1 && exp.op.exp2)
1224 exp.op.exp1.usage.usageGet = true;
1225 exp.op.exp2.usage.usageGet = true;
1234 exp.op.exp1.usage.usageGet = true;
1239 exp.op.exp2.usage.usageGet = true;
1242 // Binary only operators
1258 exp.op.exp1.usage.usageGet = true;
1260 exp.op.exp2.usage.usageGet = true;
1266 // TEST: if(exp.op.exp2) exp.op.exp1.tempCount = Max(exp.op.exp1.tempCount, exp.op.exp2.tempCount);
1267 ProcessExpression(exp.op.exp1);
1268 // TEST: exp.tempCount = Max(exp.op.exp1.tempCount, exp.tempCount);
1273 // Don't use the temporaries used by the left side...
1275 // TEST: exp.op.exp2.tempCount = Max(exp.op.exp2.tempCount, exp.op.exp1.tempCount);
1276 exp.op.exp2.tempCount = exp.op.exp1.tempCount;
1277 ProcessExpression(exp.op.exp2);
1278 // TEST: exp.tempCount = Max(exp.op.exp2.tempCount, exp.tempCount);
1282 case extensionExpressionExp:
1286 for(e = exp.list->first; e; e = e.next)
1288 e.tempCount = Max(e.tempCount, exp.tempCount);
1291 e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true }));
1293 ProcessExpression(e);
1294 exp.tempCount = Max(exp.tempCount, e.tempCount);
1302 exp.index.exp.usage.usageGet = true;
1303 ProcessExpression(exp.index.exp);
1304 for(e = exp.index.index->first; e; e = e.next)
1307 e.usage.usageGet = true;
1308 ProcessExpression(e);
1310 // Ignore temps in the index for now...
1311 exp.tempCount = exp.index.exp.tempCount;
1313 if(exp.index.exp.expType)
1315 Type source = exp.index.exp.expType;
1316 if(source.kind == classType && source._class && source._class.registered && source._class.registered != containerClass &&
1317 eClass_IsDerived(source._class.registered, containerClass))
1319 Class _class = source._class.registered;
1320 // __extension__({ Iterator<type> i { container }; i.Index(e, [ exp.usage.usageSet ]; i.value; });
1322 char iteratorType[1024];
1323 OldList * declarations = MkList();
1324 OldList * statements = MkList();
1325 OldList * args = MkList();
1326 OldList * instMembers = MkList();
1328 Context context = PushContext();
1330 sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
1332 ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
1334 ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
1335 MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
1337 ListAdd(args, MkExpBrackets(exp.index.index));
1338 ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
1340 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
1341 MkIdentifier("Index")), args))));
1343 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
1345 exp.type = bracketsExp;
1346 exp.list = MkListOne(MkExpPointer(expExt = (MkExpExtensionCompound(MkCompoundStmt(declarations, statements))), MkIdentifier("data")));
1347 expExt.compound.compound.context = context;
1348 PopContext(context);
1349 expExt.usage = exp.usage;
1350 ProcessExpressionType(exp.list->first);
1351 ProcessExpression(exp.list->first);
1360 Method method = null;
1362 ProcessExpression(exp.call.exp);
1364 if(exp.call.arguments)
1366 for(e = exp.call.arguments->first; e; e = e.next)
1368 e.usage.usageGet = true;
1369 e.usage.usageArg = true;
1371 // TEST: e.tempCount = Max(e.tempCount, exp.tempCount);
1372 ProcessExpression(e);
1373 // TEST: exp.tempCount = Max(exp.tempCount, e.tempCount);
1380 exp.member.exp.usage.usageGet = true;
1381 ProcessExpression(exp.member.exp);
1383 // Must do this here so we can set the MemberType of deep properties inside instantiations
1384 if(!exp.member.memberType)
1386 Type type = exp.member.exp.expType;
1387 if((type && type.kind == classType && exp.member.member))
1389 // Check if it's an instance
1390 Class _class = (exp.member.member._class && exp.member.member.classSym) ? exp.member.member.classSym.registered : (type._class ? type._class.registered : null);
1391 Property prop = null;
1392 Method method = null;
1393 DataMember member = null;
1394 Property revConvert = null;
1396 // Prioritize data members over properties for "this"
1397 if(exp.member.thisPtr)
1399 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1401 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1403 // Prioritize properties over data members otherwise
1406 // Look for publicAccess Members first
1407 prop = eClass_FindProperty(_class, exp.member.member.string, null);
1409 member = eClass_FindDataMember(_class, exp.member.member.string, null, null, null);
1410 if(!prop && !member)
1412 method = eClass_FindMethod(_class, exp.member.member.string, null);
1415 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1417 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1421 if(!prop && !member)
1422 method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
1423 if(!prop && !member && !method)
1425 Symbol classSym = FindClass(exp.member.member.string);
1428 Class convertClass = classSym.registered;
1430 revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
1436 exp.member.memberType = propertyMember;
1438 prop.dataType = ProcessTypeString(prop.dataTypeString, false);
1440 FreeType(exp.expType);
1441 exp.expType = prop.dataType;
1442 if(prop.dataType) prop.dataType.refCount++;
1446 exp.member.memberType = methodMember;
1447 if(!method.dataType)
1448 //method.dataType = ((Symbol)method.symbol).type;
1449 ProcessMethodType(method);
1451 FreeType(exp.expType);
1452 exp.expType = method.dataType;
1453 if(method.dataType) method.dataType.refCount++;
1457 exp.member.memberType = dataMember;
1458 DeclareStruct(_class.fullName, false);
1459 if(!member.dataType)
1460 member.dataType = ProcessTypeString(member.dataTypeString, false);
1462 FreeType(exp.expType);
1463 exp.expType = member.dataType;
1464 if(member.dataType) member.dataType.refCount++;
1468 exp.member.memberType = reverseConversionMember;
1470 FreeType(exp.expType);
1471 exp.expType = MkClassType(revConvert._class.fullName);
1474 printf($"Error: Couldn't find member %s in class %s\n",
1475 exp.member.member.string, _class.name);*/
1484 exp.cast.exp.usage.usageGet = true;
1485 ProcessExpression(exp.cast.exp);
1491 if(exp.usage.usageGet)
1492 exp.cond.cond.usage.usageGet = true;
1494 ProcessExpression(exp.cond.cond);
1495 for(e = exp.cond.exp->first; e; e = e.next)
1497 if(!e.next && exp.usage.usageGet) e.usage.usageGet = true;
1498 ProcessExpression(e);
1500 if(exp.cond.elseExp)
1502 if(exp.usage.usageGet) exp.cond.elseExp.usage.usageGet = true;
1503 ProcessExpression(exp.cond.elseExp);
1507 case extensionCompoundExp:
1509 if(exp.compound.compound.statements &&
1510 ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
1511 ((Statement)exp.compound.compound.statements->last).expressions &&
1512 ((Statement)exp.compound.compound.statements->last).expressions->last)
1514 ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
1516 ProcessStatement(exp.compound);
1521 ProcessExpression(exp.vaArg.exp);
1524 case extensionInitializerExp:
1526 ProcessInitializer(exp.initializer.initializer);
1530 CheckTemplateTypes(exp);
1533 static void ProcessInitializer(Initializer init)
1537 case expInitializer:
1538 init.exp.usage.usageGet = true;
1539 ProcessExpression(init.exp);
1541 case listInitializer:
1544 for(i = init.list->first; i; i = i.next)
1545 ProcessInitializer(i);
1551 static void ProcessSpecifier(Specifier spec)
1566 for(e = spec.list->first; e; e = e.next)
1569 ProcessExpression(e.exp);
1574 case structSpecifier:
1575 case unionSpecifier:
1578 if(spec.definitions)
1581 for(def = spec.definitions->first; def; def = def.next)
1583 if(def.type == declarationClassDef && def.decl && def.decl.type == structDeclaration)
1584 ProcessDeclaration(def.decl);
1590 case SpecifierClass:
1597 static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list)
1599 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1600 DataMember dataMember = null;
1601 bool someMemberSet = false;
1603 // For simple classes, ensure all members are initialized
1604 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1606 MembersInit members;
1607 MemberInit member = null;
1609 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1611 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1616 Class curClass = null;
1617 DataMember curMember = null;
1618 DataMember subMemberStack[256];
1619 int subMemberStackPos = 0;
1622 if(inst.members && inst.members->first)
1624 for(members = inst.members->first; members; members = members.next)
1626 if(members.type == dataMembersInit)
1628 for(member = members.dataMembers->first; member; member = member.next)
1630 if(member.identifiers)
1632 Identifier firstID = member.identifiers->first;
1634 DataMember _subMemberStack[256];
1635 int _subMemberStackPos = 0;
1636 DataMember thisMember;
1637 thisMember = firstID ? (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule) : null;
1638 // FILL MEMBER STACK
1639 if(!thisMember && firstID)
1640 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1641 if(thisMember && thisMember.memberAccess == publicAccess)
1643 curMember = thisMember;
1644 curClass = curMember._class;
1645 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1646 subMemberStackPos = _subMemberStackPos;
1649 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
1652 curMember = link.data;
1655 // Choose the first specified member of the union...
1656 if(parentMember.type == unionMember)
1659 dataMember = curMember;
1663 if(dataMember == thisMember)
1665 // Look for another member of this one and merge them
1666 // into one instantiation...
1667 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1669 OldList * partList = MkList();
1670 // TODO: We're assuming this is a simple class right now...
1673 MembersInit nextMembers;
1674 MemberInit next = member.next;
1676 if(!dataMember.dataType)
1677 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1678 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1679 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1682 OldList * identifiers = MkList();
1684 for(id = ((Identifier)member.identifiers->first).next; id; id = id.next)
1685 identifiers->Add(CopyIdentifier(id));
1687 // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
1688 // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
1689 /*member.identifiers->Remove(firstID);*/
1691 MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
1694 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1696 if(!nextMembers.dataMembers)
1699 if(members != nextMembers) next = nextMembers.dataMembers->first;
1701 if(nextMembers.type == dataMembersInit)
1703 MemberInit nextMember;
1705 for(nextMember = next; nextMember;
1706 nextMember = next, next = nextMember ? nextMember.next : null)
1708 Identifier nextID = nextMember.identifiers->first;
1709 if(nextMember.identifiers &&
1710 nextMember.identifiers->count > 1 &&
1711 !strcmp(firstID.string, nextID.string))
1713 nextMembers.dataMembers->Remove(nextMember);
1714 nextMember.identifiers->Remove(nextID);
1715 ListAdd(partList, nextMember);
1721 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1722 MkListOne(MkMembersInitList(partList))));
1730 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1731 if(curMember == dataMember)
1739 curMember = curMember.next;
1741 curMember = parentMember.members.first;
1743 if(curMember == dataMember)
1756 if(member && member.initializer && member.initializer.type == expInitializer)
1758 Expression memberExp = null;
1759 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1760 member.initializer.exp.expType._class.registered.type == structClass)
1762 OldList * subList = MkList();
1763 ProcessBracketInst(member.initializer.exp.instance, subList);
1764 FreeExpression(member.initializer.exp);
1765 ListAdd(list, MkInitializerList(subList));
1769 member.initializer.exp.usage.usageGet = true;
1770 ProcessExpression(member.initializer.exp);
1771 ListAdd(list, MkInitializerAssignment(member.initializer.exp));
1773 member.initializer.exp = null;
1774 FreeInitializer(member.initializer);
1775 member.initializer = null;
1776 someMemberSet = true;
1778 else if(member && member.initializer && member.initializer.type == listInitializer)
1780 ListAdd(list, member.initializer);
1781 member.initializer = null;
1782 someMemberSet = true;
1784 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember)
1787 if(!dataMember.dataType)
1788 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1789 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1790 if(classSym && classSym.registered && classSym.registered.type == structClass)
1792 OldList * subList = MkList();
1793 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1794 Instantiation inst = MkInstantiation(spec, null, null);
1795 ProcessBracketInst(inst, subList);
1798 ListAdd(list, MkInitializerList(subList));
1801 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1805 if(parentMember.type == unionMember)
1809 // TESTING THIS NEW CODE FOR ANCHORS...
1810 if(parentMember.type == unionMember && !someMemberSet)
1813 dataMember = parentMember.members.first;
1814 if(!dataMember.dataType && dataMember.dataTypeString)
1815 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1816 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1817 if(classSym && classSym.registered && classSym.registered.type == structClass)
1819 OldList * subList = MkList();
1820 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1821 Instantiation inst = MkInstantiation(spec, null, null);
1822 ProcessBracketInst(inst, subList);
1825 ListAdd(list, MkInitializerList(subList));
1828 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1833 static bool ProcessBracketInst(Instantiation inst, OldList list)
1835 static int recursionCount = 0;
1836 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1837 Class _class = null;
1839 if(recursionCount > 500) return false;
1842 while(_class != classSym.registered)
1844 DataMember dataMember;
1845 Class lastClass = _class;
1847 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
1849 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1851 if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1853 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1861 MembersInit members;
1862 MemberInit member = null;
1865 if(inst.members && inst.members->first)
1867 DataMember curMember = null;
1868 Class curClass = null;
1869 DataMember subMemberStack[256];
1870 int subMemberStackPos = 0;
1872 for(members = inst.members->first; members; members = members.next)
1874 if(members.type == dataMembersInit)
1876 for(member = members.dataMembers->first; member; member = member.next)
1878 Identifier firstID = member.identifiers ? member.identifiers->first : null;
1881 DataMember _subMemberStack[256];
1882 int _subMemberStackPos = 0;
1883 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
1884 // FILL MEMBER STACK
1886 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1889 curMember = thisMember;
1890 curClass = curMember._class;
1891 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1892 subMemberStackPos = _subMemberStackPos;
1895 if(curMember == dataMember)
1897 if(dataMember.isProperty)
1899 if(!((Property)dataMember).Set)
1901 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1908 // Look for another member of this one and merge them
1909 // into one instantiation...
1910 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1912 OldList * partList = MkList();
1913 // TODO: We're assuming this is a simple _class right now...
1915 MembersInit nextMembers;
1916 MemberInit next = member.next;
1918 if(!dataMember.dataType)
1919 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1920 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1921 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1923 member.identifiers->Remove(firstID);
1925 MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
1927 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1929 if(!nextMembers.dataMembers) continue;
1931 if(members != nextMembers) next = nextMembers.dataMembers->first;
1933 if(nextMembers.type == dataMembersInit)
1935 MemberInit nextMember;
1937 for(nextMember = next; nextMember;
1938 nextMember = next, next = nextMember ? nextMember.next : null)
1940 Identifier nextID = nextMember.identifiers->first;
1941 if(nextMember.identifiers &&
1942 nextMember.identifiers->count > 1 &&
1943 !strcmp(firstID.string, nextID.string))
1945 nextMembers.dataMembers->Remove(nextMember);
1946 nextMember.identifiers->Remove(nextID);
1947 ListAdd(partList, nextMember);
1953 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1954 MkListOne(MkMembersInitList(partList))));
1957 member.identifiers = null;
1965 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1966 if(curMember == dataMember)
1968 if(dataMember.isProperty)
1970 if(!((Property)dataMember).Set)
1972 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1988 if(dataMember.isProperty) continue;
1989 if(member && member.initializer && member.initializer.type == expInitializer)
1991 Expression memberExp = null;
1992 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1993 member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
1995 OldList * subList = MkList();
1996 ProcessBracketInst(member.initializer.exp.instance, subList);
1997 FreeExpression(member.initializer.exp);
1998 member.initializer.exp = null;
1999 ListAdd(list, MkInitializerList(subList));
2003 member.initializer.exp.usage.usageGet = true;
2004 ProcessExpression(member.initializer.exp);
2005 ListAdd(list, MkInitializerAssignment(CopyExpression(member.initializer.exp)));
2009 // member.exp = null;
2010 member.takeOutExp = true;
2012 else if(member && member.initializer && member.initializer.type == listInitializer)
2014 ListAdd(list, member.initializer);
2015 member.initializer = null;
2017 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/)
2021 if(!dataMember.dataType)
2022 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2023 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
2025 if(classSym && classSym.registered && classSym.registered.type == structClass)
2027 OldList * subList = MkList();
2028 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
2029 Instantiation inst = MkInstantiation(spec, null, null);
2030 ProcessBracketInst(inst, subList);
2032 ListAdd(list, MkInitializerList(subList));
2034 else if(dataMember.dataType.kind == arrayType)
2035 ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
2037 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2043 if(inst.members && inst.members->first)
2045 MembersInit members;
2046 MemberInit member = null;
2048 for(members = inst.members->first; members; members = members.next)
2050 if(members.type == dataMembersInit)
2052 for(member = members.dataMembers->first; member; member = member.next)
2054 if(member.takeOutExp)
2056 FreeInitializer(member.initializer);
2057 member.initializer = null;
2067 static Declaration curDecl;
2068 static int declTempCount;
2070 static void ProcessDeclaration(Declaration decl)
2075 case initDeclaration:
2077 if(!curDecl) { curDecl = decl; declTempCount = 0; }
2081 for(s = decl.specifiers->first; s; s = s.next)
2083 ProcessSpecifier(s);
2086 if(decl.declarators)
2090 for(d = decl.declarators->first; d; d = d.next)
2093 ProcessInitializer(d.initializer);
2096 if(curDecl == decl) { curDecl = null; declTempCount = 0; }
2099 case instDeclaration:
2101 Instantiation inst = decl.inst;
2105 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
2110 if(!inst.isConstant || (classSym && classSym.registered && (classSym.registered.type == normalClass || classSym.registered.type == noHeadClass)))
2112 // If this instantiation is outside, turn it into a declaration plus an instantiation expression
2113 decl.type = initDeclaration;
2114 decl.specifiers = MkListOne(MkSpecifierName/*MkClassName*/(inst._class.name));
2115 if(decl.declMode == staticAccess)
2117 decl.specifiers->Insert(null, MkSpecifier(STATIC));
2119 decl.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst.exp.identifier.string)), null));
2121 ProcessDeclaration(decl);
2122 CreateInstancesBody();
2125 Expression exp = MkExpInstance(inst);
2126 stmt = MkExpressionStmt(MkListOne(exp)); // MkExpOp(inst.exp, '=',
2127 ListAdd(createInstancesBody.compound.statements, stmt);
2128 ProcessExpressionType(exp);
2131 if(classSym && classSym.registered && (classSym.registered.type == normalClass))
2133 ListAdd(createInstancesBody.compound.statements,
2134 MkExpressionStmt(MkListOne(MkExpCall(
2135 MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
2136 MkListOne(CopyExpression(inst.exp))))));
2138 // We'd like the = 0 as well...
2140 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2141 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2142 ProcessExpressionType(exp);
2145 else if(classSym && classSym.registered && (classSym.registered.type == noHeadClass))
2147 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2148 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2149 ProcessExpressionType(exp);
2155 // Precompiler won't know if this isn't constant
2156 CreateInstancesBody();
2161 char className[1024];
2163 decl.type = initDeclaration;
2164 decl.specifiers = MkList();
2165 decl.declarators = MkList();
2167 // Replace instantiation here
2168 if(classSym && classSym.registered && classSym.registered.type == bitClass)
2170 OldList list = { 0 };
2172 // Put the instantiation in an InitDeclarator...
2173 ProcessInstMembers(inst, inst.exp, &list, false);
2174 ProcessExpression(inst.exp);
2176 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2177 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2178 MkInitializerAssignment(list.first)));
2179 inst.exp.identifier = null;
2181 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
2183 OldList list = { 0 };
2185 // Put the instantiation in an InitDeclarator...
2186 ProcessInstMembers(inst, inst.exp, &list, false);
2187 ProcessExpression(inst.exp);
2189 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2190 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2191 MkInitializerAssignment(list.first)));
2193 inst.exp.identifier = null;
2195 else if(classSym && classSym.registered && classSym.registered.type == structClass)
2199 DeclareStruct(inst._class.name, false);
2201 strcpy(className, "__ecereClass_");
2202 FullClassNameCat(className, classSym.string, true);
2203 MangleClassName(className);
2204 DeclareClass(classSym, className);
2207 ProcessExpression(inst.exp);
2209 // Put the instantiation in an InitDeclarator...
2213 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2214 ListAdd(decl.declarators,
2215 MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
2216 inst.exp.identifier = null;
2220 OldList * list = MkList();
2221 if(ProcessBracketInst(inst, list))
2223 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2224 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2225 MkInitializerList(list)));
2226 inst.exp.identifier = null;
2230 // If bracket instantiation failed (property: for conversions only?)
2231 // TODO: (Fix this so it initializes members through brackets,
2232 // and then does properties)
2235 // TESTING THIS MEMORY LEAK FIX:
2236 FreeList(list, FreeInitializer);
2238 exp = MkExpBrackets(MkList());
2239 ProcessInstMembers(inst, inst.exp, exp.list, true);
2240 ListAdd(exp.list, CopyExpression(inst.exp));
2241 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2242 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2243 MkInitializerAssignment(exp)));
2244 inst.exp.identifier = null;
2253 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
2254 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
2257 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
2258 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
2262 strcpy(className, "__ecereClass_");
2264 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
2266 classSym = FindClass(classSym.registered.templateClass.fullName);
2267 FullClassNameCat(className, classSym.string, true);
2270 FullClassNameCat(className, inst._class.name, true);
2271 MangleClassName(className);
2273 DeclareClass(classSym, className); // THIS WAS IN C VERSION BUT NOT IN eC VERSION?
2274 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
2275 ProcessExpressionType(newCall);
2276 newCall.byReference = true;
2280 DeclareClass(classSym, className);
2284 Expression exp, newExp;
2285 Identifier id = CopyIdentifier(inst.exp.identifier);
2287 // Put the instantiation in an InitDeclarator...
2288 if(inst.members && inst.members->first)
2290 newExp = MkExpOp(CopyExpression(inst.exp), '=', newCall);
2292 exp = MkExpBrackets(MkList());
2293 ListAdd(exp.list, newExp);
2294 ProcessInstMembers(inst, inst.exp, exp.list, false);
2295 ListAdd(exp.list, inst.exp);
2297 ProcessExpression(inst.exp);
2299 // Take it out since we're using it...
2305 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2306 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id),
2307 MkInitializerAssignment(exp)));
2308 //inst.exp.identifier = null;
2311 FreeExpression(newCall);
2317 ProcessInstantiation(inst);
2320 case structDeclaration:
2325 for(spec = decl.specifiers->first; spec; spec = spec.next)
2326 ProcessSpecifier(spec);
2333 static void ProcessStatement(Statement stmt)
2339 if(stmt.labeled.stmt)
2340 ProcessStatement(stmt.labeled.stmt);
2343 if(stmt.caseStmt.exp)
2344 ProcessExpression(stmt.caseStmt.exp);
2345 if(stmt.caseStmt.stmt)
2346 ProcessStatement(stmt.caseStmt.stmt);
2350 if(stmt.compound.context)
2354 Statement prevCompound = curCompound;
2355 Context prevContext = curContext;
2357 if(!stmt.compound.isSwitch)
2360 curContext = stmt.compound.context;
2363 if(stmt.compound.declarations)
2365 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
2366 ProcessDeclaration(decl);
2368 if(stmt.compound.statements)
2370 for(s = stmt.compound.statements->first; s; s = s.next)
2372 ProcessStatement(s);
2376 curCompound = prevCompound;
2377 curContext = prevContext;
2381 case expressionStmt:
2384 if(stmt.expressions)
2386 for(exp = stmt.expressions->first; exp; exp = exp.next)
2388 ProcessExpression(exp);
2397 ((Expression)stmt.ifStmt.exp->last).usage.usageGet = true;
2398 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
2400 ProcessExpression(exp);
2402 if(stmt.ifStmt.stmt)
2403 ProcessStatement(stmt.ifStmt.stmt);
2404 if(stmt.ifStmt.elseStmt)
2405 ProcessStatement(stmt.ifStmt.elseStmt);
2411 ((Expression)stmt.switchStmt.exp->last).usage.usageGet = true;
2412 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
2413 ProcessExpression(exp);
2414 ProcessStatement(stmt.switchStmt.stmt);
2419 if(stmt.whileStmt.exp)
2423 ((Expression)stmt.whileStmt.exp->last).usage.usageGet = true;
2424 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
2426 ProcessExpression(exp);
2429 if(stmt.whileStmt.stmt)
2430 ProcessStatement(stmt.whileStmt.stmt);
2435 if(stmt.doWhile.exp)
2438 ((Expression)stmt.doWhile.exp->last).usage.usageGet = true;
2439 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
2441 ProcessExpression(exp);
2444 if(stmt.doWhile.stmt)
2445 ProcessStatement(stmt.doWhile.stmt);
2451 if(stmt.forStmt.init)
2452 ProcessStatement(stmt.forStmt.init);
2454 if(stmt.forStmt.check && stmt.forStmt.check.expressions)
2456 ((Expression)stmt.forStmt.check.expressions->last).usage.usageGet = true;
2459 if(stmt.forStmt.check)
2460 ProcessStatement(stmt.forStmt.check);
2461 if(stmt.forStmt.increment)
2463 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
2464 ProcessExpression(exp);
2466 if(stmt.forStmt.stmt)
2467 ProcessStatement(stmt.forStmt.stmt);
2479 if(stmt.expressions && stmt.expressions->last)
2481 ((Expression)stmt.expressions->last).usage.usageGet = true;
2482 for(exp = stmt.expressions->first; exp; exp = exp.next)
2484 ProcessExpression(exp);
2489 case badDeclarationStmt:
2491 ProcessDeclaration(stmt.decl);
2497 if(stmt.asmStmt.inputFields)
2499 for(field = stmt.asmStmt.inputFields->first; field; field = field.next)
2500 if(field.expression)
2501 ProcessExpression(field.expression);
2503 if(stmt.asmStmt.outputFields)
2505 for(field = stmt.asmStmt.outputFields->first; field; field = field.next)
2506 if(field.expression)
2507 ProcessExpression(field.expression);
2509 if(stmt.asmStmt.clobberedFields)
2511 for(field = stmt.asmStmt.clobberedFields->first; field; field = field.next)
2512 if(field.expression)
2513 ProcessExpression(field.expression);
2519 static void ProcessFunction(FunctionDefinition function)
2523 yylloc = function.loc;
2524 ProcessStatement(function.body);
2528 /////////// INSTANTIATIONS / DATA TYPES PASS /////////////////////////////////////////////
2529 public void ProcessInstantiations()
2532 // Is this still needed?
2533 //CreateInstancesBody();
2535 for(external = ast->first; external; external = external.next)
2537 curExternal = external;
2538 if(external.type == declarationExternal)
2540 //currentClass = external.function._class;
2541 if(external.declaration)
2542 ProcessDeclaration(external.declaration);
2544 else if(external.type == functionExternal)
2546 //currentClass = null;
2547 ProcessFunction(external.function);
2549 else if(external.type == classExternal)
2551 ClassDefinition _class = external._class;
2552 //currentClass = external.symbol.registered;
2553 if(_class.definitions)
2556 //Class regClass = _class.symbol.registered;
2558 // Process all functions
2559 for(def = _class.definitions->first; def; def = def.next)
2561 if(def.type == functionClassDef)
2563 curExternal = def.function.declarator ? def.function.declarator.symbol.pointerExternal : external;
2564 ProcessFunction((FunctionDefinition)def.function);
2566 else if(def.type == declarationClassDef && def.decl.type == instDeclaration)
2568 ProcessInstantiation(def.decl.inst);
2570 else if(def.type == defaultPropertiesClassDef && def.defProperties)
2572 MemberInit defProperty;
2574 // Add this to the context
2577 string = CopyString("this");
2578 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2580 globalContext.symbols.Add((BTNode)thisSymbol);
2582 for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
2584 //thisClass = regClass;
2585 ProcessMemberInitData(defProperty); ///*, regClass, &id
2589 globalContext.symbols.Remove((BTNode)thisSymbol);
2590 FreeSymbol(thisSymbol);
2592 else if(def.type == propertyClassDef && def.propertyDef)
2594 PropertyDef prop = def.propertyDef;
2596 // Add this to the context
2599 string = CopyString("this");
2600 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2602 globalContext.symbols.Add((BTNode)thisSymbol);
2604 //thisClass = regClass;
2607 curExternal = prop.symbol ? prop.symbol.externalSet : null;
2608 ProcessStatement(prop.setStmt);
2612 curExternal = prop.symbol ? prop.symbol.externalGet : null;
2613 ProcessStatement(prop.getStmt);
2617 curExternal = prop.symbol ? prop.symbol.externalIsSet : null;
2618 ProcessStatement(prop.issetStmt);
2622 globalContext.symbols.Remove((BTNode)thisSymbol);
2623 FreeSymbol(thisSymbol);
2625 else if(def.type == propertyWatchClassDef && def.propertyWatch)
2627 PropertyWatch propertyWatch = def.propertyWatch;
2629 // Add this to the context
2632 string = CopyString("this");
2633 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2635 globalContext.symbols.Add((BTNode)thisSymbol);
2637 //thisClass = regClass;
2638 if(propertyWatch.compound)
2642 string = CopyString("this");
2643 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2645 propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
2647 ProcessStatement(propertyWatch.compound);
2649 // thisClass = null;
2651 //globalContext.symbols.Delete((BTNode)thisSymbol);
2652 globalContext.symbols.Remove((BTNode)thisSymbol);
2653 FreeSymbol(thisSymbol);