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, const 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 : 0;
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 = dummyExp; // remove expression
921 // Take expression out... -- It seems ProcessInstMembers() makes copies of it and it needs to be freed now
927 Declaration dummyDecl;
928 // Unnamed instantiation
930 // Make a declaration in the closest compound statement
931 // (Do not reuse (since using address for function calls)...)
934 ListAdd(decls, MkInitDeclarator(
935 MkDeclaratorIdentifier(MkIdentifier(className)), null));
936 decl = MkDeclaration(specs, decls);
938 /* Never mind this... somebody might modify the values...
942 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
943 inst.id = MkIdentifier(className);
944 decl = MkDeclarationInst(inst);
945 exp.type = ExpIdentifier;
946 exp.identifier = inst.id;
947 if(!curCompound.compound.declarations)
948 curCompound.compound.declarations = MkList();
949 curCompound.compound.declarations->Insert(null, decl);
950 ProcessDeclaration(decl);
956 //OldList * specs = MkList(), * decls = MkList();
957 //sprintf(className, "__ecereClassData_%s", inst._class.name);
958 //ListAdd(specs, MkStructOrUnion(SpecifierStruct, MkIdentifier(className), null));
961 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
962 dummyDecl = MkDeclaration(null,null);
963 if(!curCompound.compound.declarations)
964 curCompound.compound.declarations = MkList();
965 curCompound.compound.declarations->Insert(null, dummyDecl);
967 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
970 OldList * list = MkList();
971 if(inst.isConstant && ProcessBracketInst(inst, list))
973 decl = MkDeclaration(MkList(), MkList());
975 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
976 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)),
977 MkInitializerList(list)));
979 exp.type = identifierExp;
980 exp.identifier = MkIdentifier(className);
987 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst._class), MkExpIdentifier(MkIdentifier(className)), null));
990 // Set properties & data members in expression
991 // to handle jump and control statements
992 // Set unset data members to 0
993 exp.type = bracketsExp;
996 instExp = QMkExpId(className);
997 instExp.loc = exp.loc;
998 instExp.expType = MkClassType(inst._class.name);
1000 // Mark the declarated instance as fullset so it doesn't need to be zeroed out
1001 decl.inst.fullSet = ProcessInstMembers(inst, instExp, exp.list, false);
1003 ListAdd(exp.list, instExp);
1007 FreeType(exp.expType);
1008 exp.expType = MkClassType(inst._class.name);
1010 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
1012 void * prev = dummyDecl.prev, * next = dummyDecl.next;
1014 dummyDecl.prev = prev;
1015 dummyDecl.next = next;
1019 ProcessDeclaration(decl);
1022 if(!curCompound.compound.declarations)
1023 curCompound.compound.declarations = MkList();
1024 curCompound.compound.declarations->Insert(null, decl);
1033 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
1034 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
1037 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
1038 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
1039 newCall.byReference = true;
1043 strcpy(className, "__ecereClass_");
1044 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
1046 classSym = FindClass(classSym.registered.templateClass.fullName);
1047 FullClassNameCat(className, classSym.string, true);
1050 FullClassNameCat(className, inst._class.name, true);
1052 //MangleClassName(className);
1053 DeclareClass(classSym, className);
1054 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
1055 newCall.usage = exp.usage;
1057 ProcessExpressionType(newCall);
1058 newCall.expType.passAsTemplate = exp.expType.passAsTemplate;
1059 newCall.byReference = true;
1064 if(inst.members && inst.members->first)
1066 exp.type = bracketsExp;
1067 exp.list = MkList();
1071 ListAdd(exp.list, MkExpOp(inst.exp, '=', newCall));
1074 FreeExpression(newCall);
1076 ProcessInstMembers(inst, inst.exp, exp.list, false);
1079 FreeExpression(inst.exp);
1085 exp.op.exp1 = inst.exp;
1086 exp.op.exp2 = newCall;
1088 ProcessExpression(inst.exp);
1094 // Unnamed instantiation
1095 if(inst.members && inst.members->first)
1097 char ecereTemp[100];
1098 MembersInit members;
1099 int tempCount = exp.tempCount;
1102 // Check if members use temp count...
1103 for(members = inst.members->first; members; members = members.next)
1105 if(members.type == dataMembersInit && members.dataMembers)
1108 for(member = members.dataMembers->first; member; member = member.next)
1110 if(member.initializer && member.initializer.type == expInitializer)
1112 ProcessMemberInitData(member); // ADDED THIS TO HAVE PROPER tempCount ALREADY...
1113 tempCount = Max(tempCount, member.initializer.exp.tempCount);
1119 tempCount = Max(tempCount, declTempCount);
1122 curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
1123 sprintf(ecereTemp, "__ecereInstance%d", tempCount);
1124 exp.type = extensionCompoundExp;
1125 exp.compound = MkCompoundStmt(null, null);
1126 exp.compound.compound.context = PushContext();
1127 exp.compound.compound.context.simpleID = exp.compound.compound.context.parent.simpleID;
1128 exp.compound.compound.declarations = MkListOne(QMkDeclaration(inst._class.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)),
1129 MkInitializerAssignment(newCall))));
1130 exp.compound.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
1132 instExp = QMkExpId(ecereTemp);
1133 instExp.tempCount = tempCount;
1134 instExp.expType = MkClassType(inst._class.name);
1135 instExp.byReference = true;
1136 ProcessInstMembers(inst, instExp, expList, false);
1137 FreeExpression(instExp);
1141 Expression tmpExp = QMkExpId(ecereTemp);
1142 tmpExp.byReference = true;
1143 ListAdd(expList, tmpExp);
1145 exp.tempCount = tempCount;
1147 declTempCount = Max(declTempCount, tempCount);
1148 PopContext(exp.compound.compound.context);
1152 Expression prev = exp.prev, next = exp.next;
1153 FreeType(newCall.destType);
1154 FreeType(newCall.expType);
1155 newCall.destType = exp.destType;
1156 newCall.expType = exp.expType;
1164 if(exp.type != instanceExp)
1168 ProcessInstantiation(inst);
1177 // if(exp._new.size) exp._new.size.usage.usageGet = true;
1178 ProcessExpression(exp._new.size);
1182 // if(exp._renew.size) exp._renew.size.usage.usageGet = true;
1183 ProcessExpression(exp._renew.size);
1184 // if(exp._renew.exp) exp._renew.exp.usage.usageGet = true;
1185 ProcessExpression(exp._renew.exp);
1189 //bool assign = false;
1193 // Assignment Operators
1196 exp.op.exp2.usage.usageGet = true;
1198 exp.op.exp1.usage.usageSet = true;
1212 exp.op.exp2.usage.usageGet = true;
1215 exp.op.exp1.usage.usageSet = true;
1221 exp.op.exp1.usage.usageSet = true;
1226 if(exp.op.exp1 && exp.op.exp2)
1228 exp.op.exp1.usage.usageGet = true;
1229 exp.op.exp2.usage.usageGet = true;
1238 exp.op.exp1.usage.usageGet = true;
1243 exp.op.exp2.usage.usageGet = true;
1246 // Binary only operators
1262 exp.op.exp1.usage.usageGet = true;
1264 exp.op.exp2.usage.usageGet = true;
1270 if(exp.op.exp1 && exp.op.exp2 && exp.op.exp1.destType && exp.op.exp1.destType.passAsTemplate && exp.op.exp1.expType && !exp.op.exp1.expType.passAsTemplate && !exp.op.exp1.usage.usageSet)
1273 CopyTypeInto(type, exp.op.exp1.destType);
1274 type.passAsTemplate = false;
1275 FreeType(exp.op.exp1.destType);
1276 exp.op.exp1.destType = type;
1278 // TEST: if(exp.op.exp2) exp.op.exp1.tempCount = Max(exp.op.exp1.tempCount, exp.op.exp2.tempCount);
1279 ProcessExpression(exp.op.exp1);
1280 // TEST: exp.tempCount = Max(exp.op.exp1.tempCount, exp.tempCount);
1285 if(exp.op.exp1 && exp.op.exp2 && exp.op.exp2.destType && exp.op.exp2.destType.passAsTemplate && exp.op.exp2.expType && !exp.op.exp2.expType.passAsTemplate && !exp.op.exp1.usage.usageSet)
1288 CopyTypeInto(type, exp.op.exp2.destType);
1289 type.passAsTemplate = false;
1290 FreeType(exp.op.exp2.destType);
1291 exp.op.exp2.destType = type;
1294 // Don't use the temporaries used by the left side...
1296 // TEST: exp.op.exp2.tempCount = Max(exp.op.exp2.tempCount, exp.op.exp1.tempCount);
1297 exp.op.exp2.tempCount = exp.op.exp1.tempCount;
1298 ProcessExpression(exp.op.exp2);
1299 // TEST: exp.tempCount = Max(exp.op.exp2.tempCount, exp.tempCount);
1303 case extensionExpressionExp:
1307 for(e = exp.list->first; e; e = e.next)
1309 e.tempCount = Max(e.tempCount, exp.tempCount);
1312 e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true }));
1314 ProcessExpression(e);
1315 exp.tempCount = Max(exp.tempCount, e.tempCount);
1323 exp.index.exp.usage.usageGet = true;
1324 ProcessExpression(exp.index.exp);
1325 for(e = exp.index.index->first; e; e = e.next)
1328 e.usage.usageGet = true;
1329 ProcessExpression(e);
1331 // Ignore temps in the index for now...
1332 exp.tempCount = exp.index.exp.tempCount;
1334 if(exp.index.exp.expType)
1336 Type source = exp.index.exp.expType;
1337 if(source.kind == classType && source._class && source._class.registered && source._class.registered != containerClass &&
1338 eClass_IsDerived(source._class.registered, containerClass))
1340 Class _class = source._class.registered;
1341 // __extension__({ Iterator<type> i { container }; i.Index(e, [ exp.usage.usageSet ]; i.value; });
1343 char iteratorType[1024];
1344 OldList * declarations = MkList();
1345 OldList * statements = MkList();
1346 OldList * args = MkList();
1347 OldList * instMembers = MkList();
1349 Context context = PushContext();
1351 sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
1353 ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
1355 ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
1356 MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
1358 ListAdd(args, MkExpBrackets(exp.index.index));
1359 ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
1361 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
1362 MkIdentifier("Index")), args))));
1364 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
1366 exp.type = bracketsExp;
1367 exp.list = MkListOne(MkExpPointer(expExt = (MkExpExtensionCompound(MkCompoundStmt(declarations, statements))), MkIdentifier("data")));
1368 expExt.compound.compound.context = context;
1369 PopContext(context);
1370 expExt.usage = exp.usage;
1371 ProcessExpressionType(exp.list->first);
1372 ProcessExpression(exp.list->first);
1381 //Method method = null;
1383 ProcessExpression(exp.call.exp);
1385 if(exp.call.arguments)
1387 for(e = exp.call.arguments->first; e; e = e.next)
1389 e.usage.usageGet = true;
1390 e.usage.usageArg = true;
1392 // TEST: e.tempCount = Max(e.tempCount, exp.tempCount);
1393 ProcessExpression(e);
1394 // TEST: exp.tempCount = Max(exp.tempCount, e.tempCount);
1401 exp.member.exp.usage.usageGet = true;
1402 ProcessExpression(exp.member.exp);
1404 // Must do this here so we can set the MemberType of deep properties inside instantiations
1405 if(!exp.member.memberType)
1407 Type type = exp.member.exp.expType;
1408 if((type && type.kind == classType && exp.member.member))
1410 // Check if it's an instance
1411 Class _class = (exp.member.member._class && exp.member.member.classSym) ? exp.member.member.classSym.registered : (type._class ? type._class.registered : null);
1412 Property prop = null;
1413 Method method = null;
1414 DataMember member = null;
1415 Property revConvert = null;
1417 // Prioritize data members over properties for "this"
1418 if(exp.member.thisPtr)
1420 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1422 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1424 // Prioritize properties over data members otherwise
1427 // Look for publicAccess Members first
1428 prop = eClass_FindProperty(_class, exp.member.member.string, null);
1430 member = eClass_FindDataMember(_class, exp.member.member.string, null, null, null);
1431 if(!prop && !member)
1433 method = eClass_FindMethod(_class, exp.member.member.string, null);
1436 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1438 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1442 if(!prop && !member && !method) // NOTE: Recently added the !method here, causes private methods to unprioritized
1443 method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
1444 if(!prop && !member && !method)
1446 Symbol classSym = FindClass(exp.member.member.string);
1449 Class convertClass = classSym.registered;
1451 revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
1457 exp.member.memberType = propertyMember;
1459 prop.dataType = ProcessTypeString(prop.dataTypeString, false);
1461 FreeType(exp.expType);
1462 exp.expType = prop.dataType;
1463 if(prop.dataType) prop.dataType.refCount++;
1467 exp.member.memberType = methodMember;
1468 if(!method.dataType)
1469 //method.dataType = ((Symbol)method.symbol).type;
1470 ProcessMethodType(method);
1472 FreeType(exp.expType);
1473 exp.expType = method.dataType;
1474 if(method.dataType) method.dataType.refCount++;
1478 exp.member.memberType = dataMember;
1479 DeclareStruct(_class.fullName, false);
1480 if(!member.dataType)
1481 member.dataType = ProcessTypeString(member.dataTypeString, false);
1483 FreeType(exp.expType);
1484 exp.expType = member.dataType;
1485 if(member.dataType) member.dataType.refCount++;
1489 exp.member.memberType = reverseConversionMember;
1491 FreeType(exp.expType);
1492 exp.expType = MkClassType(revConvert._class.fullName);
1495 printf($"Error: Couldn't find member %s in class %s\n",
1496 exp.member.member.string, _class.name);*/
1505 //exp.cast.exp.usage.usageGet = true;
1506 exp.cast.exp.usage |= exp.usage;
1507 ProcessExpression(exp.cast.exp);
1513 if(exp.usage.usageGet)
1514 exp.cond.cond.usage.usageGet = true;
1516 ProcessExpression(exp.cond.cond);
1517 for(e = exp.cond.exp->first; e; e = e.next)
1519 if(!e.next && exp.usage.usageGet) e.usage.usageGet = true;
1520 ProcessExpression(e);
1522 if(exp.cond.elseExp)
1524 if(exp.usage.usageGet) exp.cond.elseExp.usage.usageGet = true;
1525 ProcessExpression(exp.cond.elseExp);
1529 case extensionCompoundExp:
1531 if(exp.compound.compound.statements &&
1532 ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
1533 ((Statement)exp.compound.compound.statements->last).expressions &&
1534 ((Statement)exp.compound.compound.statements->last).expressions->last)
1536 ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
1538 ProcessStatement(exp.compound);
1543 ProcessExpression(exp.vaArg.exp);
1546 case extensionInitializerExp:
1548 ProcessInitializer(exp.initializer.initializer);
1552 CheckTemplateTypes(exp);
1555 static void ProcessInitializer(Initializer init)
1559 case expInitializer:
1560 init.exp.usage.usageGet = true;
1561 ProcessExpression(init.exp);
1563 case listInitializer:
1566 for(i = init.list->first; i; i = i.next)
1567 ProcessInitializer(i);
1573 static void ProcessSpecifier(Specifier spec)
1588 for(e = spec.list->first; e; e = e.next)
1591 ProcessExpression(e.exp);
1596 case structSpecifier:
1597 case unionSpecifier:
1600 if(spec.definitions)
1603 for(def = spec.definitions->first; def; def = def.next)
1605 if(def.type == declarationClassDef && def.decl && def.decl.type == structDeclaration)
1606 ProcessDeclaration(def.decl);
1612 case SpecifierClass:
1619 static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list, DataMember namedParentMember, bool parentMemberSet)
1621 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1622 DataMember dataMember = null;
1623 bool someMemberSet = false;
1626 // For simple classes, ensure all members are initialized
1627 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1629 MembersInit members;
1630 MemberInit member = null;
1632 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1634 OldList * subList = MkList(); //(dataMember.type == structMember) ? MkList() : null;
1636 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember.name ? dataMember : namedParentMember, someMemberSet || parentMemberSet || dataMember.prev))
1639 FreeList(subList, FreeInitializer);
1643 if(subList && subList->count)
1645 Initializer init = MkInitializerList(subList);
1647 sprintf(id, "__anon%d", anonID);
1648 init.id = MkIdentifier(id);
1649 ListAdd(list, init);
1650 someMemberSet = true;
1655 someMemberSet = true;
1662 Class curClass = null;
1663 DataMember curMember = null;
1664 DataMember subMemberStack[256];
1665 int subMemberStackPos = 0;
1668 if(inst.members && inst.members->first)
1670 for(members = inst.members->first; members; members = members.next)
1672 if(members.type == dataMembersInit)
1674 for(member = members.dataMembers->first; member; member = member.next)
1676 if(member.identifiers)
1678 Identifier firstID = member.identifiers->first;
1680 DataMember _subMemberStack[256];
1681 int _subMemberStackPos = 0;
1682 DataMember thisMember;
1683 thisMember = firstID ? (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule) : null;
1684 // FILL MEMBER STACK
1685 if(!thisMember && firstID)
1686 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1687 if(thisMember && thisMember.memberAccess == publicAccess)
1689 curMember = thisMember;
1690 curClass = curMember._class;
1691 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1692 subMemberStackPos = _subMemberStackPos;
1695 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
1698 curMember = link.data;
1701 // Choose the first specified member of the union...
1702 if(parentMember.type == unionMember)
1705 dataMember = curMember;
1709 if(dataMember == thisMember)
1711 // Look for another member of this one and merge them
1712 // into one instantiation...
1713 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1715 OldList * partList = MkList();
1716 // TODO: We're assuming this is a simple class right now...
1719 MembersInit nextMembers;
1720 MemberInit next = member.next;
1722 if(!dataMember.dataType)
1723 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1724 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1725 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1728 OldList * identifiers = MkList();
1730 for(id = ((Identifier)member.identifiers->first).next; id; id = id.next)
1731 identifiers->Add(CopyIdentifier(id));
1733 // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
1734 // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
1735 /*member.identifiers->Remove(firstID);*/
1737 MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
1740 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1742 if(!nextMembers.dataMembers)
1745 if(members != nextMembers) next = nextMembers.dataMembers->first;
1747 if(nextMembers.type == dataMembersInit)
1749 MemberInit nextMember;
1751 for(nextMember = next; nextMember;
1752 nextMember = next, next = nextMember ? nextMember.next : null)
1754 Identifier nextID = nextMember.identifiers->first;
1755 if(nextMember.identifiers &&
1756 nextMember.identifiers->count > 1 &&
1757 !strcmp(firstID.string, nextID.string))
1759 nextMembers.dataMembers->Remove(nextMember);
1760 nextMember.identifiers->Remove(nextID);
1761 ListAdd(partList, nextMember);
1767 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1768 MkListOne(MkMembersInitList(partList))));
1776 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1777 if(curMember == dataMember)
1785 curMember = curMember.next;
1787 curMember = parentMember.members.first;
1789 if(curMember == dataMember)
1802 if(member && member.initializer && member.initializer.type == expInitializer)
1804 Initializer init { loc = yylloc };
1805 if(namedParentMember.type == unionMember && dataMember.name)
1806 init.id = MkIdentifier(dataMember.name);
1808 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1809 member.initializer.exp.expType._class.registered.type == structClass)
1811 OldList * subList = MkList();
1812 ProcessBracketInst(member.initializer.exp.instance, subList);
1813 FreeExpression(member.initializer.exp);
1816 init.type = listInitializer;
1817 init.list = subList;
1821 FreeInitializer(init);
1827 member.initializer.exp.usage.usageGet = true;
1828 ProcessExpression(member.initializer.exp);
1829 init.type = expInitializer;
1830 init.exp = member.initializer.exp;
1833 ListAdd(list, init);
1835 member.initializer.exp = null;
1836 FreeInitializer(member.initializer);
1837 member.initializer = null;
1838 someMemberSet = true;
1840 else if(member && member.initializer && member.initializer.type == listInitializer)
1842 if(namedParentMember.type == unionMember && dataMember.name)
1843 member.initializer.id = MkIdentifier(dataMember.name);
1845 ListAdd(list, member.initializer);
1846 member.initializer = null;
1847 someMemberSet = true;
1849 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember && namedParentMember.type != unionMember)
1852 Initializer init { loc = yylloc };
1853 if(namedParentMember.type == unionMember && dataMember.name)
1854 init.id = MkIdentifier(dataMember.name);
1856 if(!dataMember.dataType)
1857 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1858 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1859 if(classSym && classSym.registered && classSym.registered.type == structClass)
1861 OldList * subList = MkList();
1862 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1863 Instantiation inst = MkInstantiation(spec, null, null);
1864 ProcessBracketInst(inst, subList);
1869 init.type = listInitializer;
1870 init.list = subList;
1874 FreeInitializer(init);
1880 init.type = expInitializer;
1881 init.exp = MkExpConstant("0");
1883 someMemberSet = true;
1885 ListAdd(list, init);
1889 if(parentMember.type == unionMember)
1893 // TESTING THIS NEW CODE FOR ANCHORS...
1894 if(/*parentMember.type == unionMember && */!someMemberSet && !parentMemberSet)
1897 Initializer init { loc = yylloc };
1899 dataMember = parentMember.members.first;
1900 if(namedParentMember.type == unionMember && dataMember.name)
1901 init.id = MkIdentifier(dataMember.name);
1903 if(!dataMember.dataType && dataMember.dataTypeString)
1904 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1905 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1906 if(classSym && classSym.registered && classSym.registered.type == structClass)
1908 OldList * subList = MkList();
1909 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1910 Instantiation inst = MkInstantiation(spec, null, null);
1911 ProcessBracketInst(inst, subList);
1914 init.type = listInitializer;
1915 init.list = subList;
1919 init.type = expInitializer;
1920 init.exp = MkExpConstant("0");
1922 ListAdd(list, init);
1927 static bool ProcessBracketInst(Instantiation inst, OldList list)
1929 static int recursionCount = 0;
1930 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1931 Class _class = null;
1934 if(recursionCount > 500) return false;
1937 while(_class != classSym.registered)
1939 DataMember dataMember;
1940 Class lastClass = _class;
1942 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
1944 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1946 if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1948 OldList * subList = MkList(); //(dataMember.type == structMember ? MkList() : null);
1950 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember, false))
1953 FreeList(subList, FreeInitializer);
1957 if(dataMember.type == structMember || (subList && subList->count))
1959 Initializer init = MkInitializerList(subList);
1961 sprintf(id, "__anon%d", anonID);
1962 init.id = MkIdentifier(id);
1963 ListAdd(list, init);
1971 MembersInit members;
1972 MemberInit member = null;
1975 if(inst.members && inst.members->first)
1977 DataMember curMember = null;
1978 Class curClass = null;
1979 DataMember subMemberStack[256];
1980 int subMemberStackPos = 0;
1982 for(members = inst.members->first; members; members = members.next)
1984 if(members.type == dataMembersInit)
1986 for(member = members.dataMembers->first; member; member = member.next)
1988 Identifier firstID = member.identifiers ? member.identifiers->first : null;
1991 DataMember _subMemberStack[256];
1992 int _subMemberStackPos = 0;
1993 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
1994 // FILL MEMBER STACK
1996 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1999 curMember = thisMember;
2000 curClass = curMember._class;
2001 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
2002 subMemberStackPos = _subMemberStackPos;
2005 if(curMember == dataMember)
2007 if(dataMember.isProperty)
2009 if(!((Property)dataMember).Set)
2011 Compiler_Error($"No set defined for property %s\n", dataMember.name);
2018 // Look for another member of this one and merge them
2019 // into one instantiation...
2020 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
2022 OldList * partList = MkList();
2023 // TODO: We're assuming this is a simple _class right now...
2025 MembersInit nextMembers;
2026 MemberInit next = member.next;
2028 if(!dataMember.dataType)
2029 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2030 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
2031 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
2033 member.identifiers->Remove(firstID);
2035 MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
2037 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
2039 if(!nextMembers.dataMembers) continue;
2041 if(members != nextMembers) next = nextMembers.dataMembers->first;
2043 if(nextMembers.type == dataMembersInit)
2045 MemberInit nextMember;
2047 for(nextMember = next; nextMember;
2048 nextMember = next, next = nextMember ? nextMember.next : null)
2050 Identifier nextID = nextMember.identifiers->first;
2051 if(nextMember.identifiers &&
2052 nextMember.identifiers->count > 1 &&
2053 !strcmp(firstID.string, nextID.string))
2055 nextMembers.dataMembers->Remove(nextMember);
2056 nextMember.identifiers->Remove(nextID);
2057 ListAdd(partList, nextMember);
2063 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
2064 MkListOne(MkMembersInitList(partList))));
2067 member.identifiers = null;
2075 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
2076 if(curMember == dataMember)
2078 if(dataMember.isProperty)
2080 if(!((Property)dataMember).Set)
2082 Compiler_Error($"No set defined for property %s\n", dataMember.name);
2098 if(dataMember.isProperty) continue;
2099 if(member && member.initializer && member.initializer.type == expInitializer)
2101 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
2102 member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
2104 OldList * subList = MkList();
2105 ProcessBracketInst(member.initializer.exp.instance, subList);
2106 FreeExpression(member.initializer.exp);
2107 member.initializer.exp = null;
2108 ListAdd(list, MkInitializerList(subList));
2112 member.initializer.exp.usage.usageGet = true;
2113 ProcessExpression(member.initializer.exp);
2114 ListAdd(list, MkInitializerAssignment(CopyExpression(member.initializer.exp)));
2118 // member.exp = null;
2119 member.takeOutExp = true;
2121 else if(member && member.initializer && member.initializer.type == listInitializer)
2123 ListAdd(list, member.initializer);
2124 member.initializer = null;
2126 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/)
2130 if(!dataMember.dataType)
2131 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2132 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
2134 if(classSym && classSym.registered && classSym.registered.type == structClass)
2136 OldList * subList = MkList();
2137 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
2138 Instantiation inst = MkInstantiation(spec, null, null);
2139 ProcessBracketInst(inst, subList);
2141 ListAdd(list, MkInitializerList(subList));
2143 else if(dataMember.dataType.kind == arrayType)
2144 ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
2146 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2152 if(inst.members && inst.members->first)
2154 MembersInit members;
2155 MemberInit member = null;
2157 for(members = inst.members->first; members; members = members.next)
2159 if(members.type == dataMembersInit)
2161 for(member = members.dataMembers->first; member; member = member.next)
2163 if(member.takeOutExp)
2165 FreeInitializer(member.initializer);
2166 member.initializer = null;
2176 static Declaration curDecl;
2177 static int declTempCount;
2179 static void ProcessDeclaration(Declaration decl)
2184 case initDeclaration:
2186 if(!curDecl) { curDecl = decl; declTempCount = 0; }
2190 for(s = decl.specifiers->first; s; s = s.next)
2192 ProcessSpecifier(s);
2195 if(decl.declarators)
2199 for(d = decl.declarators->first; d; d = d.next)
2202 ProcessInitializer(d.initializer);
2205 if(curDecl == decl) { curDecl = null; declTempCount = 0; }
2208 case instDeclaration:
2210 Instantiation inst = decl.inst;
2214 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
2219 if(!inst.isConstant || (classSym && classSym.registered && (classSym.registered.type == normalClass || classSym.registered.type == noHeadClass)))
2221 // If this instantiation is outside, turn it into a declaration plus an instantiation expression
2222 decl.type = initDeclaration;
2223 decl.specifiers = MkListOne(MkSpecifierName/*MkClassName*/(inst._class.name));
2224 if(decl.declMode == staticAccess)
2226 decl.specifiers->Insert(null, MkSpecifier(STATIC));
2228 decl.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst.exp.identifier.string)), null));
2230 ProcessDeclaration(decl);
2231 CreateInstancesBody();
2234 Expression exp = MkExpInstance(inst);
2235 stmt = MkExpressionStmt(MkListOne(exp)); // MkExpOp(inst.exp, '=',
2236 ListAdd(createInstancesBody.compound.statements, stmt);
2237 ProcessExpressionType(exp);
2240 if(classSym && classSym.registered && (classSym.registered.type == normalClass))
2242 ListAdd(createInstancesBody.compound.statements,
2243 MkExpressionStmt(MkListOne(MkExpCall(
2244 MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
2245 MkListOne(CopyExpression(inst.exp))))));
2247 // We'd like the = 0 as well...
2249 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2250 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2251 ProcessExpressionType(exp);
2254 else if(classSym && classSym.registered && (classSym.registered.type == noHeadClass))
2256 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2257 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2258 ProcessExpressionType(exp);
2264 // Precompiler won't know if this isn't constant
2265 CreateInstancesBody();
2270 char className[1024];
2273 decl.type = initDeclaration;
2274 decl.specifiers = MkList();
2275 decl.declarators = MkList();
2277 // Replace instantiation here
2278 if(classSym && classSym.registered && classSym.registered.type == bitClass)
2280 OldList list = { 0 };
2282 // Put the instantiation in an InitDeclarator...
2283 ProcessInstMembers(inst, inst.exp, &list, false);
2284 ProcessExpression(inst.exp);
2286 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2287 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2288 MkInitializerAssignment(list.first)));
2289 inst.exp.identifier = null;
2291 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
2293 OldList list = { 0 };
2295 // Put the instantiation in an InitDeclarator...
2296 ProcessInstMembers(inst, inst.exp, &list, false);
2297 ProcessExpression(inst.exp);
2299 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2300 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2301 MkInitializerAssignment(list.first)));
2303 inst.exp.identifier = null;
2305 else if(classSym && classSym.registered && classSym.registered.type == structClass)
2309 DeclareStruct(inst._class.name, false);
2311 strcpy(className, "__ecereClass_");
2312 FullClassNameCat(className, classSym.string, true);
2313 //MangleClassName(className);
2314 DeclareClass(classSym, className);
2317 ProcessExpression(inst.exp);
2319 // Put the instantiation in an InitDeclarator...
2323 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2324 ListAdd(decl.declarators,
2325 MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
2326 inst.exp.identifier = null;
2330 OldList * list = MkList();
2331 if(ProcessBracketInst(inst, list))
2333 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2334 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2335 MkInitializerList(list)));
2336 inst.exp.identifier = null;
2340 // If bracket instantiation failed (property: for conversions only?)
2341 // TODO: (Fix this so it initializes members through brackets,
2342 // and then does properties)
2345 // TESTING THIS MEMORY LEAK FIX:
2346 FreeList(list, FreeInitializer);
2348 exp = MkExpBrackets(MkList());
2349 ProcessInstMembers(inst, inst.exp, exp.list, true);
2350 ListAdd(exp.list, CopyExpression(inst.exp));
2351 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2352 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2353 MkInitializerAssignment(exp)));
2354 inst.exp.identifier = null;
2363 strcpy(className, "__ecereClass_");
2365 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
2367 classSym = FindClass(classSym.registered.templateClass.fullName);
2368 FullClassNameCat(className, classSym.string, true);
2371 FullClassNameCat(className, inst._class.name, true);
2372 //MangleClassName(className);
2375 DeclareClass(classSym, className);
2377 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
2378 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
2381 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
2382 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
2386 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
2387 ProcessExpressionType(newCall);
2388 newCall.byReference = true;
2393 Expression exp, newExp;
2394 Identifier id = CopyIdentifier(inst.exp.identifier);
2396 // Put the instantiation in an InitDeclarator...
2397 if(inst.members && inst.members->first)
2399 newExp = MkExpOp(CopyExpression(inst.exp), '=', newCall);
2401 exp = MkExpBrackets(MkList());
2402 ListAdd(exp.list, newExp);
2403 ProcessInstMembers(inst, inst.exp, exp.list, false);
2404 ListAdd(exp.list, inst.exp);
2406 ProcessExpression(inst.exp);
2408 // Take it out since we're using it...
2414 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2415 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id),
2416 MkInitializerAssignment(exp)));
2417 //inst.exp.identifier = null;
2420 FreeExpression(newCall);
2426 ProcessInstantiation(inst);
2429 case structDeclaration:
2434 for(spec = decl.specifiers->first; spec; spec = spec.next)
2435 ProcessSpecifier(spec);
2442 static void ProcessStatement(Statement stmt)
2448 if(stmt.labeled.stmt)
2449 ProcessStatement(stmt.labeled.stmt);
2452 if(stmt.caseStmt.exp)
2453 ProcessExpression(stmt.caseStmt.exp);
2454 if(stmt.caseStmt.stmt)
2455 ProcessStatement(stmt.caseStmt.stmt);
2459 if(stmt.compound.context)
2463 Statement prevCompound = curCompound;
2464 Context prevContext = curContext;
2466 if(!stmt.compound.isSwitch)
2469 curContext = stmt.compound.context;
2472 if(stmt.compound.declarations)
2474 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
2475 ProcessDeclaration(decl);
2477 if(stmt.compound.statements)
2479 for(s = stmt.compound.statements->first; s; s = s.next)
2481 ProcessStatement(s);
2485 curCompound = prevCompound;
2486 curContext = prevContext;
2490 case expressionStmt:
2493 if(stmt.expressions)
2495 for(exp = stmt.expressions->first; exp; exp = exp.next)
2497 ProcessExpression(exp);
2506 ((Expression)stmt.ifStmt.exp->last).usage.usageGet = true;
2507 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
2509 ProcessExpression(exp);
2511 if(stmt.ifStmt.stmt)
2512 ProcessStatement(stmt.ifStmt.stmt);
2513 if(stmt.ifStmt.elseStmt)
2514 ProcessStatement(stmt.ifStmt.elseStmt);
2520 ((Expression)stmt.switchStmt.exp->last).usage.usageGet = true;
2521 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
2522 ProcessExpression(exp);
2523 ProcessStatement(stmt.switchStmt.stmt);
2528 if(stmt.whileStmt.exp)
2532 ((Expression)stmt.whileStmt.exp->last).usage.usageGet = true;
2533 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
2535 ProcessExpression(exp);
2538 if(stmt.whileStmt.stmt)
2539 ProcessStatement(stmt.whileStmt.stmt);
2544 if(stmt.doWhile.exp)
2547 ((Expression)stmt.doWhile.exp->last).usage.usageGet = true;
2548 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
2550 ProcessExpression(exp);
2553 if(stmt.doWhile.stmt)
2554 ProcessStatement(stmt.doWhile.stmt);
2560 if(stmt.forStmt.init)
2561 ProcessStatement(stmt.forStmt.init);
2563 if(stmt.forStmt.check && stmt.forStmt.check.expressions)
2565 ((Expression)stmt.forStmt.check.expressions->last).usage.usageGet = true;
2568 if(stmt.forStmt.check)
2569 ProcessStatement(stmt.forStmt.check);
2570 if(stmt.forStmt.increment)
2572 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
2573 ProcessExpression(exp);
2575 if(stmt.forStmt.stmt)
2576 ProcessStatement(stmt.forStmt.stmt);
2588 if(stmt.expressions && stmt.expressions->last)
2590 ((Expression)stmt.expressions->last).usage.usageGet = true;
2591 for(exp = stmt.expressions->first; exp; exp = exp.next)
2593 ProcessExpression(exp);
2598 case badDeclarationStmt:
2600 ProcessDeclaration(stmt.decl);
2606 if(stmt.asmStmt.inputFields)
2608 for(field = stmt.asmStmt.inputFields->first; field; field = field.next)
2609 if(field.expression)
2610 ProcessExpression(field.expression);
2612 if(stmt.asmStmt.outputFields)
2614 for(field = stmt.asmStmt.outputFields->first; field; field = field.next)
2615 if(field.expression)
2616 ProcessExpression(field.expression);
2618 if(stmt.asmStmt.clobberedFields)
2620 for(field = stmt.asmStmt.clobberedFields->first; field; field = field.next)
2621 if(field.expression)
2622 ProcessExpression(field.expression);
2628 static void ProcessFunction(FunctionDefinition function)
2632 yylloc = function.loc;
2633 ProcessStatement(function.body);
2637 /////////// INSTANTIATIONS / DATA TYPES PASS /////////////////////////////////////////////
2638 public void ProcessInstantiations()
2641 // Is this still needed?
2642 //CreateInstancesBody();
2644 for(external = ast->first; external; external = external.next)
2646 curExternal = external;
2647 if(external.type == declarationExternal)
2649 //currentClass = external.function._class;
2650 if(external.declaration)
2651 ProcessDeclaration(external.declaration);
2653 else if(external.type == functionExternal)
2655 //currentClass = null;
2656 ProcessFunction(external.function);
2658 else if(external.type == classExternal)
2660 ClassDefinition _class = external._class;
2661 //currentClass = external.symbol.registered;
2662 if(_class.definitions)
2665 //Class regClass = _class.symbol.registered;
2667 // Process all functions
2668 for(def = _class.definitions->first; def; def = def.next)
2670 if(def.type == functionClassDef)
2672 curExternal = def.function.declarator ? def.function.declarator.symbol.pointerExternal : external;
2673 ProcessFunction((FunctionDefinition)def.function);
2675 else if(def.type == declarationClassDef && def.decl.type == instDeclaration)
2677 ProcessInstantiation(def.decl.inst);
2679 else if(def.type == defaultPropertiesClassDef && def.defProperties)
2681 MemberInit defProperty;
2683 // Add this to the context
2686 string = CopyString("this");
2687 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2689 globalContext.symbols.Add((BTNode)thisSymbol);
2691 for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
2693 //thisClass = regClass;
2694 ProcessMemberInitData(defProperty); ///*, regClass, &id
2698 globalContext.symbols.Remove((BTNode)thisSymbol);
2699 FreeSymbol(thisSymbol);
2701 else if(def.type == propertyClassDef && def.propertyDef)
2703 PropertyDef prop = def.propertyDef;
2705 // Add this to the context
2708 string = CopyString("this");
2709 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2711 globalContext.symbols.Add((BTNode)thisSymbol);
2713 //thisClass = regClass;
2716 curExternal = prop.symbol ? prop.symbol.externalSet : null;
2717 ProcessStatement(prop.setStmt);
2721 curExternal = prop.symbol ? prop.symbol.externalGet : null;
2722 ProcessStatement(prop.getStmt);
2726 curExternal = prop.symbol ? prop.symbol.externalIsSet : null;
2727 ProcessStatement(prop.issetStmt);
2731 globalContext.symbols.Remove((BTNode)thisSymbol);
2732 FreeSymbol(thisSymbol);
2734 else if(def.type == propertyWatchClassDef && def.propertyWatch)
2736 PropertyWatch propertyWatch = def.propertyWatch;
2738 // Add this to the context
2741 string = CopyString("this");
2742 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2744 globalContext.symbols.Add((BTNode)thisSymbol);
2746 //thisClass = regClass;
2747 if(propertyWatch.compound)
2749 /* This was already added in pass15:ProcessClass()
2752 string = CopyString("this");
2753 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2755 propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
2757 ProcessStatement(propertyWatch.compound);
2759 // thisClass = null;
2761 //globalContext.symbols.Delete((BTNode)thisSymbol);
2762 globalContext.symbols.Remove((BTNode)thisSymbol);
2763 FreeSymbol(thisSymbol);