3 #define YYLTYPE Location
6 extern External curExternal;
7 static Statement curCompound;
8 static Statement createInstancesBody;
9 static Statement destroyInstancesBody;
11 static void CreateInstancesBody()
13 if(inCompiler && !createInstancesBody)
15 char registerName[1024], moduleName[MAX_FILENAME];
17 Declarator declarator;
19 createInstancesBody = MkCompoundStmt(null, MkList());
20 createInstancesBody.compound.context = Context { parent = globalContext };
22 specifiers = MkList();
23 ListAdd(specifiers, MkSpecifier(VOID));
25 //strcpy(moduleName, outputFile);
26 GetLastDirectory(outputFile, moduleName);
27 StripExtension(moduleName);
28 ChangeCh(moduleName, ' ', '_');
29 ChangeCh(moduleName, '.', '_');
30 ChangeCh(moduleName, '-', '_');
31 sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
33 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
36 FunctionDefinition function = MkFunction(specifiers, declarator, null);
37 ProcessFunctionBody(function, createInstancesBody);
38 ListAdd(ast, MkExternalFunction(function));
41 // Destroy Instances Body
42 destroyInstancesBody = MkCompoundStmt(null, MkList());
43 destroyInstancesBody.compound.context = Context { parent = globalContext };
45 specifiers = MkList();
46 ListAdd(specifiers, MkSpecifier(VOID));
48 sprintf(registerName, "__ecereDestroyModuleInstances_%s", moduleName);
50 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
53 FunctionDefinition function = MkFunction(specifiers, declarator, null);
54 ProcessFunctionBody(function, destroyInstancesBody);
55 ListAdd(ast, MkExternalFunction(function));
60 // ***************** EXPRESSION PROCESSING ***************************
61 static void ProcessMemberInitData(MemberInit member)
63 if(member.initializer)
64 ProcessInitializer(member.initializer);
67 static void ProcessInstantiation(Instantiation inst)
69 if(inst.members && inst.members->first)
72 for(members = inst.members->first; members; members = members.next)
74 if(members.type == dataMembersInit)
76 if(members.dataMembers)
79 for(member = members.dataMembers->first; member; member = member.next)
80 ProcessMemberInitData(member);
83 else if(members.type == methodMembersInit)
85 ProcessFunction((FunctionDefinition)members.function);
91 // ADDED TO SUPPORT NESTED UNNAMED STRUCTURES
92 static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Instantiation inst, Expression instExp, OldList list, bool zeroOut)
94 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
96 // For simple classes, ensure all members are initialized
98 DataMember dataMember;
99 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
101 if(!dataMember.isProperty)
103 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
105 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
110 bool memberFilled = false;
111 if(inst.members && inst.members->first)
113 Class curClass = null;
114 DataMember curMember = null;
115 DataMember subMemberStack[256];
116 int subMemberStackPos = 0;
119 for(members = inst.members->first; members; members = members.next)
121 if(members.type == dataMembersInit)
123 MemberInit member = null;
124 for(member = members.dataMembers->first; member; member = member.next)
126 if(member.identifiers)
128 Identifier firstID = member.identifiers->first;
129 DataMember _subMemberStack[256];
130 int _subMemberStackPos = 0;
131 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
134 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
137 if(thisMember && thisMember.memberAccess == publicAccess)
139 curMember = thisMember;
140 curClass = curMember._class;
141 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
142 subMemberStackPos = _subMemberStackPos;
144 if(!firstID.next && thisMember == dataMember)
152 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
155 curMember = link.data;
156 if(!firstID.next && curMember == dataMember)
166 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
167 if(curMember == dataMember)
174 curMember = curMember.next;
176 curMember = parentMember.members.first;
180 // curMember = curMember.next;
183 if(memberFilled) break;
185 if(memberFilled) break;
192 Expression instExpCopy = CopyExpression(instExp);
193 Expression memberExp;
195 Expression value = MkExpConstant("0");
197 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
198 memberExp.member.memberType = MemberType::dataMember;
200 value.usage.usageGet = true;
201 setExp = MkExpOp(memberExp, '=', value);
203 value.loc = inst.loc;
206 setExp.loc = inst.loc;
208 FreeType(instExpCopy.expType);
209 instExpCopy.expType = instExp.expType;
210 if(instExp.expType) instExp.expType.refCount++;
212 ProcessExpressionType(setExp);
213 ProcessExpression(setExp);
215 ListAdd(list, setExp);
222 if(parentMember.type == unionMember)
229 // Returns if all members are set
230 static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList list, bool zeroOut)
233 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
234 bool fullSet = true, convert = false;
235 if(classSym && classSym.registered && classSym.registered.type == bitClass)
237 Expression exp = null;
238 if(inst.members && inst.members->first)
240 // Ensure all members are initialized only once
242 while(_class != classSym.registered)
244 BitMember bitMember = null;
245 Class lastClass = _class;
247 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
249 for(bitMember = _class.membersAndProperties.first; bitMember; bitMember = bitMember.next)
251 BitMember curMember = null;
252 Class curClass = null;
253 DataMember subMemberStack[256];
254 int subMemberStackPos = 0;
255 MemberInit member = null;
257 for(members = inst.members->first; members; members = members.next)
259 if(members.type == dataMembersInit)
261 for(member = members.dataMembers->first; member; member = member.next)
263 if(member.identifiers)
265 Identifier firstID = member.identifiers->first;
266 DataMember _subMemberStack[256];
267 int _subMemberStackPos = 0;
270 BitMember thisMember = (BitMember)eClass_FindDataMember(_class, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
273 // WARNING: Brackets needed here, awaiting precomp fix
274 thisMember = (BitMember)eClass_FindProperty(_class, firstID.string, privateModule);
276 if(thisMember && thisMember.memberAccess == publicAccess)
278 curMember = thisMember;
279 curClass = curMember._class;
280 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
281 subMemberStackPos = _subMemberStackPos;
283 if(thisMember == bitMember)
291 eClass_FindNextMember(classSym.registered, &curClass, (DataMember *)&curMember, subMemberStack, &subMemberStackPos);
292 if(curMember == bitMember)
305 if(!bitMember.isProperty)
307 Expression part = null;
308 OldList * specs = MkList();
310 //decl = SpecDeclFromString(bitMember.dataTypeString, specs, null);
311 decl = SpecDeclFromString(_class.dataTypeString, specs, null);
313 ProcessInitializer(member.initializer);
315 if(member.initializer && member.initializer.type == expInitializer)
320 sprintf(pos, "%d", bitMember.pos);
321 // (((type) value) << bitPos)
322 part = MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(
323 MkTypeName(specs, decl), MkExpBrackets(MkListOne(member.initializer.exp))))), LEFT_OP, MkExpConstant(pos))));
326 part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl),
327 MkExpBrackets(MkListOne(member.initializer.exp)))));
329 member.initializer.exp = null;
330 FreeInitializer(member.initializer);
331 member.initializer = null;
335 exp = MkExpOp(exp,'|', part);
339 // Clean this up... should only be used for Conversion properties...
342 char setName[1024], getName[1024];
343 DeclareProperty((Property)bitMember, setName, getName);
344 if(member.initializer && member.initializer.type == expInitializer)
346 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)),
347 MkListOne(member.initializer.exp));
350 member.initializer.exp = null;
351 FreeInitializer(member.initializer);
352 member.initializer = null;
360 exp = MkExpBrackets(MkListOne(exp));
362 exp = MkExpConstant("0");
364 // Just added this one...
365 exp.expType = MkClassType(classSym.string);
367 ProcessExpression(exp);
371 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
373 Class _class = classSym.registered;
374 Expression exp = null;
375 if(inst.members && inst.members->first)
377 MemberInit member = null;
378 Property prop = null;
380 for(members = inst.members->first; members; members = members.next)
382 if(members.type == dataMembersInit)
384 for(member = members.dataMembers->first; member; member = member.next)
386 if(member.identifiers)
388 Identifier firstID = member.identifiers->first;
389 prop = eClass_FindProperty(_class, firstID.string, privateModule);
411 char setName[1024], getName[1024];
412 DeclareProperty(prop, setName, getName);
413 if(member.initializer && member.initializer.type == expInitializer)
415 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member.initializer.exp));
418 member.initializer.exp = null;
419 FreeInitializer(member.initializer);
420 member.initializer = null;
425 ProcessInitializer(member.initializer);
426 if(member.initializer && member.initializer.type == expInitializer)
428 //exp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(_class.fullName, null), member.exp)));
429 exp = MkExpCast(QMkClass(_class.fullName, null), MkExpBrackets(MkListOne(member.initializer.exp)));
432 member.initializer.exp = null;
433 FreeInitializer(member.initializer);
434 member.initializer = null;
440 exp = MkExpBrackets(MkListOne(exp));
442 exp = MkExpConstant("0");
444 ProcessExpression(exp);
448 else if(classSym && classSym.registered)
450 if(classSym.registered.type == structClass)
452 // For simple classes, ensure all members are initialized
454 while(_class != classSym.registered)
456 DataMember dataMember;
457 Class lastClass = _class;
459 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
461 if(_class.structSize != _class.memberOffset)
464 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
466 if(!dataMember.isProperty)
468 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
470 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
475 bool memberFilled = false;
476 if(inst.members && inst.members->first)
478 Class curClass = null;
479 DataMember curMember = null;
480 DataMember subMemberStack[256];
481 int subMemberStackPos = 0;
483 for(members = inst.members->first; members; members = members.next)
485 if(members.type == dataMembersInit && members.dataMembers)
487 MemberInit member = null;
488 for(member = members.dataMembers->first; member; member = member.next)
490 if(member.identifiers)
492 DataMember _subMemberStack[256];
493 int _subMemberStackPos = 0;
494 Identifier firstID = member.identifiers->first;
495 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
498 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
501 if(thisMember.memberAccess == publicAccess)
503 curMember = thisMember;
504 curClass = curMember._class;
505 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
506 subMemberStackPos = _subMemberStackPos;
508 if(!firstID.next && curMember == dataMember)
517 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
518 if(curMember == dataMember)
525 if(memberFilled) break;
527 if(memberFilled) break;
534 Expression instExpCopy = CopyExpression(instExp);
535 Expression memberExp;
537 Expression value = MkExpConstant("0");
539 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
540 memberExp.member.memberType = MemberType::dataMember;
542 value.usage.usageGet = true;
543 setExp = MkExpOp(memberExp, '=', value);
545 value.loc = inst.loc;
548 setExp.loc = inst.loc;
550 FreeType(instExpCopy.expType);
551 instExpCopy.expType = instExp.expType;
552 if(instExp.expType) instExp.expType.refCount++;
554 ProcessExpressionType(setExp);
555 ProcessExpression(setExp);
557 ListAdd(list, setExp);
567 // THEN SET EVERYTHING IN THE ORDER IT IS SET
568 if(inst.members && inst.members->first)
570 Class curClass = null;
571 DataMember curMember = null;
572 DataMember subMemberStack[256];
573 int subMemberStackPos = 0;
575 for(members = inst.members->first; members; members = members.next)
577 if(members.type == dataMembersInit && members.dataMembers)
579 MemberInit member = null;
580 Method method = null;
582 for(member = members.dataMembers->first; member; member = member.next)
584 Identifier ident = null;
585 DataMember thisMember = null;
586 if(member.identifiers)
588 DataMember _subMemberStack[256];
589 int _subMemberStackPos = 0;
590 Identifier firstID = member.identifiers->first;
591 thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
594 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
598 if(thisMember.memberAccess == publicAccess)
600 curMember = thisMember;
601 curClass = curMember._class;
602 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
603 subMemberStackPos = _subMemberStackPos;
606 else if(classSym.registered.type != structClass)
608 method = eClass_FindMethod(classSym.registered, ident.string, privateModule);
609 if(!method || method.type != virtualMethod)
615 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
616 thisMember = curMember;
619 if(thisMember || method)
621 Expression instExpCopy = CopyExpression(instExp);
622 Expression setExp = null;
624 instExpCopy.tempCount = instExp.tempCount;
627 ident = MkIdentifier(thisMember.name);
630 Expression memberExp;
632 if(thisMember && thisMember.isProperty && ((Property)thisMember).conversion)
634 if(member.identifiers && member.identifiers->count > 1)
636 Identifier id = member.identifiers->first;
637 // TODO: Set the member types for those
638 memberExp = MkExpMember(instExpCopy, id);
639 for(id = id.next; id; id = id.next)
640 memberExp = MkExpMember(memberExp, id);
643 memberExp = MkExpMember(instExpCopy, ident);
645 if(member.initializer && member.initializer.type == expInitializer && member.initializer.exp)
647 member.initializer.exp.usage.usageGet = true;
648 setExp = MkExpOp(memberExp, '=', member.initializer.exp);
651 member.initializer.exp = null;
652 FreeInitializer(member.initializer);
653 member.initializer = null;
655 // TODO: list initializer not working...
657 memberExp.loc = inst.loc;
659 if(member.identifiers)
660 member.identifiers->Clear();
664 setExp.loc = inst.loc;
666 FreeType(instExpCopy.expType);
667 instExpCopy.expType = instExp.expType;
668 if(instExp.expType) instExp.expType.refCount++;
672 ProcessExpressionType(setExp);
673 ProcessExpression(setExp);
675 ListAdd(list, setExp);
684 return fullSet || convert;
687 public void DeclareClass(Symbol classSym, char * className)
689 /*if(classSym.registered.templateClass)
692 char className[1024];
693 strcpy(className, "__ecereClass_");
694 templateSym = FindClass(classSym.registered.templateClass.fullName);
695 FullClassNameCat(className, templateSym.string, true);
696 MangleClassName(className);
698 DeclareClass(templateSym, className);
700 if(classSym && classSym.id == MAXINT)
702 // Add Class declaration as extern
704 OldList * specifiers, * declarators;
707 if(!classSym._import)
709 // TESTING: DANGER HERE... CHECK FOR TEMPLATES ONLY? SET classSym.module ELSEWHERE?
710 // if(!classSym.module) return;
711 if(!classSym.module) classSym.module = mainModule;
712 if(!classSym.module) return;
713 classSym._import = ClassImport
715 isRemote = classSym.registered ? classSym.registered.isRemote : false;
716 name = CopyString(classSym.string);
718 classSym.module.classes.Add(classSym._import);
720 classSym._import.itself = true;
722 specifiers = MkList();
723 declarators = MkList();
725 ListAdd(specifiers, MkSpecifier(EXTERN));
726 ListAdd(specifiers, MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null));
728 d = MkDeclaratorPointer(MkPointer(null, null),
729 MkDeclaratorIdentifier(MkIdentifier(className)));
731 ListAdd(declarators, MkInitDeclarator(d, null));
733 decl = MkDeclaration(specifiers, declarators);
737 ast->Insert(curExternal.prev, (classSym.pointerExternal = MkExternalDeclaration(decl)));
738 // classSym.id = curExternal.symbol.id;
741 classSym.id = curExternal.symbol ? curExternal.symbol.idCode : 0;
743 classSym.idCode = classSym.id;
746 else if(classSym && curExternal.symbol.idCode < classSym.id)
747 //else if(curExternal.symbol.id <= classSym.id)
749 // DANGER: (Moved here)
750 if(classSym.structExternal)
751 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
753 // Move _class declaration higher...
754 ast->Move(classSym.pointerExternal, curExternal.prev);
758 if(classSym.structExternal)
759 DeclareStruct(classSym.string, classSym.registered && classSym.registered.type == noHeadClass);
762 // TOFIX: For non simple classes, Class is in pointerExternal and actual struct in structExternal
763 if(classSym.structExternal)
764 ast->Move(classSym.structExternal, classSym.pointerExternal);
766 classSym.id = curExternal.symbol.idCode;
768 classSym.idCode = classSym.id;
772 void ProcessExpressionInstPass(Expression exp)
774 ProcessExpression(exp);
777 static void ProcessExpression(Expression exp)
780 char debugExpString[1024] = "";
781 PrintExpression(exp, debugExpString);
789 Instantiation inst = exp.instance;
790 if(inCompiler && inst._class)
792 char className[1024];
793 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
796 if(classSym && classSym.registered && classSym.registered.type == bitClass)
800 OldList list = { 0 };
802 ProcessInstMembers(inst, null, &list, false);
804 ProcessExpression(inst.exp);
806 //Why was this here twice? ProcessInstMembers(inst, null, &list);
809 exp.op.exp1 = inst.exp;
810 exp.op.exp2 = list.first;
812 // Take expression out... (Why was the comment alone?)
817 Type expType = exp.expType;
818 Expression prev = exp.prev, next = exp.next;
820 ProcessInstMembers(inst, null, &list, false);
823 FreeType(exp.destType);
825 *exp = *(Expression)list.first;
828 Expression firstExp = list.first;
832 FreeType(exp.destType);
833 exp.destType = expType;
834 //if(expType) expType.refCount++;
840 else if(classSym && classSym.registered && (classSym.registered.type == unitClass || classSym.registered.type == enumClass))
844 OldList list = { 0 };
847 ProcessInstMembers(inst, null, &list, false);
849 ProcessExpression(inst.exp);
851 //Why was this here twice? ProcessInstMembers(inst, null, &list);
854 exp.op.exp1 = inst.exp;
855 exp.op.exp2 = list.first;
857 // Take expression out... (Why was the comment alone?)
860 list.Remove(list.first);
861 while(e = list.first)
869 Expression prev = exp.prev, next = exp.next;
870 Type expType = exp.expType;
871 OldList list = { 0 };
872 ProcessInstMembers(inst, null, &list, false);
877 Expression e = list.first;
878 FreeType(exp.destType);
882 exp.expType = expType;
885 while(e = list.first)
893 exp.type = constantExp;
894 exp.constant = CopyString("0");
898 else if(classSym && classSym.registered && classSym.registered.type == structClass)
903 exp.type = bracketsExp;
906 ProcessInstMembers(inst, inst.exp, exp.list, false);
908 ProcessExpression(inst.exp);
912 exp.type = (ExpressionType)1000; // remove expression
915 // Take expression out...
921 Declaration dummyDecl;
922 // Unnamed instantiation
924 // Make a declaration in the closest compound statement
925 // (Do not reuse (since using address for function calls)...)
928 ListAdd(decls, MkInitDeclarator(
929 MkDeclaratorIdentifier(MkIdentifier(className)), null));
930 decl = MkDeclaration(specs, decls);
932 /* Never mind this... somebody might modify the values...
936 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
937 inst.id = MkIdentifier(className);
938 decl = MkDeclarationInst(inst);
939 exp.type = ExpIdentifier;
940 exp.identifier = inst.id;
941 if(!curCompound.compound.declarations)
942 curCompound.compound.declarations = MkList();
943 curCompound.compound.declarations->Insert(null, decl);
944 ProcessDeclaration(decl);
950 //OldList * specs = MkList(), * decls = MkList();
951 //sprintf(className, "__ecereClassData_%s", inst._class.name);
952 //ListAdd(specs, MkStructOrUnion(SpecifierStruct, MkIdentifier(className), null));
955 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
956 dummyDecl = MkDeclaration(null,null);
957 if(!curCompound.compound.declarations)
958 curCompound.compound.declarations = MkList();
959 curCompound.compound.declarations->Insert(null, dummyDecl);
961 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
964 OldList * list = MkList();
965 if(inst.isConstant && ProcessBracketInst(inst, list))
967 decl = MkDeclaration(MkList(), MkList());
969 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
970 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)),
971 MkInitializerList(list)));
973 exp.type = identifierExp;
974 exp.identifier = MkIdentifier(className);
981 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst._class), MkExpIdentifier(MkIdentifier(className)), null));
984 // Set properties & data members in expression
985 // to handle jump and control statements
986 // Set unset data members to 0
987 exp.type = bracketsExp;
990 instExp = QMkExpId(className);
991 instExp.loc = exp.loc;
992 instExp.expType = MkClassType(inst._class.name);
994 // Mark the declarated instance as fullset so it doesn't need to be zeroed out
995 decl.inst.fullSet = ProcessInstMembers(inst, instExp, exp.list, false);
997 ListAdd(exp.list, instExp);
1001 FreeType(exp.expType);
1002 exp.expType = MkClassType(inst._class.name);
1004 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
1006 void * prev = dummyDecl.prev, * next = dummyDecl.next;
1008 dummyDecl.prev = prev;
1009 dummyDecl.next = next;
1013 ProcessDeclaration(decl);
1016 if(!curCompound.compound.declarations)
1017 curCompound.compound.declarations = MkList();
1018 curCompound.compound.declarations->Insert(null, decl);
1027 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
1028 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
1031 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
1032 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
1033 newCall.byReference = true;
1037 strcpy(className, "__ecereClass_");
1038 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
1040 classSym = FindClass(classSym.registered.templateClass.fullName);
1041 FullClassNameCat(className, classSym.string, true);
1044 FullClassNameCat(className, inst._class.name, true);
1046 MangleClassName(className);
1047 DeclareClass(classSym, className);
1048 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
1050 ProcessExpressionType(newCall);
1051 newCall.byReference = true;
1056 if(inst.members && inst.members->first)
1058 exp.type = bracketsExp;
1059 exp.list = MkList();
1063 ListAdd(exp.list, MkExpOp(inst.exp, '=', newCall));
1066 FreeExpression(newCall);
1068 ProcessInstMembers(inst, inst.exp, exp.list, false);
1071 FreeExpression(inst.exp);
1077 exp.op.exp1 = inst.exp;
1078 exp.op.exp2 = newCall;
1080 ProcessExpression(inst.exp);
1086 // Unnamed instantiation
1087 if(inst.members && inst.members->first)
1089 char ecereTemp[100];
1090 MembersInit members;
1091 int tempCount = exp.tempCount;
1094 // Check if members use temp count...
1095 for(members = inst.members->first; members; members = members.next)
1097 if(members.type == dataMembersInit && members.dataMembers)
1100 for(member = members.dataMembers->first; member; member = member.next)
1102 if(member.initializer && member.initializer.type == expInitializer)
1104 ProcessMemberInitData(member); // ADDED THIS TO HAVE PROPER tempCount ALREADY...
1105 tempCount = Max(tempCount, member.initializer.exp.tempCount);
1112 tempCount = Max(tempCount, declTempCount);
1116 curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
1117 sprintf(ecereTemp, "__ecereTemp%d", tempCount);
1119 // (__ecereTemp = eInstance_New(_class), __ecerePropclass_Set( ), __ecereTemp)
1122 instExp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp))));
1123 //instExp = QMkExpId(ecereTemp);
1124 instExp.tempCount = tempCount;
1126 exp.type = bracketsExp;
1127 exp.list = MkList();
1129 ListAdd(exp.list, MkExpOp(instExp, '=', newCall));
1132 instExp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp))));
1134 instExp.tempCount = tempCount;
1135 exp.type = bracketsExp;
1136 exp.list = MkList();
1138 ListAdd(exp.list, MkExpOp((tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp), '=', newCall));
1140 instExp.expType = MkClassType(inst._class.name);
1142 ProcessInstMembers(inst, instExp, exp.list, false);
1144 FreeExpression(instExp);
1146 ProcessExpression(tmpExp);
1148 // TEST: exp.tempCount = Max(exp.tempCount, instExp.tempCount);
1151 //ListAdd(exp.list, QMkExpId(ecereTemp));
1152 ListAdd(exp.list, MkExpBrackets(MkListOne(MkExpCast(QMkClass(inst._class.name, null), (tmpExp = QMkExpId(ecereTemp), tmpExp.byReference = true, tmpExp)))));
1153 exp.tempCount = tempCount;
1156 declTempCount = Max(declTempCount, tempCount);
1161 FreeType(newCall.destType);
1162 FreeType(newCall.expType);
1163 newCall.destType = exp.destType;
1164 newCall.expType = exp.expType;
1170 if(exp.type != instanceExp)
1174 ProcessInstantiation(inst);
1183 // if(exp._new.size) exp._new.size.usage.usageGet = true;
1184 ProcessExpression(exp._new.size);
1188 // if(exp._renew.size) exp._renew.size.usage.usageGet = true;
1189 ProcessExpression(exp._renew.size);
1190 // if(exp._renew.exp) exp._renew.exp.usage.usageGet = true;
1191 ProcessExpression(exp._renew.exp);
1195 bool assign = false;
1199 // Assignment Operators
1202 exp.op.exp2.usage.usageGet = true;
1204 exp.op.exp1.usage.usageSet = true;
1218 exp.op.exp2.usage.usageGet = true;
1221 exp.op.exp1.usage.usageSet = true;
1227 exp.op.exp1.usage.usageSet = true;
1232 if(exp.op.exp1 && exp.op.exp2)
1234 exp.op.exp1.usage.usageGet = true;
1235 exp.op.exp2.usage.usageGet = true;
1244 exp.op.exp1.usage.usageGet = true;
1249 exp.op.exp2.usage.usageGet = true;
1252 // Binary only operators
1268 exp.op.exp1.usage.usageGet = true;
1270 exp.op.exp2.usage.usageGet = true;
1276 // TEST: if(exp.op.exp2) exp.op.exp1.tempCount = Max(exp.op.exp1.tempCount, exp.op.exp2.tempCount);
1277 ProcessExpression(exp.op.exp1);
1278 // TEST: exp.tempCount = Max(exp.op.exp1.tempCount, exp.tempCount);
1283 // Don't use the temporaries used by the left side...
1285 // TEST: exp.op.exp2.tempCount = Max(exp.op.exp2.tempCount, exp.op.exp1.tempCount);
1286 exp.op.exp2.tempCount = exp.op.exp1.tempCount;
1287 ProcessExpression(exp.op.exp2);
1288 // TEST: exp.tempCount = Max(exp.op.exp2.tempCount, exp.tempCount);
1292 case extensionExpressionExp:
1296 for(e = exp.list->first; e; e = e.next)
1298 e.tempCount = Max(e.tempCount, exp.tempCount);
1301 e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true }));
1303 ProcessExpression(e);
1304 exp.tempCount = Max(exp.tempCount, e.tempCount);
1312 exp.index.exp.usage.usageGet = true;
1313 ProcessExpression(exp.index.exp);
1314 for(e = exp.index.index->first; e; e = e.next)
1317 e.usage.usageGet = true;
1318 ProcessExpression(e);
1320 // Ignore temps in the index for now...
1321 exp.tempCount = exp.index.exp.tempCount;
1323 if(exp.index.exp.expType)
1325 Type source = exp.index.exp.expType;
1326 if(source.kind == classType && source._class && source._class.registered && source._class.registered != containerClass &&
1327 eClass_IsDerived(source._class.registered, containerClass))
1329 Class _class = source._class.registered;
1330 // __extension__({ Iterator<type> i { container }; i.Index(e, [ exp.usage.usageSet ]; i.value; });
1332 char iteratorType[1024];
1333 OldList * declarations = MkList();
1334 OldList * statements = MkList();
1335 OldList * args = MkList();
1336 OldList * instMembers = MkList();
1338 Context context = PushContext();
1340 sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
1342 ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
1344 ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
1345 MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
1347 ListAdd(args, MkExpBrackets(exp.index.index));
1348 ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
1350 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
1351 MkIdentifier("Index")), args))));
1353 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
1355 exp.type = bracketsExp;
1356 exp.list = MkListOne(MkExpPointer(expExt = (MkExpExtensionCompound(MkCompoundStmt(declarations, statements))), MkIdentifier("data")));
1357 expExt.compound.compound.context = context;
1358 PopContext(context);
1359 expExt.usage = exp.usage;
1360 ProcessExpressionType(exp.list->first);
1361 ProcessExpression(exp.list->first);
1370 Method method = null;
1372 ProcessExpression(exp.call.exp);
1374 if(exp.call.arguments)
1376 for(e = exp.call.arguments->first; e; e = e.next)
1378 e.usage.usageGet = true;
1379 e.usage.usageArg = true;
1381 // TEST: e.tempCount = Max(e.tempCount, exp.tempCount);
1382 ProcessExpression(e);
1383 // TEST: exp.tempCount = Max(exp.tempCount, e.tempCount);
1390 exp.member.exp.usage.usageGet = true;
1391 ProcessExpression(exp.member.exp);
1393 // Must do this here so we can set the MemberType of deep properties inside instantiations
1394 if(!exp.member.memberType)
1396 Type type = exp.member.exp.expType;
1397 if((type && type.kind == classType && exp.member.member))
1399 // Check if it's an instance
1400 Class _class = (exp.member.member._class && exp.member.member.classSym) ? exp.member.member.classSym.registered : (type._class ? type._class.registered : null);
1401 Property prop = null;
1402 Method method = null;
1403 DataMember member = null;
1404 Property revConvert = null;
1406 // Prioritize data members over properties for "this"
1407 if(exp.member.thisPtr)
1409 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1411 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1413 // Prioritize properties over data members otherwise
1416 // Look for publicAccess Members first
1417 prop = eClass_FindProperty(_class, exp.member.member.string, null);
1419 member = eClass_FindDataMember(_class, exp.member.member.string, null, null, null);
1420 if(!prop && !member)
1422 method = eClass_FindMethod(_class, exp.member.member.string, null);
1425 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1427 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1431 if(!prop && !member)
1432 method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
1433 if(!prop && !member && !method)
1435 Symbol classSym = FindClass(exp.member.member.string);
1438 Class convertClass = classSym.registered;
1440 revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
1446 exp.member.memberType = propertyMember;
1448 prop.dataType = ProcessTypeString(prop.dataTypeString, false);
1450 FreeType(exp.expType);
1451 exp.expType = prop.dataType;
1452 if(prop.dataType) prop.dataType.refCount++;
1456 exp.member.memberType = methodMember;
1457 if(!method.dataType)
1458 //method.dataType = ((Symbol)method.symbol).type;
1459 ProcessMethodType(method);
1461 FreeType(exp.expType);
1462 exp.expType = method.dataType;
1463 if(method.dataType) method.dataType.refCount++;
1467 exp.member.memberType = dataMember;
1468 DeclareStruct(_class.fullName, false);
1469 if(!member.dataType)
1470 member.dataType = ProcessTypeString(member.dataTypeString, false);
1472 FreeType(exp.expType);
1473 exp.expType = member.dataType;
1474 if(member.dataType) member.dataType.refCount++;
1478 exp.member.memberType = reverseConversionMember;
1480 FreeType(exp.expType);
1481 exp.expType = MkClassType(revConvert._class.fullName);
1484 printf($"Error: Couldn't find member %s in class %s\n",
1485 exp.member.member.string, _class.name);*/
1494 exp.cast.exp.usage.usageGet = true;
1495 ProcessExpression(exp.cast.exp);
1501 if(exp.usage.usageGet)
1502 exp.cond.cond.usage.usageGet = true;
1504 ProcessExpression(exp.cond.cond);
1505 for(e = exp.cond.exp->first; e; e = e.next)
1507 if(!e.next && exp.usage.usageGet) e.usage.usageGet = true;
1508 ProcessExpression(e);
1510 if(exp.cond.elseExp)
1512 if(exp.usage.usageGet) exp.cond.elseExp.usage.usageGet = true;
1513 ProcessExpression(exp.cond.elseExp);
1517 case extensionCompoundExp:
1519 if(exp.compound.compound.statements &&
1520 ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
1521 ((Statement)exp.compound.compound.statements->last).expressions->last)
1523 ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
1525 ProcessStatement(exp.compound);
1530 ProcessExpression(exp.vaArg.exp);
1533 case extensionInitializerExp:
1535 ProcessInitializer(exp.initializer.initializer);
1539 CheckTemplateTypes(exp);
1542 static void ProcessInitializer(Initializer init)
1546 case expInitializer:
1547 init.exp.usage.usageGet = true;
1548 ProcessExpression(init.exp);
1550 case listInitializer:
1553 for(i = init.list->first; i; i = i.next)
1554 ProcessInitializer(i);
1560 static void ProcessSpecifier(Specifier spec)
1575 for(e = spec.list->first; e; e = e.next)
1578 ProcessExpression(e.exp);
1583 case structSpecifier:
1584 case unionSpecifier:
1587 if(spec.definitions)
1590 for(def = spec.definitions->first; def; def = def.next)
1592 if(def.type == declarationClassDef && def.decl && def.decl.type == structDeclaration)
1593 ProcessDeclaration(def.decl);
1599 case SpecifierClass:
1606 static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list)
1608 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1609 DataMember dataMember = null;
1610 bool someMemberSet = false;
1612 // For simple classes, ensure all members are initialized
1613 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1615 MembersInit members;
1616 MemberInit member = null;
1618 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1620 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1625 Class curClass = null;
1626 DataMember curMember = null;
1627 DataMember subMemberStack[256];
1628 int subMemberStackPos = 0;
1631 if(inst.members && inst.members->first)
1633 for(members = inst.members->first; members; members = members.next)
1635 if(members.type == dataMembersInit)
1637 for(member = members.dataMembers->first; member; member = member.next)
1639 if(member.identifiers)
1641 Identifier firstID = member.identifiers->first;
1643 DataMember _subMemberStack[256];
1644 int _subMemberStackPos = 0;
1645 DataMember thisMember;
1646 thisMember = firstID ? (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule) : null;
1647 // FILL MEMBER STACK
1648 if(!thisMember && firstID)
1649 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1650 if(thisMember && thisMember.memberAccess == publicAccess)
1652 curMember = thisMember;
1653 curClass = curMember._class;
1654 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
1655 subMemberStackPos = _subMemberStackPos;
1658 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
1661 curMember = link.data;
1664 // Choose the first specified member of the union...
1665 if(parentMember.type == unionMember)
1668 dataMember = curMember;
1672 if(dataMember == thisMember)
1674 // Look for another member of this one and merge them
1675 // into one instantiation...
1676 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1678 OldList * partList = MkList();
1679 // TODO: We're assuming this is a simple class right now...
1682 MembersInit nextMembers;
1683 MemberInit next = member.next;
1685 if(!dataMember.dataType)
1686 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1687 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1688 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1691 OldList * identifiers = MkList();
1693 for(id = ((Identifier)member.identifiers->first).next; id; id = id.next)
1694 identifiers->Add(CopyIdentifier(id));
1696 // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
1697 // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
1698 /*member.identifiers->Remove(firstID);*/
1700 MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
1703 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1705 if(!nextMembers.dataMembers)
1708 if(members != nextMembers) next = nextMembers.dataMembers->first;
1710 if(nextMembers.type == dataMembersInit)
1712 MemberInit nextMember;
1714 for(nextMember = next; nextMember;
1715 nextMember = next, next = nextMember ? nextMember.next : null)
1717 Identifier nextID = nextMember.identifiers->first;
1718 if(nextMember.identifiers &&
1719 nextMember.identifiers->count > 1 &&
1720 !strcmp(firstID.string, nextID.string))
1722 nextMembers.dataMembers->Remove(nextMember);
1723 nextMember.identifiers->Remove(nextID);
1724 ListAdd(partList, nextMember);
1730 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1731 MkListOne(MkMembersInitList(partList))));
1739 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1740 if(curMember == dataMember)
1748 curMember = curMember.next;
1750 curMember = parentMember.members.first;
1752 if(curMember == dataMember)
1765 if(member && member.initializer && member.initializer.type == expInitializer)
1767 Expression memberExp = null;
1768 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1769 member.initializer.exp.expType._class.registered.type == structClass)
1771 OldList * subList = MkList();
1772 ProcessBracketInst(member.initializer.exp.instance, subList);
1773 FreeExpression(member.initializer.exp);
1774 ListAdd(list, MkInitializerList(subList));
1778 member.initializer.exp.usage.usageGet = true;
1779 ProcessExpression(member.initializer.exp);
1780 ListAdd(list, MkInitializerAssignment(member.initializer.exp));
1782 member.initializer.exp = null;
1783 FreeInitializer(member.initializer);
1784 member.initializer = null;
1785 someMemberSet = true;
1787 else if(member && member.initializer && member.initializer.type == listInitializer)
1789 ListAdd(list, member.initializer);
1790 member.initializer = null;
1791 someMemberSet = true;
1793 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember)
1796 if(!dataMember.dataType)
1797 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1798 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1799 if(classSym && classSym.registered && classSym.registered.type == structClass)
1801 OldList * subList = MkList();
1802 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1803 Instantiation inst = MkInstantiation(spec, null, null);
1804 ProcessBracketInst(inst, subList);
1807 ListAdd(list, MkInitializerList(subList));
1810 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1814 if(parentMember.type == unionMember)
1818 // TESTING THIS NEW CODE FOR ANCHORS...
1819 if(parentMember.type == unionMember && !someMemberSet)
1822 dataMember = parentMember.members.first;
1823 if(!dataMember.dataType && dataMember.dataTypeString)
1824 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1825 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1826 if(classSym && classSym.registered && classSym.registered.type == structClass)
1828 OldList * subList = MkList();
1829 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1830 Instantiation inst = MkInstantiation(spec, null, null);
1831 ProcessBracketInst(inst, subList);
1834 ListAdd(list, MkInitializerList(subList));
1837 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
1842 static bool ProcessBracketInst(Instantiation inst, OldList list)
1844 static int recursionCount = 0;
1845 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1846 Class _class = null;
1848 if(recursionCount > 500) return false;
1851 while(_class != classSym.registered)
1853 DataMember dataMember;
1854 Class lastClass = _class;
1856 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
1858 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1860 if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1862 if(!ProcessBracketInst_DataMember(dataMember, inst, list))
1870 MembersInit members;
1871 MemberInit member = null;
1874 if(inst.members && inst.members->first)
1876 DataMember curMember = null;
1877 Class curClass = null;
1878 DataMember subMemberStack[256];
1879 int subMemberStackPos = 0;
1881 for(members = inst.members->first; members; members = members.next)
1883 if(members.type == dataMembersInit)
1885 for(member = members.dataMembers->first; member; member = member.next)
1887 Identifier firstID = member.identifiers ? member.identifiers->first : null;
1890 DataMember _subMemberStack[256];
1891 int _subMemberStackPos = 0;
1892 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
1893 // FILL MEMBER STACK
1895 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1898 curMember = thisMember;
1899 curClass = curMember._class;
1900 memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
1901 subMemberStackPos = _subMemberStackPos;
1904 if(curMember == dataMember)
1906 if(dataMember.isProperty)
1908 if(!((Property)dataMember).Set)
1910 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1917 // Look for another member of this one and merge them
1918 // into one instantiation...
1919 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1921 OldList * partList = MkList();
1922 // TODO: We're assuming this is a simple _class right now...
1924 MembersInit nextMembers;
1925 MemberInit next = member.next;
1927 if(!dataMember.dataType)
1928 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1929 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1930 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1932 member.identifiers->Remove(firstID);
1934 MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
1936 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1938 if(!nextMembers.dataMembers) continue;
1940 if(members != nextMembers) next = nextMembers.dataMembers->first;
1942 if(nextMembers.type == dataMembersInit)
1944 MemberInit nextMember;
1946 for(nextMember = next; nextMember;
1947 nextMember = next, next = nextMember ? nextMember.next : null)
1949 Identifier nextID = nextMember.identifiers->first;
1950 if(nextMember.identifiers &&
1951 nextMember.identifiers->count > 1 &&
1952 !strcmp(firstID.string, nextID.string))
1954 nextMembers.dataMembers->Remove(nextMember);
1955 nextMember.identifiers->Remove(nextID);
1956 ListAdd(partList, nextMember);
1962 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1963 MkListOne(MkMembersInitList(partList))));
1966 member.identifiers = null;
1974 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1975 if(curMember == dataMember)
1977 if(dataMember.isProperty)
1979 if(!((Property)dataMember).Set)
1981 Compiler_Error($"No set defined for property %s\n", dataMember.name);
1997 if(dataMember.isProperty) continue;
1998 if(member && member.initializer && member.initializer.type == expInitializer)
2000 Expression memberExp = null;
2001 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
2002 member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
2004 OldList * subList = MkList();
2005 ProcessBracketInst(member.initializer.exp.instance, subList);
2006 FreeExpression(member.initializer.exp);
2007 ListAdd(list, MkInitializerList(subList));
2011 member.initializer.exp.usage.usageGet = true;
2012 ProcessExpression(member.initializer.exp);
2013 ListAdd(list, MkInitializerAssignment(member.initializer.exp));
2017 // member.exp = null;
2018 member.takeOutExp = true;
2020 else if(member && member.initializer && member.initializer.type == listInitializer)
2022 ListAdd(list, member.initializer);
2023 member.initializer = null;
2025 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/)
2029 if(!dataMember.dataType)
2030 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2031 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
2033 if(classSym && classSym.registered && classSym.registered.type == structClass)
2035 OldList * subList = MkList();
2036 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
2037 Instantiation inst = MkInstantiation(spec, null, null);
2038 ProcessBracketInst(inst, subList);
2040 ListAdd(list, MkInitializerList(subList));
2042 else if(dataMember.dataType.kind == arrayType)
2043 ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
2045 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2051 if(inst.members && inst.members->first)
2053 MembersInit members;
2054 MemberInit member = null;
2056 for(members = inst.members->first; members; members = members.next)
2058 if(members.type == dataMembersInit)
2060 for(member = members.dataMembers->first; member; member = member.next)
2062 if(member.takeOutExp)
2064 member.initializer.exp = null;
2065 FreeInitializer(member.initializer);
2066 member.initializer = null;
2076 static Declaration curDecl;
2077 static int declTempCount;
2079 static void ProcessDeclaration(Declaration decl)
2084 case initDeclaration:
2086 if(!curDecl) { curDecl = decl; declTempCount = 0; }
2090 for(s = decl.specifiers->first; s; s = s.next)
2092 ProcessSpecifier(s);
2095 if(decl.declarators)
2099 for(d = decl.declarators->first; d; d = d.next)
2102 ProcessInitializer(d.initializer);
2105 if(curDecl == decl) { curDecl = null; declTempCount = 0; }
2108 case instDeclaration:
2110 Instantiation inst = decl.inst;
2114 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
2119 if(!inst.isConstant || (classSym && classSym.registered && (classSym.registered.type == normalClass || classSym.registered.type == noHeadClass)))
2121 // If this instantiation is outside, turn it into a declaration plus an instantiation expression
2122 decl.type = initDeclaration;
2123 decl.specifiers = MkListOne(MkSpecifierName/*MkClassName*/(inst._class.name));
2124 if(decl.declMode == staticAccess)
2126 decl.specifiers->Insert(null, MkSpecifier(STATIC));
2128 decl.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst.exp.identifier.string)), null));
2130 ProcessDeclaration(decl);
2131 CreateInstancesBody();
2134 Expression exp = MkExpInstance(inst);
2135 stmt = MkExpressionStmt(MkListOne(exp)); // MkExpOp(inst.exp, '=',
2136 ListAdd(createInstancesBody.compound.statements, stmt);
2137 ProcessExpressionType(exp);
2140 if(classSym && classSym.registered && (classSym.registered.type == normalClass))
2142 ListAdd(createInstancesBody.compound.statements,
2143 MkExpressionStmt(MkListOne(MkExpCall(
2144 MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
2145 MkListOne(CopyExpression(inst.exp))))));
2147 // We'd like the = 0 as well...
2149 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2150 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2151 ProcessExpressionType(exp);
2154 else if(classSym && classSym.registered && (classSym.registered.type == noHeadClass))
2156 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2157 ListAdd(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2158 ProcessExpressionType(exp);
2164 // Precompiler won't know if this isn't constant
2165 CreateInstancesBody();
2170 char className[1024];
2172 decl.type = initDeclaration;
2173 decl.specifiers = MkList();
2174 decl.declarators = MkList();
2176 // Replace instantiation here
2177 if(classSym && classSym.registered && classSym.registered.type == bitClass)
2179 OldList list = { 0 };
2181 // Put the instantiation in an InitDeclarator...
2182 ProcessInstMembers(inst, inst.exp, &list, false);
2183 ProcessExpression(inst.exp);
2185 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2186 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2187 MkInitializerAssignment(list.first)));
2188 inst.exp.identifier = null;
2190 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
2192 OldList list = { 0 };
2194 // Put the instantiation in an InitDeclarator...
2195 ProcessInstMembers(inst, inst.exp, &list, false);
2196 ProcessExpression(inst.exp);
2198 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2199 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2200 MkInitializerAssignment(list.first)));
2202 inst.exp.identifier = null;
2204 else if(classSym && classSym.registered && classSym.registered.type == structClass)
2208 DeclareStruct(inst._class.name, false);
2210 strcpy(className, "__ecereClass_");
2211 FullClassNameCat(className, classSym.string, true);
2212 MangleClassName(className);
2213 DeclareClass(classSym, className);
2216 ProcessExpression(inst.exp);
2218 // Put the instantiation in an InitDeclarator...
2222 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2223 ListAdd(decl.declarators,
2224 MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
2225 inst.exp.identifier = null;
2229 OldList * list = MkList();
2230 if(ProcessBracketInst(inst, list))
2232 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2233 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2234 MkInitializerList(list)));
2235 inst.exp.identifier = null;
2239 // If bracket instantiation failed (property: for conversions only?)
2240 // TODO: (Fix this so it initializes members through brackets,
2241 // and then does properties)
2244 // TESTING THIS MEMORY LEAK FIX:
2245 FreeList(list, FreeInitializer);
2247 exp = MkExpBrackets(MkList());
2248 ProcessInstMembers(inst, inst.exp, exp.list, true);
2249 ListAdd(exp.list, CopyExpression(inst.exp));
2250 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2251 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2252 MkInitializerAssignment(exp)));
2253 inst.exp.identifier = null;
2262 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
2263 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
2266 sprintf(size, "%d", classSym.registered.templateClass ? classSym.registered.templateClass.structSize : classSym.registered.structSize);
2267 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(MkExpConstant(size)));
2271 strcpy(className, "__ecereClass_");
2273 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
2275 classSym = FindClass(classSym.registered.templateClass.fullName);
2276 FullClassNameCat(className, classSym.string, true);
2279 FullClassNameCat(className, inst._class.name, true);
2280 MangleClassName(className);
2282 DeclareClass(classSym, className); // THIS WAS IN C VERSION BUT NOT IN eC VERSION?
2283 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
2284 ProcessExpressionType(newCall);
2285 newCall.byReference = true;
2289 DeclareClass(classSym, className);
2293 Expression exp, newExp;
2294 Identifier id = CopyIdentifier(inst.exp.identifier);
2296 // Put the instantiation in an InitDeclarator...
2297 if(inst.members && inst.members->first)
2299 newExp = MkExpOp(CopyExpression(inst.exp), '=', newCall);
2301 exp = MkExpBrackets(MkList());
2302 ListAdd(exp.list, newExp);
2303 ProcessInstMembers(inst, inst.exp, exp.list, false);
2304 ListAdd(exp.list, inst.exp);
2306 ProcessExpression(inst.exp);
2308 // Take it out since we're using it...
2314 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2315 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id),
2316 MkInitializerAssignment(exp)));
2317 //inst.exp.identifier = null;
2320 FreeExpression(newCall);
2326 ProcessInstantiation(inst);
2329 case structDeclaration:
2334 for(spec = decl.specifiers->first; spec; spec = spec.next)
2335 ProcessSpecifier(spec);
2342 static void ProcessStatement(Statement stmt)
2348 if(stmt.labeled.stmt)
2349 ProcessStatement(stmt.labeled.stmt);
2352 if(stmt.caseStmt.exp)
2353 ProcessExpression(stmt.caseStmt.exp);
2354 if(stmt.caseStmt.stmt)
2355 ProcessStatement(stmt.caseStmt.stmt);
2359 if(stmt.compound.context)
2363 Statement prevCompound = curCompound;
2364 Context prevContext = curContext;
2366 if(!stmt.compound.isSwitch)
2369 curContext = stmt.compound.context;
2372 if(stmt.compound.declarations)
2374 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
2375 ProcessDeclaration(decl);
2377 if(stmt.compound.statements)
2379 for(s = stmt.compound.statements->first; s; s = s.next)
2381 ProcessStatement(s);
2385 curCompound = prevCompound;
2386 curContext = prevContext;
2390 case expressionStmt:
2393 if(stmt.expressions)
2395 for(exp = stmt.expressions->first; exp; exp = exp.next)
2397 ProcessExpression(exp);
2406 ((Expression)stmt.ifStmt.exp->last).usage.usageGet = true;
2407 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
2409 ProcessExpression(exp);
2411 if(stmt.ifStmt.stmt)
2412 ProcessStatement(stmt.ifStmt.stmt);
2413 if(stmt.ifStmt.elseStmt)
2414 ProcessStatement(stmt.ifStmt.elseStmt);
2420 ((Expression)stmt.switchStmt.exp->last).usage.usageGet = true;
2421 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
2422 ProcessExpression(exp);
2423 ProcessStatement(stmt.switchStmt.stmt);
2428 if(stmt.whileStmt.exp)
2432 ((Expression)stmt.whileStmt.exp->last).usage.usageGet = true;
2433 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
2435 ProcessExpression(exp);
2438 if(stmt.whileStmt.stmt)
2439 ProcessStatement(stmt.whileStmt.stmt);
2444 if(stmt.doWhile.exp)
2447 ((Expression)stmt.doWhile.exp->last).usage.usageGet = true;
2448 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
2450 ProcessExpression(exp);
2453 if(stmt.doWhile.stmt)
2454 ProcessStatement(stmt.doWhile.stmt);
2460 if(stmt.forStmt.init)
2461 ProcessStatement(stmt.forStmt.init);
2463 if(stmt.forStmt.check && stmt.forStmt.check.expressions)
2465 ((Expression)stmt.forStmt.check.expressions->last).usage.usageGet = true;
2468 if(stmt.forStmt.check)
2469 ProcessStatement(stmt.forStmt.check);
2470 if(stmt.forStmt.increment)
2472 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
2473 ProcessExpression(exp);
2475 if(stmt.forStmt.stmt)
2476 ProcessStatement(stmt.forStmt.stmt);
2488 if(stmt.expressions && stmt.expressions->last)
2490 ((Expression)stmt.expressions->last).usage.usageGet = true;
2491 for(exp = stmt.expressions->first; exp; exp = exp.next)
2493 ProcessExpression(exp);
2498 case badDeclarationStmt:
2500 ProcessDeclaration(stmt.decl);
2506 if(stmt.asmStmt.inputFields)
2508 for(field = stmt.asmStmt.inputFields->first; field; field = field.next)
2509 if(field.expression)
2510 ProcessExpression(field.expression);
2512 if(stmt.asmStmt.outputFields)
2514 for(field = stmt.asmStmt.outputFields->first; field; field = field.next)
2515 if(field.expression)
2516 ProcessExpression(field.expression);
2518 if(stmt.asmStmt.clobberedFields)
2520 for(field = stmt.asmStmt.clobberedFields->first; field; field = field.next)
2521 if(field.expression)
2522 ProcessExpression(field.expression);
2528 static void ProcessFunction(FunctionDefinition function)
2532 yylloc = function.loc;
2533 ProcessStatement(function.body);
2537 /////////// INSTANTIATIONS / DATA TYPES PASS /////////////////////////////////////////////
2538 public void ProcessInstantiations()
2541 // Is this still needed?
2542 //CreateInstancesBody();
2544 for(external = ast->first; external; external = external.next)
2546 curExternal = external;
2547 if(external.type == declarationExternal)
2549 //currentClass = external.function._class;
2550 if(external.declaration)
2551 ProcessDeclaration(external.declaration);
2553 else if(external.type == functionExternal)
2555 //currentClass = null;
2556 ProcessFunction(external.function);
2558 else if(external.type == classExternal)
2560 ClassDefinition _class = external._class;
2561 //currentClass = external.symbol.registered;
2562 if(_class.definitions)
2565 //Class regClass = _class.symbol.registered;
2567 // Process all functions
2568 for(def = _class.definitions->first; def; def = def.next)
2570 if(def.type == functionClassDef)
2572 curExternal = def.function.declarator ? def.function.declarator.symbol.pointerExternal : external;
2573 ProcessFunction((FunctionDefinition)def.function);
2575 else if(def.type == declarationClassDef && def.decl.type == instDeclaration)
2577 ProcessInstantiation(def.decl.inst);
2579 else if(def.type == defaultPropertiesClassDef && def.defProperties)
2581 MemberInit defProperty;
2583 // Add this to the context
2586 string = CopyString("this");
2587 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2589 globalContext.symbols.Add((BTNode)thisSymbol);
2591 for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
2593 //thisClass = regClass;
2594 ProcessMemberInitData(defProperty); ///*, regClass, &id
2598 globalContext.symbols.Remove((BTNode)thisSymbol);
2599 FreeSymbol(thisSymbol);
2601 else if(def.type == propertyClassDef && def.propertyDef)
2603 PropertyDef prop = def.propertyDef;
2605 // Add this to the context
2608 string = CopyString("this");
2609 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2611 globalContext.symbols.Add((BTNode)thisSymbol);
2613 //thisClass = regClass;
2616 curExternal = prop.symbol ? prop.symbol.externalSet : null;
2617 ProcessStatement(prop.setStmt);
2621 curExternal = prop.symbol ? prop.symbol.externalGet : null;
2622 ProcessStatement(prop.getStmt);
2626 curExternal = prop.symbol ? prop.symbol.externalIsSet : null;
2627 ProcessStatement(prop.issetStmt);
2631 globalContext.symbols.Remove((BTNode)thisSymbol);
2632 FreeSymbol(thisSymbol);
2634 else if(def.type == propertyWatchClassDef && def.propertyWatch)
2636 PropertyWatch propertyWatch = def.propertyWatch;
2638 // Add this to the context
2641 string = CopyString("this");
2642 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2644 globalContext.symbols.Add((BTNode)thisSymbol);
2646 //thisClass = regClass;
2647 if(propertyWatch.compound)
2651 string = CopyString("this");
2652 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2654 propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
2656 ProcessStatement(propertyWatch.compound);
2658 // thisClass = null;
2660 //globalContext.symbols.Delete((BTNode)thisSymbol);
2661 globalContext.symbols.Remove((BTNode)thisSymbol);
2662 FreeSymbol(thisSymbol);