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 FixModuleName(moduleName);
29 sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
31 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
34 FunctionDefinition function = _MkFunction(specifiers, declarator, null, false);
35 ProcessFunctionBody(function, createInstancesBody);
36 ListAdd(ast, MkExternalFunction(function));
39 // Destroy Instances Body
40 destroyInstancesBody = MkCompoundStmt(null, MkList());
41 destroyInstancesBody.compound.context = Context { parent = globalContext };
43 specifiers = MkList();
44 ListAdd(specifiers, MkSpecifier(VOID));
46 sprintf(registerName, "__ecereDestroyModuleInstances_%s", moduleName);
48 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
51 FunctionDefinition function = _MkFunction(specifiers, declarator, null, false);
52 ProcessFunctionBody(function, destroyInstancesBody);
53 ListAdd(ast, MkExternalFunction(function));
58 // ***************** EXPRESSION PROCESSING ***************************
59 static void ProcessMemberInitData(MemberInit member)
61 if(member.initializer)
62 ProcessInitializer(member.initializer);
65 static void ProcessInstantiation(Instantiation inst)
67 if(inst.members && inst.members->first)
70 for(members = inst.members->first; members; members = members.next)
72 if(members.type == dataMembersInit)
74 if(members.dataMembers)
77 for(member = members.dataMembers->first; member; member = member.next)
78 ProcessMemberInitData(member);
81 else if(members.type == methodMembersInit)
83 ProcessFunction((FunctionDefinition)members.function);
89 // ADDED TO SUPPORT NESTED UNNAMED STRUCTURES
90 static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Instantiation inst, Expression instExp, OldList list, bool zeroOut)
92 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
94 // For simple classes, ensure all members are initialized
96 DataMember dataMember;
97 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
99 if(!dataMember.isProperty)
101 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
103 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
108 bool memberFilled = false;
109 if(inst.members && inst.members->first)
111 Class curClass = null;
112 DataMember curMember = null;
113 DataMember subMemberStack[256];
114 int subMemberStackPos = 0;
117 for(members = inst.members->first; members; members = members.next)
119 if(members.type == dataMembersInit)
121 MemberInit member = null;
122 for(member = members.dataMembers->first; member; member = member.next)
124 if(member.identifiers)
126 Identifier firstID = member.identifiers->first;
127 DataMember _subMemberStack[256];
128 int _subMemberStackPos = 0;
129 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
132 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
135 if(thisMember && thisMember.memberAccess == publicAccess)
137 curMember = thisMember;
138 curClass = curMember._class;
139 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
140 subMemberStackPos = _subMemberStackPos;
142 if(!firstID.next && thisMember == dataMember)
150 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
153 curMember = link.data;
154 if(!firstID.next && curMember == dataMember)
164 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
165 if(curMember == dataMember)
172 curMember = curMember.next;
174 curMember = parentMember.members.first;
178 // curMember = curMember.next;
181 if(memberFilled) break;
183 if(memberFilled) break;
190 Expression instExpCopy = CopyExpression(instExp);
191 Expression memberExp;
193 Expression value = MkExpConstant("0");
195 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
196 memberExp.member.memberType = MemberType::dataMember;
198 value.usage.usageGet = true;
199 setExp = MkExpOp(memberExp, '=', value);
201 value.loc = inst.loc;
204 setExp.loc = inst.loc;
206 FreeType(instExpCopy.expType);
207 instExpCopy.expType = instExp.expType;
208 if(instExp.expType) instExp.expType.refCount++;
210 ProcessExpressionType(setExp);
211 ProcessExpression(setExp);
213 ListAdd(list, setExp);
220 if(parentMember.type == unionMember)
227 // Returns if all members are set
228 static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList list, bool zeroOut)
231 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
232 bool fullSet = true, convert = false;
233 if(classSym && classSym.registered && classSym.registered.type == bitClass)
235 Expression exp = null;
236 if(inst.members && inst.members->first)
238 // Ensure all members are initialized only once
240 while(_class != classSym.registered)
242 BitMember bitMember = null;
243 Class lastClass = _class;
245 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
247 for(bitMember = _class.membersAndProperties.first; bitMember; bitMember = bitMember.next)
249 BitMember curMember = null;
250 Class curClass = null;
251 DataMember subMemberStack[256];
252 int subMemberStackPos = 0;
253 MemberInit member = null;
255 for(members = inst.members->first; members; members = members.next)
257 if(members.type == dataMembersInit)
259 for(member = members.dataMembers->first; member; member = member.next)
261 if(member.identifiers)
263 Identifier firstID = member.identifiers->first;
264 DataMember _subMemberStack[256];
265 int _subMemberStackPos = 0;
268 BitMember thisMember = (BitMember)eClass_FindDataMember(_class, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
271 // WARNING: Brackets needed here, awaiting precomp fix
272 thisMember = (BitMember)eClass_FindProperty(_class, firstID.string, privateModule);
274 if(thisMember && thisMember.memberAccess == publicAccess)
276 curMember = thisMember;
277 curClass = curMember._class;
278 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
279 subMemberStackPos = _subMemberStackPos;
281 if(thisMember == bitMember)
289 eClass_FindNextMember(classSym.registered, &curClass, (DataMember *)&curMember, subMemberStack, &subMemberStackPos);
290 if(curMember == bitMember)
303 if(!bitMember.isProperty)
305 Expression part = null;
306 OldList * specs = MkList();
308 //decl = SpecDeclFromString(bitMember.dataTypeString, specs, null);
309 decl = SpecDeclFromString(_class.dataTypeString, specs, null);
311 ProcessInitializer(member.initializer);
313 if(member.initializer && member.initializer.type == expInitializer)
318 sprintf(pos, "%d", bitMember.pos);
319 // (((type) value) << bitPos)
320 part = MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(
321 MkTypeName(specs, decl), MkExpBrackets(MkListOne(member.initializer.exp))))), LEFT_OP, MkExpConstant(pos))));
324 part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl),
325 MkExpBrackets(MkListOne(member.initializer.exp)))));
327 member.initializer.exp = null;
328 FreeInitializer(member.initializer);
329 member.initializer = null;
333 exp = MkExpOp(exp,'|', part);
337 // Clean this up... should only be used for Conversion properties...
340 char setName[1024], getName[1024];
341 DeclareProperty((Property)bitMember, setName, getName);
342 if(member.initializer && member.initializer.type == expInitializer)
344 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)),
345 MkListOne(member.initializer.exp));
348 member.initializer.exp = null;
349 FreeInitializer(member.initializer);
350 member.initializer = null;
358 exp = MkExpBrackets(MkListOne(exp));
360 exp = MkExpConstant("0");
362 // Just added this one...
363 exp.expType = MkClassType(classSym.string);
365 ProcessExpression(exp);
369 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
371 Class _class = classSym.registered;
372 Expression exp = null;
373 if(inst.members && inst.members->first)
375 MemberInit member = null;
376 Property prop = null;
378 for(members = inst.members->first; members; members = members.next)
380 if(members.type == dataMembersInit)
382 for(member = members.dataMembers->first; member; member = member.next)
384 if(member.identifiers)
386 Identifier firstID = member.identifiers->first;
387 prop = eClass_FindProperty(_class, firstID.string, privateModule);
409 char setName[1024], getName[1024];
410 DeclareProperty(prop, setName, getName);
411 if(member.initializer && member.initializer.type == expInitializer)
413 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member.initializer.exp));
416 member.initializer.exp = null;
417 FreeInitializer(member.initializer);
418 member.initializer = null;
423 ProcessInitializer(member.initializer);
424 if(member.initializer && member.initializer.type == expInitializer)
426 //exp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(_class.fullName, null), member.exp)));
427 exp = MkExpCast(QMkClass(_class.fullName, null), MkExpBrackets(MkListOne(member.initializer.exp)));
430 member.initializer.exp = null;
431 FreeInitializer(member.initializer);
432 member.initializer = null;
438 exp = MkExpBrackets(MkListOne(exp));
440 exp = MkExpConstant("0");
442 ProcessExpression(exp);
446 else if(classSym && classSym.registered)
448 if(classSym.registered.type == structClass)
450 // For simple classes, ensure all members are initialized
452 while(_class != classSym.registered)
454 DataMember dataMember;
455 Class lastClass = _class;
457 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
459 if(_class.structSize != _class.memberOffset)
462 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
464 if(!dataMember.isProperty)
466 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
468 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
473 bool memberFilled = false;
474 if(inst.members && inst.members->first)
476 Class curClass = null;
477 DataMember curMember = null;
478 DataMember subMemberStack[256];
479 int subMemberStackPos = 0;
481 for(members = inst.members->first; members; members = members.next)
483 if(members.type == dataMembersInit && members.dataMembers)
485 MemberInit member = null;
486 for(member = members.dataMembers->first; member; member = member.next)
488 if(member.identifiers)
490 DataMember _subMemberStack[256];
491 int _subMemberStackPos = 0;
492 Identifier firstID = member.identifiers->first;
493 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
496 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
499 if(thisMember.memberAccess == publicAccess)
501 curMember = thisMember;
502 curClass = curMember._class;
503 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
504 subMemberStackPos = _subMemberStackPos;
506 if(!firstID.next && curMember == dataMember)
515 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
516 if(curMember == dataMember)
523 if(memberFilled) break;
525 if(memberFilled) break;
532 Expression instExpCopy = CopyExpression(instExp);
533 Expression memberExp;
535 Expression value = MkExpConstant("0");
537 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
538 memberExp.member.memberType = MemberType::dataMember;
540 value.usage.usageGet = true;
541 setExp = MkExpOp(memberExp, '=', value);
543 value.loc = inst.loc;
546 setExp.loc = inst.loc;
548 FreeType(instExpCopy.expType);
549 instExpCopy.expType = instExp.expType;
550 if(instExp.expType) instExp.expType.refCount++;
552 ProcessExpressionType(setExp);
553 ProcessExpression(setExp);
555 ListAdd(list, setExp);
565 // THEN SET EVERYTHING IN THE ORDER IT IS SET
566 if(inst.members && inst.members->first)
568 Class curClass = null;
569 DataMember curMember = null;
570 DataMember subMemberStack[256];
571 int subMemberStackPos = 0;
573 for(members = inst.members->first; members; members = members.next)
575 if(members.type == dataMembersInit && members.dataMembers)
577 MemberInit member = null;
578 Method method = null;
580 for(member = members.dataMembers->first; member; member = member.next)
582 Identifier ident = null;
583 DataMember thisMember = null;
584 if(member.identifiers)
586 DataMember _subMemberStack[256];
587 int _subMemberStackPos = 0;
588 Identifier firstID = member.identifiers->first;
589 thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
592 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
596 if(thisMember.memberAccess == publicAccess)
598 curMember = thisMember;
599 curClass = curMember._class;
600 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
601 subMemberStackPos = _subMemberStackPos;
604 else if(classSym.registered.type != structClass)
606 method = eClass_FindMethod(classSym.registered, ident.string, privateModule);
607 if(!method || method.type != virtualMethod)
613 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
614 thisMember = curMember;
617 if(instExp && (thisMember || method))
619 Expression instExpCopy = CopyExpression(instExp);
620 Expression setExp = null;
622 instExpCopy.tempCount = instExp.tempCount;
625 ident = MkIdentifier(thisMember.name);
628 Expression memberExp;
629 bool freeMemberExp = false;
631 if(thisMember && thisMember.isProperty && ((Property)thisMember).conversion)
633 if(member.identifiers && member.identifiers->count > 1)
635 Identifier id = member.identifiers->first;
636 // TODO: Set the member types for those
637 memberExp = MkExpMember(instExpCopy, id);
638 for(id = id.next; id; id = id.next)
639 memberExp = MkExpMember(memberExp, id);
642 memberExp = MkExpMember(instExpCopy, ident);
644 if(member.initializer && member.initializer.type == expInitializer && member.initializer.exp)
646 member.initializer.exp.usage.usageGet = true;
647 setExp = MkExpOp(memberExp, '=', member.initializer.exp);
650 member.initializer.exp = null;
651 FreeInitializer(member.initializer);
652 member.initializer = null;
656 freeMemberExp = true;
657 // TOCHECK: WHat happens in here?
659 // TODO: list initializer not working...
660 memberExp.loc = inst.loc;
662 if(member.identifiers)
663 member.identifiers->Clear();
667 setExp.loc = inst.loc;
669 FreeType(instExpCopy.expType);
670 instExpCopy.expType = instExp.expType;
671 if(instExp.expType) instExp.expType.refCount++;
675 ProcessExpressionType(setExp);
676 ProcessExpression(setExp);
678 ListAdd(list, setExp);
681 FreeExpression(memberExp);
689 return fullSet || convert;
692 public void DeclareClass(Symbol classSym, char * className)
694 /*if(classSym.registered.templateClass)
697 char className[1024];
698 strcpy(className, "__ecereClass_");
699 templateSym = FindClass(classSym.registered.templateClass.fullName);
700 FullClassNameCat(className, templateSym.string, true);
701 MangleClassName(className);
703 DeclareClass(templateSym, className);
705 if(classSym && classSym.id == MAXINT)
707 // Add Class declaration as extern
709 OldList * specifiers, * declarators;
712 if(!classSym._import)
714 // TESTING: DANGER HERE... CHECK FOR TEMPLATES ONLY? SET classSym.module ELSEWHERE?
715 // if(!classSym.module) return;
716 if(!classSym.module) classSym.module = mainModule;
717 if(!classSym.module) return;
718 classSym._import = ClassImport
720 isRemote = classSym.registered ? classSym.registered.isRemote : false;
721 name = CopyString(classSym.string);
723 classSym.module.classes.Add(classSym._import);
725 classSym._import.itself = true;
727 specifiers = MkList();
728 declarators = MkList();
730 ListAdd(specifiers, MkSpecifier(EXTERN));
731 ListAdd(specifiers, MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null));
733 d = MkDeclaratorPointer(MkPointer(null, null),
734 MkDeclaratorIdentifier(MkIdentifier(className)));
736 ListAdd(declarators, MkInitDeclarator(d, null));
738 decl = MkDeclaration(specifiers, declarators);
742 ast->Insert(curExternal.prev, (classSym.pointerExternal = MkExternalDeclaration(decl)));
743 // classSym.id = curExternal.symbol.id;
746 classSym.id = curExternal.symbol ? curExternal.symbol.idCode : 0;
748 classSym.idCode = classSym.id;
751 else if(classSym && curExternal && curExternal.symbol.idCode < classSym.id)
752 //else if(curExternal.symbol.id <= classSym.id)
754 // DANGER: (Moved here)
755 if(classSym.structExternal)
756 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
758 // Move _class declaration higher...
759 ast->Move(classSym.pointerExternal, curExternal.prev);
763 if(classSym.structExternal)
764 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
767 // TOFIX: For non simple classes, Class is in pointerExternal and actual struct in structExternal
768 if(classSym.structExternal)
769 ast->Move(classSym.structExternal, classSym.pointerExternal);
771 classSym.id = curExternal.symbol.idCode;
773 classSym.idCode = classSym.id;
777 void ProcessExpressionInstPass(Expression exp)
779 ProcessExpression(exp);
782 static void ProcessExpression(Expression exp)
785 char debugExpString[1024] = "";
786 PrintExpression(exp, debugExpString);
794 Instantiation inst = exp.instance;
795 if(inCompiler && inst._class)
797 char className[1024];
798 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
801 if(classSym && classSym.registered && classSym.registered.type == bitClass)
805 OldList list = { 0 };
807 ProcessInstMembers(inst, null, &list, false);
809 ProcessExpression(inst.exp);
811 //Why was this here twice? ProcessInstMembers(inst, null, &list);
814 exp.op.exp1 = inst.exp;
815 exp.op.exp2 = list.first;
817 // Take expression out... (Why was the comment alone?)
822 Type expType = exp.expType;
823 Expression prev = exp.prev, next = exp.next;
825 ProcessInstMembers(inst, null, &list, false);
828 FreeType(exp.destType);
830 *exp = *(Expression)list.first;
833 Expression firstExp = list.first;
837 FreeType(exp.destType);
838 exp.destType = expType;
839 //if(expType) expType.refCount++;
845 else if(classSym && classSym.registered && (classSym.registered.type == unitClass || classSym.registered.type == enumClass))
849 OldList list = { 0 };
852 ProcessInstMembers(inst, null, &list, false);
854 ProcessExpression(inst.exp);
856 //Why was this here twice? ProcessInstMembers(inst, null, &list);
859 exp.op.exp1 = inst.exp;
860 exp.op.exp2 = list.first;
862 // Take expression out... (Why was the comment alone?)
865 list.Remove(list.first);
866 while(e = list.first)
874 Expression prev = exp.prev, next = exp.next;
875 Type expType = exp.expType;
876 OldList list = { 0 };
877 ProcessInstMembers(inst, null, &list, false);
882 Expression e = list.first;
883 FreeType(exp.destType);
887 exp.expType = expType;
890 while(e = list.first)
898 exp.type = constantExp;
899 exp.constant = CopyString("0");
903 else if(classSym && classSym.registered && classSym.registered.type == structClass)
908 exp.type = bracketsExp;
911 ProcessInstMembers(inst, inst.exp, exp.list, false);
913 ProcessExpression(inst.exp);
917 exp.type = (ExpressionType)1000; // remove expression
920 // Take expression out...
926 Declaration dummyDecl;
927 // Unnamed instantiation
929 // Make a declaration in the closest compound statement
930 // (Do not reuse (since using address for function calls)...)
933 ListAdd(decls, MkInitDeclarator(
934 MkDeclaratorIdentifier(MkIdentifier(className)), null));
935 decl = MkDeclaration(specs, decls);
937 /* Never mind this... somebody might modify the values...
941 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
942 inst.id = MkIdentifier(className);
943 decl = MkDeclarationInst(inst);
944 exp.type = ExpIdentifier;
945 exp.identifier = inst.id;
946 if(!curCompound.compound.declarations)
947 curCompound.compound.declarations = MkList();
948 curCompound.compound.declarations->Insert(null, decl);
949 ProcessDeclaration(decl);
955 //OldList * specs = MkList(), * decls = MkList();
956 //sprintf(className, "__ecereClassData_%s", inst._class.name);
957 //ListAdd(specs, MkStructOrUnion(SpecifierStruct, MkIdentifier(className), null));
960 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
961 dummyDecl = MkDeclaration(null,null);
962 if(!curCompound.compound.declarations)
963 curCompound.compound.declarations = MkList();
964 curCompound.compound.declarations->Insert(null, dummyDecl);
966 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
969 OldList * list = MkList();
970 if(inst.isConstant && ProcessBracketInst(inst, list))
972 decl = MkDeclaration(MkList(), MkList());
974 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
975 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)),
976 MkInitializerList(list)));
978 exp.type = identifierExp;
979 exp.identifier = MkIdentifier(className);
986 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst._class), MkExpIdentifier(MkIdentifier(className)), null));
989 // Set properties & data members in expression
990 // to handle jump and control statements
991 // Set unset data members to 0
992 exp.type = bracketsExp;
995 instExp = QMkExpId(className);
996 instExp.loc = exp.loc;
997 instExp.expType = MkClassType(inst._class.name);
999 // Mark the declarated instance as fullset so it doesn't need to be zeroed out
1000 decl.inst.fullSet = ProcessInstMembers(inst, instExp, exp.list, false);
1002 ListAdd(exp.list, instExp);
1006 FreeType(exp.expType);
1007 exp.expType = MkClassType(inst._class.name);
1009 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
1011 void * prev = dummyDecl.prev, * next = dummyDecl.next;
1013 dummyDecl.prev = prev;
1014 dummyDecl.next = next;
1018 ProcessDeclaration(decl);
1021 if(!curCompound.compound.declarations)
1022 curCompound.compound.declarations = MkList();
1023 curCompound.compound.declarations->Insert(null, decl);
1032 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
1033 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
1036 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
1037 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
1038 newCall.byReference = true;
1042 strcpy(className, "__ecereClass_");
1043 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
1045 classSym = FindClass(classSym.registered.templateClass.fullName);
1046 FullClassNameCat(className, classSym.string, true);
1049 FullClassNameCat(className, inst._class.name, true);
1051 MangleClassName(className);
1052 DeclareClass(classSym, className);
1053 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
1055 ProcessExpressionType(newCall);
1056 newCall.byReference = true;
1061 if(inst.members && inst.members->first)
1063 exp.type = bracketsExp;
1064 exp.list = MkList();
1068 ListAdd(exp.list, MkExpOp(inst.exp, '=', newCall));
1071 FreeExpression(newCall);
1073 ProcessInstMembers(inst, inst.exp, exp.list, false);
1076 FreeExpression(inst.exp);
1082 exp.op.exp1 = inst.exp;
1083 exp.op.exp2 = newCall;
1085 ProcessExpression(inst.exp);
1091 // Unnamed instantiation
1092 if(inst.members && inst.members->first)
1094 char ecereTemp[100];
1095 MembersInit members;
1096 int tempCount = exp.tempCount;
1099 // Check if members use temp count...
1100 for(members = inst.members->first; members; members = members.next)
1102 if(members.type == dataMembersInit && members.dataMembers)
1105 for(member = members.dataMembers->first; member; member = member.next)
1107 if(member.initializer && member.initializer.type == expInitializer)
1109 ProcessMemberInitData(member); // ADDED THIS TO HAVE PROPER tempCount ALREADY...
1110 tempCount = Max(tempCount, member.initializer.exp.tempCount);
1116 tempCount = Max(tempCount, declTempCount);
1119 curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
1120 sprintf(ecereTemp, "__ecereInstance%d", tempCount);
1121 exp.type = extensionCompoundExp;
1122 exp.compound = MkCompoundStmt(null, null);
1123 exp.compound.compound.context = PushContext();
1124 exp.compound.compound.context.simpleID = exp.compound.compound.context.parent.simpleID;
1125 exp.compound.compound.declarations = MkListOne(QMkDeclaration(inst._class.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)),
1126 MkInitializerAssignment(newCall))));
1127 exp.compound.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
1129 instExp = QMkExpId(ecereTemp);
1130 instExp.tempCount = tempCount;
1131 instExp.expType = MkClassType(inst._class.name);
1132 instExp.byReference = true;
1133 ProcessInstMembers(inst, instExp, expList, false);
1134 FreeExpression(instExp);
1138 Expression tmpExp = QMkExpId(ecereTemp);
1139 tmpExp.byReference = true;
1140 ListAdd(expList, tmpExp);
1142 exp.tempCount = tempCount;
1144 declTempCount = Max(declTempCount, tempCount);
1145 PopContext(exp.compound.compound.context);
1149 FreeType(newCall.destType);
1150 FreeType(newCall.expType);
1151 newCall.destType = exp.destType;
1152 newCall.expType = exp.expType;
1158 if(exp.type != instanceExp)
1162 ProcessInstantiation(inst);
1171 // if(exp._new.size) exp._new.size.usage.usageGet = true;
1172 ProcessExpression(exp._new.size);
1176 // if(exp._renew.size) exp._renew.size.usage.usageGet = true;
1177 ProcessExpression(exp._renew.size);
1178 // if(exp._renew.exp) exp._renew.exp.usage.usageGet = true;
1179 ProcessExpression(exp._renew.exp);
1183 bool assign = false;
1187 // Assignment Operators
1190 exp.op.exp2.usage.usageGet = true;
1192 exp.op.exp1.usage.usageSet = true;
1206 exp.op.exp2.usage.usageGet = true;
1209 exp.op.exp1.usage.usageSet = true;
1215 exp.op.exp1.usage.usageSet = true;
1220 if(exp.op.exp1 && exp.op.exp2)
1222 exp.op.exp1.usage.usageGet = true;
1223 exp.op.exp2.usage.usageGet = true;
1232 exp.op.exp1.usage.usageGet = true;
1237 exp.op.exp2.usage.usageGet = true;
1240 // Binary only operators
1256 exp.op.exp1.usage.usageGet = true;
1258 exp.op.exp2.usage.usageGet = true;
1264 // TEST: if(exp.op.exp2) exp.op.exp1.tempCount = Max(exp.op.exp1.tempCount, exp.op.exp2.tempCount);
1265 ProcessExpression(exp.op.exp1);
1266 // TEST: exp.tempCount = Max(exp.op.exp1.tempCount, exp.tempCount);
1271 // Don't use the temporaries used by the left side...
1273 // TEST: exp.op.exp2.tempCount = Max(exp.op.exp2.tempCount, exp.op.exp1.tempCount);
1274 exp.op.exp2.tempCount = exp.op.exp1.tempCount;
1275 ProcessExpression(exp.op.exp2);
1276 // TEST: exp.tempCount = Max(exp.op.exp2.tempCount, exp.tempCount);
1280 case extensionExpressionExp:
1284 for(e = exp.list->first; e; e = e.next)
1286 e.tempCount = Max(e.tempCount, exp.tempCount);
1289 e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true }));
1291 ProcessExpression(e);
1292 exp.tempCount = Max(exp.tempCount, e.tempCount);
1300 exp.index.exp.usage.usageGet = true;
1301 ProcessExpression(exp.index.exp);
1302 for(e = exp.index.index->first; e; e = e.next)
1305 e.usage.usageGet = true;
1306 ProcessExpression(e);
1308 // Ignore temps in the index for now...
1309 exp.tempCount = exp.index.exp.tempCount;
1311 if(exp.index.exp.expType)
1313 Type source = exp.index.exp.expType;
1314 if(source.kind == classType && source._class && source._class.registered && source._class.registered != containerClass &&
1315 eClass_IsDerived(source._class.registered, containerClass))
1317 Class _class = source._class.registered;
1318 // __extension__({ Iterator<type> i { container }; i.Index(e, [ exp.usage.usageSet ]; i.value; });
1320 char iteratorType[1024];
1321 OldList * declarations = MkList();
1322 OldList * statements = MkList();
1323 OldList * args = MkList();
1324 OldList * instMembers = MkList();
1326 Context context = PushContext();
1328 sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
1330 ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
1332 ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
1333 MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
1335 ListAdd(args, MkExpBrackets(exp.index.index));
1336 ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
1338 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
1339 MkIdentifier("Index")), args))));
1341 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
1343 exp.type = bracketsExp;
1344 exp.list = MkListOne(MkExpPointer(expExt = (MkExpExtensionCompound(MkCompoundStmt(declarations, statements))), MkIdentifier("data")));
1345 expExt.compound.compound.context = context;
1346 PopContext(context);
1347 expExt.usage = exp.usage;
1348 ProcessExpressionType(exp.list->first);
1349 ProcessExpression(exp.list->first);
1358 Method method = null;
1360 ProcessExpression(exp.call.exp);
1362 if(exp.call.arguments)
1364 for(e = exp.call.arguments->first; e; e = e.next)
1366 e.usage.usageGet = true;
1367 e.usage.usageArg = true;
1369 // TEST: e.tempCount = Max(e.tempCount, exp.tempCount);
1370 ProcessExpression(e);
1371 // TEST: exp.tempCount = Max(exp.tempCount, e.tempCount);
1378 exp.member.exp.usage.usageGet = true;
1379 ProcessExpression(exp.member.exp);
1381 // Must do this here so we can set the MemberType of deep properties inside instantiations
1382 if(!exp.member.memberType)
1384 Type type = exp.member.exp.expType;
1385 if((type && type.kind == classType && exp.member.member))
1387 // Check if it's an instance
1388 Class _class = (exp.member.member._class && exp.member.member.classSym) ? exp.member.member.classSym.registered : (type._class ? type._class.registered : null);
1389 Property prop = null;
1390 Method method = null;
1391 DataMember member = null;
1392 Property revConvert = null;
1394 // Prioritize data members over properties for "this"
1395 if(exp.member.thisPtr)
1397 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1399 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1401 // Prioritize properties over data members otherwise
1404 // Look for publicAccess Members first
1405 prop = eClass_FindProperty(_class, exp.member.member.string, null);
1407 member = eClass_FindDataMember(_class, exp.member.member.string, null, null, null);
1408 if(!prop && !member)
1410 method = eClass_FindMethod(_class, exp.member.member.string, null);
1413 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1415 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1419 if(!prop && !member && !method) // NOTE: Recently added the !method here, causes private methods to unprioritized
1420 method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
1421 if(!prop && !member && !method)
1423 Symbol classSym = FindClass(exp.member.member.string);
1426 Class convertClass = classSym.registered;
1428 revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
1434 exp.member.memberType = propertyMember;
1436 prop.dataType = ProcessTypeString(prop.dataTypeString, false);
1438 FreeType(exp.expType);
1439 exp.expType = prop.dataType;
1440 if(prop.dataType) prop.dataType.refCount++;
1444 exp.member.memberType = methodMember;
1445 if(!method.dataType)
1446 //method.dataType = ((Symbol)method.symbol).type;
1447 ProcessMethodType(method);
1449 FreeType(exp.expType);
1450 exp.expType = method.dataType;
1451 if(method.dataType) method.dataType.refCount++;
1455 exp.member.memberType = dataMember;
1456 DeclareStruct(_class.fullName, false);
1457 if(!member.dataType)
1458 member.dataType = ProcessTypeString(member.dataTypeString, false);
1460 FreeType(exp.expType);
1461 exp.expType = member.dataType;
1462 if(member.dataType) member.dataType.refCount++;
1466 exp.member.memberType = reverseConversionMember;
1468 FreeType(exp.expType);
1469 exp.expType = MkClassType(revConvert._class.fullName);
1472 printf($"Error: Couldn't find member %s in class %s\n",
1473 exp.member.member.string, _class.name);*/
1482 exp.cast.exp.usage.usageGet = true;
1483 ProcessExpression(exp.cast.exp);
1489 if(exp.usage.usageGet)
1490 exp.cond.cond.usage.usageGet = true;
1492 ProcessExpression(exp.cond.cond);
1493 for(e = exp.cond.exp->first; e; e = e.next)
1495 if(!e.next && exp.usage.usageGet) e.usage.usageGet = true;
1496 ProcessExpression(e);
1498 if(exp.cond.elseExp)
1500 if(exp.usage.usageGet) exp.cond.elseExp.usage.usageGet = true;
1501 ProcessExpression(exp.cond.elseExp);
1505 case extensionCompoundExp:
1507 if(exp.compound.compound.statements &&
1508 ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
1509 ((Statement)exp.compound.compound.statements->last).expressions &&
1510 ((Statement)exp.compound.compound.statements->last).expressions->last)
1512 ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
1514 ProcessStatement(exp.compound);
1519 ProcessExpression(exp.vaArg.exp);
1522 case extensionInitializerExp:
1524 ProcessInitializer(exp.initializer.initializer);
1528 CheckTemplateTypes(exp);
1531 static void ProcessInitializer(Initializer init)
1535 case expInitializer:
1536 init.exp.usage.usageGet = true;
1537 ProcessExpression(init.exp);
1539 case listInitializer:
1542 for(i = init.list->first; i; i = i.next)
1543 ProcessInitializer(i);
1549 static void ProcessSpecifier(Specifier spec)
1564 for(e = spec.list->first; e; e = e.next)
1567 ProcessExpression(e.exp);
1572 case structSpecifier:
1573 case unionSpecifier:
1576 if(spec.definitions)
1579 for(def = spec.definitions->first; def; def = def.next)
1581 if(def.type == declarationClassDef && def.decl && def.decl.type == structDeclaration)
1582 ProcessDeclaration(def.decl);
1588 case SpecifierClass:
1595 static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list)
1597 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1598 DataMember dataMember = null;
1599 bool someMemberSet = false;
1601 // For simple classes, ensure all members are initialized
1602 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1604 MembersInit members;
1605 MemberInit member = null;
1607 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1609 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1614 Class curClass = null;
1615 DataMember curMember = null;
1616 DataMember subMemberStack[256];
1617 int subMemberStackPos = 0;
1620 if(inst.members && inst.members->first)
1622 for(members = inst.members->first; members; members = members.next)
1624 if(members.type == dataMembersInit)
1626 for(member = members.dataMembers->first; member; member = member.next)
1628 if(member.identifiers)
1630 Identifier firstID = member.identifiers->first;
1632 DataMember _subMemberStack[256];
1633 int _subMemberStackPos = 0;
1634 DataMember thisMember;
1635 thisMember = firstID ? (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule) : null;
1636 // FILL MEMBER STACK
1637 if(!thisMember && firstID)
1638 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1639 if(thisMember && thisMember.memberAccess == publicAccess)
1641 curMember = thisMember;
1642 curClass = curMember._class;
1643 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1644 subMemberStackPos = _subMemberStackPos;
1647 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
1650 curMember = link.data;
1653 // Choose the first specified member of the union...
1654 if(parentMember.type == unionMember)
1657 dataMember = curMember;
1661 if(dataMember == thisMember)
1663 // Look for another member of this one and merge them
1664 // into one instantiation...
1665 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1667 OldList * partList = MkList();
1668 // TODO: We're assuming this is a simple class right now...
1671 MembersInit nextMembers;
1672 MemberInit next = member.next;
1674 if(!dataMember.dataType)
1675 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1676 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1677 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1680 OldList * identifiers = MkList();
1682 for(id = ((Identifier)member.identifiers->first).next; id; id = id.next)
1683 identifiers->Add(CopyIdentifier(id));
1685 // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
1686 // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
1687 /*member.identifiers->Remove(firstID);*/
1689 MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
1692 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1694 if(!nextMembers.dataMembers)
1697 if(members != nextMembers) next = nextMembers.dataMembers->first;
1699 if(nextMembers.type == dataMembersInit)
1701 MemberInit nextMember;
1703 for(nextMember = next; nextMember;
1704 nextMember = next, next = nextMember ? nextMember.next : null)
1706 Identifier nextID = nextMember.identifiers->first;
1707 if(nextMember.identifiers &&
1708 nextMember.identifiers->count > 1 &&
1709 !strcmp(firstID.string, nextID.string))
1711 nextMembers.dataMembers->Remove(nextMember);
1712 nextMember.identifiers->Remove(nextID);
1713 ListAdd(partList, nextMember);
1719 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1720 MkListOne(MkMembersInitList(partList))));
1728 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1729 if(curMember == dataMember)
1737 curMember = curMember.next;
1739 curMember = parentMember.members.first;
1741 if(curMember == dataMember)
1754 if(member && member.initializer && member.initializer.type == expInitializer)
1756 Expression memberExp = null;
1757 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1758 member.initializer.exp.expType._class.registered.type == structClass)
1760 OldList * subList = MkList();
1761 ProcessBracketInst(member.initializer.exp.instance, subList);
1762 FreeExpression(member.initializer.exp);
1763 ListAdd(list, MkInitializerList(subList));
1767 member.initializer.exp.usage.usageGet = true;
1768 ProcessExpression(member.initializer.exp);
1769 ListAdd(list, MkInitializerAssignment(member.initializer.exp));
1771 member.initializer.exp = null;
1772 FreeInitializer(member.initializer);
1773 member.initializer = null;
1774 someMemberSet = true;
1776 else if(member && member.initializer && member.initializer.type == listInitializer)
1778 ListAdd(list, member.initializer);
1779 member.initializer = null;
1780 someMemberSet = true;
1782 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember)
1785 if(!dataMember.dataType)
1786 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1787 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1788 if(classSym && classSym.registered && classSym.registered.type == structClass)
1790 OldList * subList = MkList();
1791 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1792 Instantiation inst = MkInstantiation(spec, null, null);
1793 ProcessBracketInst(inst, subList);
1796 ListAdd(list, MkInitializerList(subList));
1799 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1803 if(parentMember.type == unionMember)
1807 // TESTING THIS NEW CODE FOR ANCHORS...
1808 if(parentMember.type == unionMember && !someMemberSet)
1811 dataMember = parentMember.members.first;
1812 if(!dataMember.dataType && dataMember.dataTypeString)
1813 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1814 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1815 if(classSym && classSym.registered && classSym.registered.type == structClass)
1817 OldList * subList = MkList();
1818 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1819 Instantiation inst = MkInstantiation(spec, null, null);
1820 ProcessBracketInst(inst, subList);
1823 ListAdd(list, MkInitializerList(subList));
1826 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1831 static bool ProcessBracketInst(Instantiation inst, OldList list)
1833 static int recursionCount = 0;
1834 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1835 Class _class = null;
1837 if(recursionCount > 500) return false;
1840 while(_class != classSym.registered)
1842 DataMember dataMember;
1843 Class lastClass = _class;
1845 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
1847 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1849 if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1851 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1859 MembersInit members;
1860 MemberInit member = null;
1863 if(inst.members && inst.members->first)
1865 DataMember curMember = null;
1866 Class curClass = null;
1867 DataMember subMemberStack[256];
1868 int subMemberStackPos = 0;
1870 for(members = inst.members->first; members; members = members.next)
1872 if(members.type == dataMembersInit)
1874 for(member = members.dataMembers->first; member; member = member.next)
1876 Identifier firstID = member.identifiers ? member.identifiers->first : null;
1879 DataMember _subMemberStack[256];
1880 int _subMemberStackPos = 0;
1881 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
1882 // FILL MEMBER STACK
1884 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1887 curMember = thisMember;
1888 curClass = curMember._class;
1889 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1890 subMemberStackPos = _subMemberStackPos;
1893 if(curMember == dataMember)
1895 if(dataMember.isProperty)
1897 if(!((Property)dataMember).Set)
1899 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1906 // Look for another member of this one and merge them
1907 // into one instantiation...
1908 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1910 OldList * partList = MkList();
1911 // TODO: We're assuming this is a simple _class right now...
1913 MembersInit nextMembers;
1914 MemberInit next = member.next;
1916 if(!dataMember.dataType)
1917 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1918 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1919 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1921 member.identifiers->Remove(firstID);
1923 MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
1925 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1927 if(!nextMembers.dataMembers) continue;
1929 if(members != nextMembers) next = nextMembers.dataMembers->first;
1931 if(nextMembers.type == dataMembersInit)
1933 MemberInit nextMember;
1935 for(nextMember = next; nextMember;
1936 nextMember = next, next = nextMember ? nextMember.next : null)
1938 Identifier nextID = nextMember.identifiers->first;
1939 if(nextMember.identifiers &&
1940 nextMember.identifiers->count > 1 &&
1941 !strcmp(firstID.string, nextID.string))
1943 nextMembers.dataMembers->Remove(nextMember);
1944 nextMember.identifiers->Remove(nextID);
1945 ListAdd(partList, nextMember);
1951 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1952 MkListOne(MkMembersInitList(partList))));
1955 member.identifiers = null;
1963 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1964 if(curMember == dataMember)
1966 if(dataMember.isProperty)
1968 if(!((Property)dataMember).Set)
1970 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1986 if(dataMember.isProperty) continue;
1987 if(member && member.initializer && member.initializer.type == expInitializer)
1989 Expression memberExp = null;
1990 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1991 member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
1993 OldList * subList = MkList();
1994 ProcessBracketInst(member.initializer.exp.instance, subList);
1995 FreeExpression(member.initializer.exp);
1996 member.initializer.exp = null;
1997 ListAdd(list, MkInitializerList(subList));
2001 member.initializer.exp.usage.usageGet = true;
2002 ProcessExpression(member.initializer.exp);
2003 ListAdd(list, MkInitializerAssignment(CopyExpression(member.initializer.exp)));
2007 // member.exp = null;
2008 member.takeOutExp = true;
2010 else if(member && member.initializer && member.initializer.type == listInitializer)
2012 ListAdd(list, member.initializer);
2013 member.initializer = null;
2015 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/)
2019 if(!dataMember.dataType)
2020 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2021 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
2023 if(classSym && classSym.registered && classSym.registered.type == structClass)
2025 OldList * subList = MkList();
2026 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
2027 Instantiation inst = MkInstantiation(spec, null, null);
2028 ProcessBracketInst(inst, subList);
2030 ListAdd(list, MkInitializerList(subList));
2032 else if(dataMember.dataType.kind == arrayType)
2033 ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
2035 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2041 if(inst.members && inst.members->first)
2043 MembersInit members;
2044 MemberInit member = null;
2046 for(members = inst.members->first; members; members = members.next)
2048 if(members.type == dataMembersInit)
2050 for(member = members.dataMembers->first; member; member = member.next)
2052 if(member.takeOutExp)
2054 FreeInitializer(member.initializer);
2055 member.initializer = null;
2065 static Declaration curDecl;
2066 static int declTempCount;
2068 static void ProcessDeclaration(Declaration decl)
2073 case initDeclaration:
2075 if(!curDecl) { curDecl = decl; declTempCount = 0; }
2079 for(s = decl.specifiers->first; s; s = s.next)
2081 ProcessSpecifier(s);
2084 if(decl.declarators)
2088 for(d = decl.declarators->first; d; d = d.next)
2091 ProcessInitializer(d.initializer);
2094 if(curDecl == decl) { curDecl = null; declTempCount = 0; }
2097 case instDeclaration:
2099 Instantiation inst = decl.inst;
2103 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
2108 if(!inst.isConstant || (classSym && classSym.registered && (classSym.registered.type == normalClass || classSym.registered.type == noHeadClass)))
2110 // If this instantiation is outside, turn it into a declaration plus an instantiation expression
2111 decl.type = initDeclaration;
2112 decl.specifiers = MkListOne(MkSpecifierName/*MkClassName*/(inst._class.name));
2113 if(decl.declMode == staticAccess)
2115 decl.specifiers->Insert(null, MkSpecifier(STATIC));
2117 decl.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst.exp.identifier.string)), null));
2119 ProcessDeclaration(decl);
2120 CreateInstancesBody();
2123 Expression exp = MkExpInstance(inst);
2124 stmt = MkExpressionStmt(MkListOne(exp)); // MkExpOp(inst.exp, '=',
2125 ListAdd(createInstancesBody.compound.statements, stmt);
2126 ProcessExpressionType(exp);
2129 if(classSym && classSym.registered && (classSym.registered.type == normalClass))
2131 ListAdd(createInstancesBody.compound.statements,
2132 MkExpressionStmt(MkListOne(MkExpCall(
2133 MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
2134 MkListOne(CopyExpression(inst.exp))))));
2136 // We'd like the = 0 as well...
2138 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2139 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2140 ProcessExpressionType(exp);
2143 else if(classSym && classSym.registered && (classSym.registered.type == noHeadClass))
2145 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2146 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2147 ProcessExpressionType(exp);
2153 // Precompiler won't know if this isn't constant
2154 CreateInstancesBody();
2159 char className[1024];
2162 decl.type = initDeclaration;
2163 decl.specifiers = MkList();
2164 decl.declarators = MkList();
2166 // Replace instantiation here
2167 if(classSym && classSym.registered && classSym.registered.type == bitClass)
2169 OldList list = { 0 };
2171 // Put the instantiation in an InitDeclarator...
2172 ProcessInstMembers(inst, inst.exp, &list, false);
2173 ProcessExpression(inst.exp);
2175 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2176 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2177 MkInitializerAssignment(list.first)));
2178 inst.exp.identifier = null;
2180 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
2182 OldList list = { 0 };
2184 // Put the instantiation in an InitDeclarator...
2185 ProcessInstMembers(inst, inst.exp, &list, false);
2186 ProcessExpression(inst.exp);
2188 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2189 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2190 MkInitializerAssignment(list.first)));
2192 inst.exp.identifier = null;
2194 else if(classSym && classSym.registered && classSym.registered.type == structClass)
2198 DeclareStruct(inst._class.name, false);
2200 strcpy(className, "__ecereClass_");
2201 FullClassNameCat(className, classSym.string, true);
2202 MangleClassName(className);
2203 DeclareClass(classSym, className);
2206 ProcessExpression(inst.exp);
2208 // Put the instantiation in an InitDeclarator...
2212 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2213 ListAdd(decl.declarators,
2214 MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
2215 inst.exp.identifier = null;
2219 OldList * list = MkList();
2220 if(ProcessBracketInst(inst, list))
2222 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2223 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2224 MkInitializerList(list)));
2225 inst.exp.identifier = null;
2229 // If bracket instantiation failed (property: for conversions only?)
2230 // TODO: (Fix this so it initializes members through brackets,
2231 // and then does properties)
2234 // TESTING THIS MEMORY LEAK FIX:
2235 FreeList(list, FreeInitializer);
2237 exp = MkExpBrackets(MkList());
2238 ProcessInstMembers(inst, inst.exp, exp.list, true);
2239 ListAdd(exp.list, CopyExpression(inst.exp));
2240 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2241 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2242 MkInitializerAssignment(exp)));
2243 inst.exp.identifier = null;
2252 strcpy(className, "__ecereClass_");
2254 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
2256 classSym = FindClass(classSym.registered.templateClass.fullName);
2257 FullClassNameCat(className, classSym.string, true);
2260 FullClassNameCat(className, inst._class.name, true);
2261 MangleClassName(className);
2264 DeclareClass(classSym, className);
2266 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
2267 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
2270 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
2271 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
2275 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
2276 ProcessExpressionType(newCall);
2277 newCall.byReference = true;
2282 Expression exp, newExp;
2283 Identifier id = CopyIdentifier(inst.exp.identifier);
2285 // Put the instantiation in an InitDeclarator...
2286 if(inst.members && inst.members->first)
2288 newExp = MkExpOp(CopyExpression(inst.exp), '=', newCall);
2290 exp = MkExpBrackets(MkList());
2291 ListAdd(exp.list, newExp);
2292 ProcessInstMembers(inst, inst.exp, exp.list, false);
2293 ListAdd(exp.list, inst.exp);
2295 ProcessExpression(inst.exp);
2297 // Take it out since we're using it...
2303 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2304 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id),
2305 MkInitializerAssignment(exp)));
2306 //inst.exp.identifier = null;
2309 FreeExpression(newCall);
2315 ProcessInstantiation(inst);
2318 case structDeclaration:
2323 for(spec = decl.specifiers->first; spec; spec = spec.next)
2324 ProcessSpecifier(spec);
2331 static void ProcessStatement(Statement stmt)
2337 if(stmt.labeled.stmt)
2338 ProcessStatement(stmt.labeled.stmt);
2341 if(stmt.caseStmt.exp)
2342 ProcessExpression(stmt.caseStmt.exp);
2343 if(stmt.caseStmt.stmt)
2344 ProcessStatement(stmt.caseStmt.stmt);
2348 if(stmt.compound.context)
2352 Statement prevCompound = curCompound;
2353 Context prevContext = curContext;
2355 if(!stmt.compound.isSwitch)
2358 curContext = stmt.compound.context;
2361 if(stmt.compound.declarations)
2363 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
2364 ProcessDeclaration(decl);
2366 if(stmt.compound.statements)
2368 for(s = stmt.compound.statements->first; s; s = s.next)
2370 ProcessStatement(s);
2374 curCompound = prevCompound;
2375 curContext = prevContext;
2379 case expressionStmt:
2382 if(stmt.expressions)
2384 for(exp = stmt.expressions->first; exp; exp = exp.next)
2386 ProcessExpression(exp);
2395 ((Expression)stmt.ifStmt.exp->last).usage.usageGet = true;
2396 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
2398 ProcessExpression(exp);
2400 if(stmt.ifStmt.stmt)
2401 ProcessStatement(stmt.ifStmt.stmt);
2402 if(stmt.ifStmt.elseStmt)
2403 ProcessStatement(stmt.ifStmt.elseStmt);
2409 ((Expression)stmt.switchStmt.exp->last).usage.usageGet = true;
2410 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
2411 ProcessExpression(exp);
2412 ProcessStatement(stmt.switchStmt.stmt);
2417 if(stmt.whileStmt.exp)
2421 ((Expression)stmt.whileStmt.exp->last).usage.usageGet = true;
2422 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
2424 ProcessExpression(exp);
2427 if(stmt.whileStmt.stmt)
2428 ProcessStatement(stmt.whileStmt.stmt);
2433 if(stmt.doWhile.exp)
2436 ((Expression)stmt.doWhile.exp->last).usage.usageGet = true;
2437 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
2439 ProcessExpression(exp);
2442 if(stmt.doWhile.stmt)
2443 ProcessStatement(stmt.doWhile.stmt);
2449 if(stmt.forStmt.init)
2450 ProcessStatement(stmt.forStmt.init);
2452 if(stmt.forStmt.check && stmt.forStmt.check.expressions)
2454 ((Expression)stmt.forStmt.check.expressions->last).usage.usageGet = true;
2457 if(stmt.forStmt.check)
2458 ProcessStatement(stmt.forStmt.check);
2459 if(stmt.forStmt.increment)
2461 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
2462 ProcessExpression(exp);
2464 if(stmt.forStmt.stmt)
2465 ProcessStatement(stmt.forStmt.stmt);
2477 if(stmt.expressions && stmt.expressions->last)
2479 ((Expression)stmt.expressions->last).usage.usageGet = true;
2480 for(exp = stmt.expressions->first; exp; exp = exp.next)
2482 ProcessExpression(exp);
2487 case badDeclarationStmt:
2489 ProcessDeclaration(stmt.decl);
2495 if(stmt.asmStmt.inputFields)
2497 for(field = stmt.asmStmt.inputFields->first; field; field = field.next)
2498 if(field.expression)
2499 ProcessExpression(field.expression);
2501 if(stmt.asmStmt.outputFields)
2503 for(field = stmt.asmStmt.outputFields->first; field; field = field.next)
2504 if(field.expression)
2505 ProcessExpression(field.expression);
2507 if(stmt.asmStmt.clobberedFields)
2509 for(field = stmt.asmStmt.clobberedFields->first; field; field = field.next)
2510 if(field.expression)
2511 ProcessExpression(field.expression);
2517 static void ProcessFunction(FunctionDefinition function)
2521 yylloc = function.loc;
2522 ProcessStatement(function.body);
2526 /////////// INSTANTIATIONS / DATA TYPES PASS /////////////////////////////////////////////
2527 public void ProcessInstantiations()
2530 // Is this still needed?
2531 //CreateInstancesBody();
2533 for(external = ast->first; external; external = external.next)
2535 curExternal = external;
2536 if(external.type == declarationExternal)
2538 //currentClass = external.function._class;
2539 if(external.declaration)
2540 ProcessDeclaration(external.declaration);
2542 else if(external.type == functionExternal)
2544 //currentClass = null;
2545 ProcessFunction(external.function);
2547 else if(external.type == classExternal)
2549 ClassDefinition _class = external._class;
2550 //currentClass = external.symbol.registered;
2551 if(_class.definitions)
2554 //Class regClass = _class.symbol.registered;
2556 // Process all functions
2557 for(def = _class.definitions->first; def; def = def.next)
2559 if(def.type == functionClassDef)
2561 curExternal = def.function.declarator ? def.function.declarator.symbol.pointerExternal : external;
2562 ProcessFunction((FunctionDefinition)def.function);
2564 else if(def.type == declarationClassDef && def.decl.type == instDeclaration)
2566 ProcessInstantiation(def.decl.inst);
2568 else if(def.type == defaultPropertiesClassDef && def.defProperties)
2570 MemberInit defProperty;
2572 // Add this to the context
2575 string = CopyString("this");
2576 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2578 globalContext.symbols.Add((BTNode)thisSymbol);
2580 for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
2582 //thisClass = regClass;
2583 ProcessMemberInitData(defProperty); ///*, regClass, &id
2587 globalContext.symbols.Remove((BTNode)thisSymbol);
2588 FreeSymbol(thisSymbol);
2590 else if(def.type == propertyClassDef && def.propertyDef)
2592 PropertyDef prop = def.propertyDef;
2594 // Add this to the context
2597 string = CopyString("this");
2598 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2600 globalContext.symbols.Add((BTNode)thisSymbol);
2602 //thisClass = regClass;
2605 curExternal = prop.symbol ? prop.symbol.externalSet : null;
2606 ProcessStatement(prop.setStmt);
2610 curExternal = prop.symbol ? prop.symbol.externalGet : null;
2611 ProcessStatement(prop.getStmt);
2615 curExternal = prop.symbol ? prop.symbol.externalIsSet : null;
2616 ProcessStatement(prop.issetStmt);
2620 globalContext.symbols.Remove((BTNode)thisSymbol);
2621 FreeSymbol(thisSymbol);
2623 else if(def.type == propertyWatchClassDef && def.propertyWatch)
2625 PropertyWatch propertyWatch = def.propertyWatch;
2627 // Add this to the context
2630 string = CopyString("this");
2631 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2633 globalContext.symbols.Add((BTNode)thisSymbol);
2635 //thisClass = regClass;
2636 if(propertyWatch.compound)
2638 /* This was already added in pass15:ProcessClass()
2641 string = CopyString("this");
2642 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2644 propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
2646 ProcessStatement(propertyWatch.compound);
2648 // thisClass = null;
2650 //globalContext.symbols.Delete((BTNode)thisSymbol);
2651 globalContext.symbols.Remove((BTNode)thisSymbol);
2652 FreeSymbol(thisSymbol);