3 #define YYLTYPE Location
6 extern External curExternal;
7 static Statement curCompound;
8 static Statement createInstancesBody;
9 static Statement destroyInstancesBody;
10 static External createInstancesExternal;
11 static External destroyInstancesExternal;
13 static void CreateInstancesBody()
15 if(inCompiler && !createInstancesBody)
17 char registerName[1024], moduleName[MAX_FILENAME];
19 Declarator declarator;
21 createInstancesBody = MkCompoundStmt(null, MkList());
22 createInstancesBody.compound.context = Context { parent = globalContext };
24 specifiers = MkList();
25 ListAdd(specifiers, MkSpecifier(VOID));
27 //strcpy(moduleName, outputFile);
28 GetLastDirectory(outputFile, moduleName);
29 StripExtension(moduleName);
30 FixModuleName(moduleName);
31 sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
33 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), null);
36 FunctionDefinition function = _MkFunction(specifiers, declarator, null, false);
37 ProcessFunctionBody(function, createInstancesBody);
38 ListAdd(ast, createInstancesExternal = 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, false);
54 ProcessFunctionBody(function, destroyInstancesBody);
55 ListAdd(ast, destroyInstancesExternal = MkExternalFunction(function));
60 // ***************** EXPRESSION PROCESSING ***************************
61 static void ProcessMemberInitData(MemberInit member)
63 if(member.initializer)
64 ProcessInitializer(member.initializer);
67 static void ProcessInstantiation(Instantiation inst)
69 if(inst.members && inst.members->first)
72 for(members = inst.members->first; members; members = members.next)
74 if(members.type == dataMembersInit)
76 if(members.dataMembers)
79 for(member = members.dataMembers->first; member; member = member.next)
80 ProcessMemberInitData(member);
83 else if(members.type == methodMembersInit)
85 ProcessFunction((FunctionDefinition)members.function);
91 // ADDED TO SUPPORT NESTED UNNAMED STRUCTURES
92 static bool ProcessInstMembers_SimpleMemberEnsure(DataMember parentMember, Instantiation inst, Expression instExp, OldList list, bool zeroOut)
94 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
96 // For simple classes, ensure all members are initialized
98 DataMember dataMember;
99 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
101 if(!dataMember.isProperty)
103 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
105 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
110 bool memberFilled = false;
111 if(inst.members && inst.members->first)
113 Class curClass = null;
114 DataMember curMember = null;
115 DataMember subMemberStack[256];
116 int subMemberStackPos = 0;
119 for(members = inst.members->first; members; members = members.next)
121 if(members.type == dataMembersInit)
123 MemberInit member = null;
124 for(member = members.dataMembers->first; member; member = member.next)
126 if(member.identifiers)
128 Identifier firstID = member.identifiers->first;
129 DataMember _subMemberStack[256];
130 int _subMemberStackPos = 0;
131 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
134 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
137 if(thisMember && thisMember.memberAccess == publicAccess)
139 curMember = thisMember;
140 curClass = curMember._class;
141 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
142 subMemberStackPos = _subMemberStackPos;
144 if(!firstID.next && thisMember == dataMember)
152 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
155 curMember = link.data;
156 if(!firstID.next && curMember == dataMember)
166 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
167 if(curMember == dataMember)
174 curMember = curMember.next;
176 curMember = parentMember.members.first;
180 // curMember = curMember.next;
183 if(memberFilled) break;
185 if(memberFilled) break;
192 Expression instExpCopy = CopyExpression(instExp);
193 Expression memberExp;
195 Expression value = MkExpConstant("0");
197 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
198 memberExp.member.memberType = MemberType::dataMember;
200 value.usage.usageGet = true;
201 setExp = MkExpOp(memberExp, '=', value);
203 value.loc = inst.loc;
206 setExp.loc = inst.loc;
208 FreeType(instExpCopy.expType);
209 instExpCopy.expType = instExp.expType;
210 if(instExp.expType) instExp.expType.refCount++;
212 ProcessExpressionType(setExp);
213 ProcessExpression(setExp);
215 ListAdd(list, setExp);
222 if(parentMember.type == unionMember)
229 // Returns if all members are set
230 static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList list, bool zeroOut)
233 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
234 bool fullSet = true, convert = false;
235 if(classSym && classSym.registered && classSym.registered.type == bitClass)
237 Expression exp = null;
238 if(inst.members && inst.members->first)
240 // Ensure all members are initialized only once
242 while(_class != classSym.registered)
244 BitMember bitMember = null;
245 Class lastClass = _class;
247 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
249 for(bitMember = _class.membersAndProperties.first; bitMember; bitMember = bitMember.next)
251 BitMember curMember = null;
252 Class curClass = null;
253 DataMember subMemberStack[256];
254 int subMemberStackPos = 0;
255 MemberInit member = null;
257 for(members = inst.members->first; members; members = members.next)
259 if(members.type == dataMembersInit)
261 for(member = members.dataMembers->first; member; member = member.next)
263 if(member.identifiers)
265 Identifier firstID = member.identifiers->first;
266 DataMember _subMemberStack[256];
267 int _subMemberStackPos = 0;
270 BitMember thisMember = (BitMember)eClass_FindDataMember(_class, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
273 // WARNING: Brackets needed here, awaiting precomp fix
274 thisMember = (BitMember)eClass_FindProperty(_class, firstID.string, privateModule);
276 if(thisMember && thisMember.memberAccess == publicAccess)
278 curMember = thisMember;
279 curClass = curMember._class;
280 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
281 subMemberStackPos = _subMemberStackPos;
283 if(thisMember == bitMember)
291 eClass_FindNextMember(classSym.registered, &curClass, (DataMember *)&curMember, subMemberStack, &subMemberStackPos);
292 if(curMember == bitMember)
305 if(!bitMember.isProperty)
307 Expression part = null;
308 OldList * specs = MkList();
310 //decl = SpecDeclFromString(bitMember.dataTypeString, specs, null);
311 decl = SpecDeclFromString(_class.dataTypeString, specs, null);
313 ProcessInitializer(member.initializer);
315 if(member.initializer && member.initializer.type == expInitializer)
320 sprintf(pos, "%d", bitMember.pos);
321 // (((type) value) << bitPos)
322 part = MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(
323 MkTypeName(specs, decl), MkExpBrackets(MkListOne(member.initializer.exp))))), LEFT_OP, MkExpConstant(pos))));
326 part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl),
327 MkExpBrackets(MkListOne(member.initializer.exp)))));
329 member.initializer.exp = null;
330 FreeInitializer(member.initializer);
331 member.initializer = null;
335 exp = MkExpOp(exp,'|', part);
339 // Clean this up... should only be used for Conversion properties...
342 char setName[1024], getName[1024];
343 DeclareProperty(curExternal, (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(curExternal, prop, setName, getName);
413 if(member.initializer && member.initializer.type == expInitializer)
415 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member.initializer.exp));
418 member.initializer.exp = null;
419 FreeInitializer(member.initializer);
420 member.initializer = null;
425 ProcessInitializer(member.initializer);
426 if(member.initializer && member.initializer.type == expInitializer)
428 //exp = MkExpBrackets(MkListOne(MkExpCast(QMkClass(_class.fullName, null), member.exp)));
429 exp = MkExpCast(QMkClass(_class.fullName, null), MkExpBrackets(MkListOne(member.initializer.exp)));
432 member.initializer.exp = null;
433 FreeInitializer(member.initializer);
434 member.initializer = null;
440 exp = MkExpBrackets(MkListOne(exp));
442 exp = MkExpConstant("0");
444 ProcessExpression(exp);
448 else if(classSym && classSym.registered)
450 if(classSym.registered.type == structClass)
452 // For simple classes, ensure all members are initialized
454 while(_class != classSym.registered)
456 DataMember dataMember;
457 Class lastClass = _class;
459 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
461 if(_class.structSize != _class.memberOffset)
464 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
466 if(!dataMember.isProperty)
468 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
470 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
475 bool memberFilled = false;
476 if(inst.members && inst.members->first)
478 Class curClass = null;
479 DataMember curMember = null;
480 DataMember subMemberStack[256];
481 int subMemberStackPos = 0;
483 for(members = inst.members->first; members; members = members.next)
485 if(members.type == dataMembersInit && members.dataMembers)
487 MemberInit member = null;
488 for(member = members.dataMembers->first; member; member = member.next)
490 if(member.identifiers)
492 DataMember _subMemberStack[256];
493 int _subMemberStackPos = 0;
494 Identifier firstID = member.identifiers->first;
495 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
498 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
501 if(thisMember.memberAccess == publicAccess)
503 curMember = thisMember;
504 curClass = curMember._class;
505 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
506 subMemberStackPos = _subMemberStackPos;
508 if(!firstID.next && curMember == dataMember)
517 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
518 if(curMember == dataMember)
525 if(memberFilled) break;
527 if(memberFilled) break;
534 Expression instExpCopy = CopyExpression(instExp);
535 Expression memberExp;
537 Expression value = MkExpConstant("0");
539 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember.name));
540 memberExp.member.memberType = MemberType::dataMember;
542 value.usage.usageGet = true;
543 setExp = MkExpOp(memberExp, '=', value);
545 value.loc = inst.loc;
548 setExp.loc = inst.loc;
550 FreeType(instExpCopy.expType);
551 instExpCopy.expType = instExp.expType;
552 if(instExp.expType) instExp.expType.refCount++;
554 ProcessExpressionType(setExp);
555 ProcessExpression(setExp);
557 ListAdd(list, setExp);
567 // THEN SET EVERYTHING IN THE ORDER IT IS SET
568 if(inst.members && inst.members->first)
570 Class curClass = null;
571 DataMember curMember = null;
572 DataMember subMemberStack[256];
573 int subMemberStackPos = 0;
575 for(members = inst.members->first; members; members = members.next)
577 if(members.type == dataMembersInit && members.dataMembers)
579 MemberInit member = null;
580 Method method = null;
582 for(member = members.dataMembers->first; member; member = member.next)
584 Identifier ident = null;
585 DataMember thisMember = null;
586 if(member.identifiers && member.identifiers->first)
588 DataMember _subMemberStack[256];
589 int _subMemberStackPos = 0;
590 Identifier firstID = member.identifiers->first;
591 thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
594 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
598 if(thisMember.memberAccess == publicAccess)
600 curMember = thisMember;
601 curClass = curMember._class;
602 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
603 subMemberStackPos = _subMemberStackPos;
606 else if(classSym.registered.type != structClass)
608 method = eClass_FindMethod(classSym.registered, ident.string, privateModule);
609 if(!method || method.type != virtualMethod)
615 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
616 thisMember = curMember;
619 if(instExp && (thisMember || method))
621 Expression instExpCopy = CopyExpression(instExp);
622 Expression setExp = null;
624 instExpCopy.tempCount = instExp.tempCount;
627 ident = MkIdentifier(thisMember.name);
630 Expression memberExp;
631 bool freeMemberExp = false;
633 if(thisMember && thisMember.isProperty && ((Property)thisMember).conversion)
635 if(member.identifiers && member.identifiers->count > 1)
637 Identifier id = member.identifiers->first;
638 // TODO: Set the member types for those
639 memberExp = MkExpMember(instExpCopy, id);
640 for(id = id.next; id; id = id.next)
641 memberExp = MkExpMember(memberExp, id);
644 memberExp = MkExpMember(instExpCopy, ident);
646 if(member.initializer && member.initializer.type == expInitializer && member.initializer.exp)
648 member.initializer.exp.usage.usageGet = true;
649 setExp = MkExpOp(memberExp, '=', member.initializer.exp);
652 member.initializer.exp = null;
653 FreeInitializer(member.initializer);
654 member.initializer = null;
658 freeMemberExp = true;
659 // TOCHECK: WHat happens in here?
661 // TODO: list initializer not working...
662 memberExp.loc = inst.loc;
664 if(member.identifiers)
665 member.identifiers->Clear();
669 setExp.loc = inst.loc;
671 FreeType(instExpCopy.expType);
672 instExpCopy.expType = instExp.expType;
673 if(instExp.expType) instExp.expType.refCount++;
677 ProcessExpressionType(setExp);
678 ProcessExpression(setExp);
680 ListAdd(list, setExp);
683 FreeExpression(memberExp);
691 return fullSet || convert;
694 // We may want to have 2 functions here for dependency on struct or class pointer
695 public void DeclareClass(External neededFor, Symbol classSym, const char * className)
697 /*if(classSym.registered.templateClass)
700 char className[1024];
701 strcpy(className, "__ecereClass_");
702 templateSym = FindClass(classSym.registered.templateClass.fullName);
703 FullClassNameCat(className, templateSym.string, true);
705 DeclareClass(templateSym, className);
707 if(classSym && classSym.notYetDeclared)
709 if(!classSym.mustRegister)
711 if(!classSym._import)
713 if(!classSym.module) classSym.module = mainModule;
714 if(!classSym.module) return;
715 classSym._import = ClassImport
717 isRemote = classSym.registered ? classSym.registered.isRemote : 0;
718 name = CopyString(classSym.string);
720 classSym.module.classes.Add(classSym._import);
722 classSym._import.itself = true;
724 classSym.notYetDeclared = false;
726 if(!classSym.pointerExternal && inCompiler)
729 OldList * specifiers, * declarators;
732 specifiers = MkList();
733 declarators = MkList();
735 ListAdd(specifiers, MkSpecifier(EXTERN));
736 ListAdd(specifiers, MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null));
738 d = MkDeclaratorPointer(MkPointer(null, null),
739 MkDeclaratorIdentifier(MkIdentifier(className)));
741 ListAdd(declarators, MkInitDeclarator(d, null));
743 decl = MkDeclaration(specifiers, declarators);
745 classSym.pointerExternal = MkExternalDeclaration(decl);
746 ast->Add(classSym.pointerExternal);
748 DeclareStruct(classSym.pointerExternal, "ecere::com::Class", false, true);
751 if(inCompiler && classSym && classSym.pointerExternal && neededFor)
752 neededFor.CreateUniqueEdge(classSym.pointerExternal, false);
755 void ProcessExpressionInstPass(Expression exp)
757 ProcessExpression(exp);
760 static void ProcessExpression(Expression exp)
763 char debugExpString[1024] = "";
764 PrintExpression(exp, debugExpString);
772 Instantiation inst = exp.instance;
773 if(inCompiler && inst._class)
775 char className[1024];
776 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
779 if(classSym && classSym.registered && classSym.registered.type == bitClass)
783 OldList list = { 0 };
785 ProcessInstMembers(inst, null, &list, false);
787 ProcessExpression(inst.exp);
789 //Why was this here twice? ProcessInstMembers(inst, null, &list);
792 exp.op.exp1 = inst.exp;
793 exp.op.exp2 = list.first;
795 // Take expression out... (Why was the comment alone?)
800 Type expType = exp.expType;
801 Expression prev = exp.prev, next = exp.next;
803 ProcessInstMembers(inst, null, &list, false);
806 FreeType(exp.destType);
808 *exp = *(Expression)list.first;
811 Expression firstExp = list.first;
815 FreeType(exp.destType);
816 exp.destType = expType;
817 //if(expType) expType.refCount++;
823 else if(classSym && classSym.registered && (classSym.registered.type == unitClass || classSym.registered.type == enumClass))
827 OldList list = { 0 };
830 ProcessInstMembers(inst, null, &list, false);
832 ProcessExpression(inst.exp);
834 //Why was this here twice? ProcessInstMembers(inst, null, &list);
837 exp.op.exp1 = inst.exp;
838 exp.op.exp2 = list.first;
840 // Take expression out... (Why was the comment alone?)
843 list.Remove(list.first);
844 while((e = list.first))
852 Expression prev = exp.prev, next = exp.next;
853 Type expType = exp.expType;
854 OldList list = { 0 };
855 ProcessInstMembers(inst, null, &list, false);
860 Expression e = list.first;
861 Type destType = exp.destType;
866 // Fixes PrintLn(Degrees { 1 })
868 exp.destType = destType;
871 exp.expType = expType;
874 while((e = list.first))
882 exp.type = constantExp;
883 exp.constant = CopyString("0");
887 else if(classSym && classSym.registered && classSym.registered.type == structClass)
892 exp.type = bracketsExp;
895 ProcessInstMembers(inst, inst.exp, exp.list, false);
897 ProcessExpression(inst.exp);
901 exp.type = dummyExp; // remove expression
905 // Take expression out... -- It seems ProcessInstMembers() makes copies of it and it needs to be freed now
911 Declaration dummyDecl;
912 // Unnamed instantiation
914 // Make a declaration in the closest compound statement
915 // (Do not reuse (since using address for function calls)...)
918 ListAdd(decls, MkInitDeclarator(
919 MkDeclaratorIdentifier(MkIdentifier(className)), null));
920 decl = MkDeclaration(specs, decls);
922 /* Never mind this... somebody might modify the values...
926 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
927 inst.id = MkIdentifier(className);
928 decl = MkDeclarationInst(inst);
929 exp.type = ExpIdentifier;
930 exp.identifier = inst.id;
931 if(!curCompound.compound.declarations)
932 curCompound.compound.declarations = MkList();
933 curCompound.compound.declarations->Insert(null, decl);
934 ProcessDeclaration(decl);
940 //OldList * specs = MkList(), * decls = MkList();
941 //sprintf(className, "__ecereClassData_%s", inst._class.name);
942 //ListAdd(specs, MkStructOrUnion(SpecifierStruct, MkIdentifier(className), null));
945 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
946 dummyDecl = MkDeclaration(null,null);
949 if(!curCompound.compound.declarations)
950 curCompound.compound.declarations = MkList();
951 curCompound.compound.declarations->Insert(null, dummyDecl);
954 sprintf(className, "__simpleStruct%d", curContext.simpleID++);
957 OldList * list = MkList();
958 if(inst.isConstant && ProcessBracketInst(inst, list))
960 decl = MkDeclaration(MkList(), MkList());
962 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
963 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)),
964 MkInitializerList(list)));
966 exp.type = identifierExp;
967 exp.identifier = MkIdentifier(className);
974 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst._class), MkExpIdentifier(MkIdentifier(className)), null));
977 // Set properties & data members in expression
978 // to handle jump and control statements
979 // Set unset data members to 0
980 exp.type = bracketsExp;
983 instExp = QMkExpId(className);
984 instExp.loc = exp.loc;
985 instExp.expType = MkClassType(inst._class.name);
987 // Mark the declarated instance as fullset so it doesn't need to be zeroed out
988 decl.inst.fullSet = ProcessInstMembers(inst, instExp, exp.list, false);
990 ListAdd(exp.list, instExp);
994 FreeType(exp.expType);
995 exp.expType = MkClassType(inst._class.name);
997 // TRICKY STUFF, UGLY HACK FOR stateSizeAnchor = SizeAnchor { size.w = 10 };
999 void * prev = dummyDecl.prev, * next = dummyDecl.next;
1001 dummyDecl.prev = prev;
1002 dummyDecl.next = next;
1006 ProcessDeclaration(decl);
1009 if(!curCompound.compound.declarations)
1010 curCompound.compound.declarations = MkList();
1011 curCompound.compound.declarations->Insert(null, decl);
1020 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
1021 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
1024 Class c = classSym.registered.templateClass ? classSym.registered.templateClass : classSym.registered;
1025 Expression e = MkExpClassSize(MkSpecifierName(c.name));
1026 ProcessExpressionType(e);
1027 sprintf(size, "%d", c.structSize);
1028 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne( e /*MkExpConstant(size)*/));
1029 newCall.byReference = true;
1033 strcpy(className, "__ecereClass_");
1034 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
1036 classSym = FindClass(classSym.registered.templateClass.fullName);
1037 FullClassNameCat(className, classSym.string, true);
1040 FullClassNameCat(className, inst._class.name, true);
1042 DeclareClass(curExternal, classSym, className);
1043 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
1044 newCall.usage = exp.usage;
1046 ProcessExpressionType(newCall);
1047 if(newCall.expType && exp.expType)
1048 newCall.expType.passAsTemplate = exp.expType.passAsTemplate;
1049 newCall.byReference = true;
1054 if(inst.members && inst.members->first)
1056 exp.type = bracketsExp;
1057 exp.list = MkList();
1061 ListAdd(exp.list, MkExpOp(inst.exp, '=', newCall));
1064 FreeExpression(newCall);
1066 ProcessInstMembers(inst, inst.exp, exp.list, false);
1069 FreeExpression(inst.exp);
1075 exp.op.exp1 = inst.exp;
1076 exp.op.exp2 = newCall;
1078 ProcessExpression(inst.exp);
1084 // Unnamed instantiation
1085 if(inst.members && inst.members->first)
1087 char ecereTemp[100];
1088 MembersInit members;
1089 int tempCount = exp.tempCount;
1092 // Check if members use temp count...
1093 for(members = inst.members->first; members; members = members.next)
1095 if(members.type == dataMembersInit && members.dataMembers)
1098 for(member = members.dataMembers->first; member; member = member.next)
1100 if(member.initializer && member.initializer.type == expInitializer)
1102 ProcessMemberInitData(member); // ADDED THIS TO HAVE PROPER tempCount ALREADY...
1103 tempCount = Max(tempCount, member.initializer.exp.tempCount);
1109 tempCount = Max(tempCount, declTempCount);
1112 curExternal.function.tempCount = Max(curExternal.function.tempCount, tempCount);
1113 sprintf(ecereTemp, "__ecereInstance%d", tempCount);
1114 exp.type = extensionCompoundExp;
1115 exp.compound = MkCompoundStmt(null, null);
1116 exp.compound.compound.context = PushContext();
1117 exp.compound.compound.context.simpleID = exp.compound.compound.context.parent.simpleID;
1118 exp.compound.compound.declarations = MkListOne(QMkDeclaration(inst._class.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)),
1119 MkInitializerAssignment(newCall))));
1120 exp.compound.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
1122 instExp = QMkExpId(ecereTemp);
1123 instExp.tempCount = tempCount;
1124 instExp.expType = MkClassType(inst._class.name);
1125 instExp.byReference = true;
1126 ProcessInstMembers(inst, instExp, expList, false);
1127 FreeExpression(instExp);
1131 Expression tmpExp = QMkExpId(ecereTemp);
1132 tmpExp.byReference = true;
1133 ListAdd(expList, tmpExp);
1135 exp.tempCount = tempCount;
1137 declTempCount = Max(declTempCount, tempCount);
1138 PopContext(exp.compound.compound.context);
1142 Expression prev = exp.prev, next = exp.next;
1143 FreeType(newCall.destType);
1144 FreeType(newCall.expType);
1145 newCall.destType = exp.destType;
1146 newCall.expType = exp.expType;
1154 if(exp.type != instanceExp)
1158 ProcessInstantiation(inst);
1167 // if(exp._new.size) exp._new.size.usage.usageGet = true;
1168 ProcessExpression(exp._new.size);
1172 // if(exp._renew.size) exp._renew.size.usage.usageGet = true;
1173 ProcessExpression(exp._renew.size);
1174 // if(exp._renew.exp) exp._renew.exp.usage.usageGet = true;
1175 ProcessExpression(exp._renew.exp);
1179 //bool assign = false;
1183 // Assignment Operators
1186 exp.op.exp2.usage.usageGet = true;
1188 exp.op.exp1.usage.usageSet = true;
1202 exp.op.exp2.usage.usageGet = true;
1205 exp.op.exp1.usage.usageSet = true;
1211 exp.op.exp1.usage.usageSet = true;
1216 if(exp.op.exp1 && exp.op.exp2)
1218 exp.op.exp1.usage.usageGet = true;
1219 exp.op.exp2.usage.usageGet = true;
1228 exp.op.exp1.usage.usageGet = true;
1233 exp.op.exp2.usage.usageGet = true;
1236 // Binary only operators
1252 exp.op.exp1.usage.usageGet = true;
1254 exp.op.exp2.usage.usageGet = true;
1260 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)
1263 CopyTypeInto(type, exp.op.exp1.destType);
1264 type.passAsTemplate = false;
1265 FreeType(exp.op.exp1.destType);
1266 exp.op.exp1.destType = type;
1268 // TEST: if(exp.op.exp2) exp.op.exp1.tempCount = Max(exp.op.exp1.tempCount, exp.op.exp2.tempCount);
1269 ProcessExpression(exp.op.exp1);
1270 // TEST: exp.tempCount = Max(exp.op.exp1.tempCount, exp.tempCount);
1275 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)
1278 CopyTypeInto(type, exp.op.exp2.destType);
1279 type.passAsTemplate = false;
1280 FreeType(exp.op.exp2.destType);
1281 exp.op.exp2.destType = type;
1284 // Don't use the temporaries used by the left side...
1286 // TEST: exp.op.exp2.tempCount = Max(exp.op.exp2.tempCount, exp.op.exp1.tempCount);
1287 exp.op.exp2.tempCount = exp.op.exp1.tempCount;
1288 ProcessExpression(exp.op.exp2);
1289 // TEST: exp.tempCount = Max(exp.op.exp2.tempCount, exp.tempCount);
1293 case extensionExpressionExp:
1297 for(e = exp.list->first; e; e = e.next)
1299 e.tempCount = Max(e.tempCount, exp.tempCount);
1302 e.usage |= (exp.usage & (ExpUsage { usageGet = true, usageArg = true }));
1304 ProcessExpression(e);
1305 if(!e.next && e.expType && e.expType.passAsTemplate && exp.expType && !exp.expType.passAsTemplate)
1306 modifyPassAsTemplate(&exp.expType, true);
1307 exp.tempCount = Max(exp.tempCount, e.tempCount);
1315 exp.index.exp.usage.usageGet = true;
1316 ProcessExpression(exp.index.exp);
1317 for(e = exp.index.index->first; e; e = e.next)
1320 e.usage.usageGet = true;
1321 ProcessExpression(e);
1323 // Ignore temps in the index for now...
1324 exp.tempCount = exp.index.exp.tempCount;
1326 if(exp.index.exp.expType)
1328 Type source = exp.index.exp.expType;
1329 if(source.kind == classType && source._class && source._class.registered && source._class.registered != containerClass &&
1330 eClass_IsDerived(source._class.registered, containerClass))
1332 Class _class = source._class.registered;
1333 // __extension__({ Iterator<type> i { container }; i.Index(e, [ exp.usage.usageSet ]; i.value; });
1335 char iteratorType[1024];
1336 OldList * declarations = MkList();
1337 OldList * statements = MkList();
1338 OldList * args = MkList();
1339 OldList * instMembers = MkList();
1341 Context context = PushContext();
1343 sprintf(iteratorType, "Iterator<%s, %s >", _class.templateArgs[2].dataTypeString, _class.templateArgs[1].dataTypeString);
1345 ListAdd(instMembers, MkMemberInit(null, MkInitializerAssignment(exp.index.exp)));
1347 ListAdd(declarations, MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)),
1348 MkExpIdentifier(MkIdentifier("__internalIterator")), MkListOne(MkMembersInitList(instMembers)))));
1350 ListAdd(args, MkExpBrackets(exp.index.index));
1351 ListAdd(args, exp.usage.usageSet ? MkExpIdentifier(MkIdentifier("true")) : MkExpIdentifier(MkIdentifier("false")));
1353 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalIterator")),
1354 MkIdentifier("Index")), args))));
1356 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(null, '&', MkExpIdentifier(MkIdentifier("__internalIterator"))))));
1358 exp.type = bracketsExp;
1359 exp.list = MkListOne(MkExpPointer(expExt = (MkExpExtensionCompound(MkCompoundStmt(declarations, statements))), MkIdentifier("data")));
1360 expExt.compound.compound.context = context;
1361 PopContext(context);
1362 expExt.usage = exp.usage;
1363 ProcessExpressionType(exp.list->first);
1364 ProcessExpression(exp.list->first);
1373 //Method method = null;
1375 ProcessExpression(exp.call.exp);
1377 if(exp.call.arguments)
1379 for(e = exp.call.arguments->first; e; e = e.next)
1381 e.usage.usageGet = true;
1382 e.usage.usageArg = true;
1384 // TEST: e.tempCount = Max(e.tempCount, exp.tempCount);
1385 ProcessExpression(e);
1386 // TEST: exp.tempCount = Max(exp.tempCount, e.tempCount);
1393 exp.member.exp.usage.usageGet = true;
1394 // Tweak for LinkList::first to be casted to proper type (e.g. Link) when accessing members
1395 if(exp.member.memberType == dataMember &&
1396 exp.member.exp.expType && exp.member.exp.expType.thisClassFrom && exp.member.exp.expType.kind == classType &&
1397 exp.member.exp.expType._class && exp.member.exp.expType._class.registered &&
1398 !eClass_IsDerived(exp.member.exp.expType.thisClassFrom, exp.member.exp.expType._class.registered))
1399 exp.member.exp.expType.passAsTemplate = true;
1400 ProcessExpression(exp.member.exp);
1402 // Must do this here so we can set the MemberType of deep properties inside instantiations
1403 if(!exp.member.memberType)
1405 Type type = exp.member.exp.expType;
1406 if((type && type.kind == classType && exp.member.member))
1408 // Check if it's an instance
1409 Class _class = (exp.member.member._class && exp.member.member.classSym) ? exp.member.member.classSym.registered : (type._class ? type._class.registered : null);
1410 Property prop = null;
1411 Method method = null;
1412 DataMember member = null;
1413 Property revConvert = null;
1415 // Prioritize data members over properties for "this"
1416 if(exp.member.thisPtr)
1418 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1420 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1422 // Prioritize properties over data members otherwise
1425 // Look for publicAccess Members first
1426 prop = eClass_FindProperty(_class, exp.member.member.string, null);
1428 member = eClass_FindDataMember(_class, exp.member.member.string, null, null, null);
1429 if(!prop && !member)
1431 method = eClass_FindMethod(_class, exp.member.member.string, null);
1434 prop = eClass_FindProperty(_class, exp.member.member.string, privateModule);
1436 member = eClass_FindDataMember(_class, exp.member.member.string, privateModule, null, null);
1440 if(!prop && !member && !method) // NOTE: Recently added the !method here, causes private methods to unprioritized
1441 method = eClass_FindMethod(_class, exp.member.member.string, privateModule);
1442 if(!prop && !member && !method)
1444 Symbol classSym = FindClass(exp.member.member.string);
1447 Class convertClass = classSym.registered;
1449 revConvert = eClass_FindProperty(convertClass, _class.fullName, privateModule);
1455 exp.member.memberType = propertyMember;
1457 prop.dataType = ProcessTypeString(prop.dataTypeString, false);
1459 FreeType(exp.expType);
1460 exp.expType = prop.dataType;
1461 if(prop.dataType) prop.dataType.refCount++;
1465 exp.member.memberType = methodMember;
1466 if(!method.dataType)
1467 //method.dataType = ((Symbol)method.symbol).type;
1468 ProcessMethodType(method);
1470 FreeType(exp.expType);
1471 exp.expType = method.dataType;
1472 if(method.dataType) method.dataType.refCount++;
1476 exp.member.memberType = dataMember;
1477 DeclareStruct(curExternal, _class.fullName, false, true);
1478 if(!member.dataType)
1479 member.dataType = ProcessTypeString(member.dataTypeString, false);
1481 FreeType(exp.expType);
1482 exp.expType = member.dataType;
1483 if(member.dataType) member.dataType.refCount++;
1487 exp.member.memberType = reverseConversionMember;
1489 FreeType(exp.expType);
1490 exp.expType = MkClassType(revConvert._class.fullName);
1493 printf($"Error: Couldn't find member %s in class %s\n",
1494 exp.member.member.string, _class.name);*/
1503 //exp.cast.exp.usage.usageGet = true;
1504 exp.cast.exp.usage |= exp.usage;
1505 ProcessExpression(exp.cast.exp);
1511 if(exp.usage.usageGet)
1512 exp.cond.cond.usage.usageGet = true;
1514 ProcessExpression(exp.cond.cond);
1515 for(e = exp.cond.exp->first; e; e = e.next)
1517 if(!e.next && exp.usage.usageGet) e.usage.usageGet = true;
1518 ProcessExpression(e);
1520 if(exp.cond.elseExp)
1522 if(exp.usage.usageGet) exp.cond.elseExp.usage.usageGet = true;
1523 ProcessExpression(exp.cond.elseExp);
1527 case extensionCompoundExp:
1529 if(exp.compound.compound.statements &&
1530 ((Statement)exp.compound.compound.statements->last).type == expressionStmt &&
1531 ((Statement)exp.compound.compound.statements->last).expressions &&
1532 ((Statement)exp.compound.compound.statements->last).expressions->last)
1534 ((Expression)((Statement)exp.compound.compound.statements->last).expressions->last).usage = exp.usage;
1536 ProcessStatement(exp.compound);
1541 ProcessExpression(exp.vaArg.exp);
1544 case extensionInitializerExp:
1546 ProcessInitializer(exp.initializer.initializer);
1550 CheckTemplateTypes(exp);
1553 static void ProcessInitializer(Initializer init)
1557 case expInitializer:
1558 init.exp.usage.usageGet = true;
1559 ProcessExpression(init.exp);
1561 case listInitializer:
1564 for(i = init.list->first; i; i = i.next)
1565 ProcessInitializer(i);
1571 static void ProcessSpecifier(Specifier spec)
1586 for(e = spec.list->first; e; e = e.next)
1589 ProcessExpression(e.exp);
1594 case structSpecifier:
1595 case unionSpecifier:
1598 if(spec.definitions)
1601 for(def = spec.definitions->first; def; def = def.next)
1603 if(def.type == declarationClassDef && def.decl && def.decl.type == structDeclaration)
1604 ProcessDeclaration(def.decl);
1610 case SpecifierClass:
1617 static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list, DataMember namedParentMember, bool parentMemberSet)
1619 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1620 DataMember dataMember = null;
1621 bool someMemberSet = false;
1624 // For simple classes, ensure all members are initialized
1625 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1627 MembersInit members;
1628 MemberInit member = null;
1630 if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1632 OldList * subList = MkList(); //(dataMember.type == structMember) ? MkList() : null;
1634 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember.name ? dataMember : namedParentMember, someMemberSet || parentMemberSet || dataMember.prev))
1637 FreeList(subList, FreeInitializer);
1641 if(subList && subList->count)
1643 Initializer init = MkInitializerList(subList);
1645 sprintf(id, "__anon%d", anonID);
1646 init.id = MkIdentifier(id);
1647 ListAdd(list, init);
1648 someMemberSet = true;
1653 someMemberSet = true;
1660 Class curClass = null;
1661 DataMember curMember = null;
1662 DataMember subMemberStack[256];
1663 int subMemberStackPos = 0;
1666 if(inst.members && inst.members->first)
1668 for(members = inst.members->first; members; members = members.next)
1670 if(members.type == dataMembersInit)
1672 for(member = members.dataMembers->first; member; member = member.next)
1674 if(member.identifiers)
1676 Identifier firstID = member.identifiers->first;
1678 DataMember _subMemberStack[256];
1679 int _subMemberStackPos = 0;
1680 DataMember thisMember;
1681 thisMember = firstID ? (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule) : null;
1682 // FILL MEMBER STACK
1683 if(!thisMember && firstID)
1684 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
1685 if(thisMember && thisMember.memberAccess == publicAccess)
1687 curMember = thisMember;
1688 curClass = curMember._class;
1689 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
1690 subMemberStackPos = _subMemberStackPos;
1693 BTNamedLink link = parentMember.membersAlpha.Find((uintptr)firstID.string);
1696 curMember = link.data;
1699 // Choose the first specified member of the union...
1700 if(parentMember.type == unionMember)
1703 dataMember = curMember;
1707 if(dataMember == thisMember)
1709 // Look for another member of this one and merge them
1710 // into one instantiation...
1711 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
1713 OldList * partList = MkList();
1714 // TODO: We're assuming this is a simple class right now...
1717 MembersInit nextMembers;
1718 MemberInit next = member.next;
1720 if(!dataMember.dataType)
1721 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1722 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
1723 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
1726 OldList * identifiers = MkList();
1728 for(id = ((Identifier)member.identifiers->first).next; id; id = id.next)
1729 identifiers->Add(CopyIdentifier(id));
1731 // *** THE IDENTIFIERS WERE BEING REUSED, CAUSING A CRASH WITH EXPRESSION TEMPLATE CODE IN pass1.ec ***
1732 // members->Add(MkMemberInit(ids, MkInitializerAssignment(MkExpConstant(ui64String))));
1733 /*member.identifiers->Remove(firstID);*/
1735 MkMemberInit(/*member.identifiers*/identifiers, MkInitializerAssignment(member.initializer.exp)));
1738 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
1740 if(!nextMembers.dataMembers)
1743 if(members != nextMembers) next = nextMembers.dataMembers->first;
1745 if(nextMembers.type == dataMembersInit)
1747 MemberInit nextMember;
1749 for(nextMember = next; nextMember;
1750 nextMember = next, next = nextMember ? nextMember.next : null)
1752 Identifier nextID = nextMember.identifiers->first;
1753 if(nextMember.identifiers &&
1754 nextMember.identifiers->count > 1 &&
1755 !strcmp(firstID.string, nextID.string))
1757 nextMembers.dataMembers->Remove(nextMember);
1758 nextMember.identifiers->Remove(nextID);
1759 ListAdd(partList, nextMember);
1760 FreeIdentifier(nextID);
1766 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
1767 MkListOne(MkMembersInitList(partList))));
1775 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1776 if(curMember == dataMember)
1784 curMember = curMember.next;
1786 curMember = parentMember.members.first;
1788 if(curMember == dataMember)
1801 if(member && member.initializer && member.initializer.type == expInitializer)
1803 Initializer init { loc = yylloc };
1804 if(namedParentMember.type == unionMember && dataMember.name)
1805 init.id = MkIdentifier(dataMember.name);
1807 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
1808 member.initializer.exp.expType._class.registered.type == structClass)
1810 OldList * subList = MkList();
1811 ProcessBracketInst(member.initializer.exp.instance, subList);
1812 FreeExpression(member.initializer.exp);
1815 init.type = listInitializer;
1816 init.list = subList;
1820 FreeInitializer(init);
1826 member.initializer.exp.usage.usageGet = true;
1827 ProcessExpression(member.initializer.exp);
1828 init.type = expInitializer;
1829 init.exp = member.initializer.exp;
1832 ListAdd(list, init);
1834 member.initializer.exp = null;
1835 FreeInitializer(member.initializer);
1836 member.initializer = null;
1837 someMemberSet = true;
1839 else if(member && member.initializer && member.initializer.type == listInitializer)
1841 if(namedParentMember.type == unionMember && dataMember.name)
1842 member.initializer.id = MkIdentifier(dataMember.name);
1844 ListAdd(list, member.initializer);
1845 member.initializer = null;
1846 someMemberSet = true;
1848 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember && namedParentMember.type != unionMember)
1851 Initializer init { loc = yylloc };
1852 if(namedParentMember.type == unionMember && dataMember.name)
1853 init.id = MkIdentifier(dataMember.name);
1855 if(!dataMember.dataType)
1856 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1857 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1858 if(classSym && classSym.registered && classSym.registered.type == structClass)
1860 OldList * subList = MkList();
1861 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1862 Instantiation inst = MkInstantiation(spec, null, null);
1863 ProcessBracketInst(inst, subList);
1868 init.type = listInitializer;
1869 init.list = subList;
1873 FreeInitializer(init);
1879 init.type = expInitializer;
1880 init.exp = MkExpConstant("0");
1882 someMemberSet = true;
1884 ListAdd(list, init);
1888 if(parentMember.type == unionMember)
1892 // TESTING THIS NEW CODE FOR ANCHORS...
1893 if(/*parentMember.type == unionMember && */!someMemberSet && !parentMemberSet)
1896 Initializer init { loc = yylloc };
1898 dataMember = parentMember.members.first;
1899 if(namedParentMember.type == unionMember && dataMember.name)
1900 init.id = MkIdentifier(dataMember.name);
1902 if(!dataMember.dataType && dataMember.dataTypeString)
1903 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
1904 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
1905 if(classSym && classSym.registered && classSym.registered.type == structClass)
1907 OldList * subList = MkList();
1908 Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
1909 Instantiation inst = MkInstantiation(spec, null, null);
1910 ProcessBracketInst(inst, subList);
1913 init.type = listInitializer;
1914 init.list = subList;
1916 else if(dataMember.dataType && (dataMember.dataType.kind == arrayType || dataMember.dataType.kind == structType))
1918 Type t = dataMember.dataType.kind == arrayType ? dataMember.dataType.type : dataMember.dataType.members.first;
1919 Initializer i = MkInitializerAssignment(MkExpConstant("0"));
1920 while(t && (t.kind == arrayType || t.kind == structType))
1922 i = MkInitializerList(MkListOne(i));
1923 if(t.kind == arrayType)
1925 else if(t.kind == structType)
1926 t = t.members.first;
1928 init.type = listInitializer;
1929 init.list = MkListOne(i);
1933 init.type = expInitializer;
1934 init.exp = MkExpConstant("0");
1936 ListAdd(list, init);
1941 static bool ProcessBracketInst(Instantiation inst, OldList list)
1943 static int recursionCount = 0;
1944 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
1945 Class _class = null;
1948 if(recursionCount > 500) return false;
1951 while(_class != classSym.registered)
1953 DataMember dataMember;
1954 Class lastClass = _class;
1956 for(_class = classSym.registered; _class.base != lastClass && _class.base.type != systemClass; _class = _class.base);
1958 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1960 if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
1962 OldList * subList = MkList(); //(dataMember.type == structMember ? MkList() : null);
1964 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember, false))
1967 FreeList(subList, FreeInitializer);
1971 if(dataMember.type == structMember || (subList && subList->count))
1973 Initializer init = MkInitializerList(subList);
1975 sprintf(id, "__anon%d", anonID);
1976 init.id = MkIdentifier(id);
1977 ListAdd(list, init);
1985 MembersInit members;
1986 MemberInit member = null;
1989 if(inst.members && inst.members->first)
1991 DataMember curMember = null;
1992 Class curClass = null;
1993 DataMember subMemberStack[256];
1994 int subMemberStackPos = 0;
1996 for(members = inst.members->first; members; members = members.next)
1998 if(members.type == dataMembersInit)
2000 for(member = members.dataMembers->first; member; member = member.next)
2002 Identifier firstID = member.identifiers ? member.identifiers->first : null;
2005 DataMember _subMemberStack[256];
2006 int _subMemberStackPos = 0;
2007 DataMember thisMember = (DataMember)eClass_FindProperty(classSym.registered, firstID.string, privateModule);
2008 // FILL MEMBER STACK
2010 thisMember = (DataMember)eClass_FindDataMember(classSym.registered, firstID.string, privateModule, _subMemberStack, &_subMemberStackPos);
2013 curMember = thisMember;
2014 curClass = curMember._class;
2015 memcpy(subMemberStack, _subMemberStack, sizeof(DataMember) * _subMemberStackPos);
2016 subMemberStackPos = _subMemberStackPos;
2019 if(curMember == dataMember)
2021 if(dataMember.isProperty)
2023 if(!((Property)dataMember).Set)
2025 Compiler_Error($"No set defined for property %s\n", dataMember.name);
2032 // Look for another member of this one and merge them
2033 // into one instantiation...
2034 if(member.identifiers->count > 1 && member.initializer && member.initializer.type == expInitializer)
2036 OldList * partList = MkList();
2037 // TODO: We're assuming this is a simple _class right now...
2039 MembersInit nextMembers;
2040 MemberInit next = member.next;
2042 if(!dataMember.dataType)
2043 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2044 symbol = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null;
2045 spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, symbol, null);
2047 member.identifiers->Remove(firstID);
2049 MkMemberInit(member.identifiers, MkInitializerAssignment(member.initializer.exp)));
2051 for(nextMembers = members; nextMembers; nextMembers = nextMembers.next)
2053 if(!nextMembers.dataMembers) continue;
2055 if(members != nextMembers) next = nextMembers.dataMembers->first;
2057 if(nextMembers.type == dataMembersInit)
2059 MemberInit nextMember;
2061 for(nextMember = next; nextMember;
2062 nextMember = next, next = nextMember ? nextMember.next : null)
2064 Identifier nextID = nextMember.identifiers->first;
2065 if(nextMember.identifiers &&
2066 nextMember.identifiers->count > 1 &&
2067 !strcmp(firstID.string, nextID.string))
2069 nextMembers.dataMembers->Remove(nextMember);
2070 nextMember.identifiers->Remove(nextID);
2071 ListAdd(partList, nextMember);
2072 FreeIdentifier(nextID);
2078 member.initializer.exp = MkExpInstance(MkInstantiation(spec, null,
2079 MkListOne(MkMembersInitList(partList))));
2081 FreeIdentifier(firstID);
2083 member.identifiers = null;
2091 eClass_FindNextMember(classSym.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
2092 if(curMember == dataMember)
2094 if(dataMember.isProperty)
2096 if(!((Property)dataMember).Set)
2098 Compiler_Error($"No set defined for property %s\n", dataMember.name);
2114 if(dataMember.isProperty) continue;
2115 if(member && member.initializer && member.initializer.type == expInitializer)
2117 if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
2118 member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
2120 OldList * subList = MkList();
2121 ProcessBracketInst(member.initializer.exp.instance, subList);
2122 FreeExpression(member.initializer.exp);
2123 member.initializer.exp = null;
2124 ListAdd(list, MkInitializerList(subList));
2128 member.initializer.exp.usage.usageGet = true;
2129 ProcessExpression(member.initializer.exp);
2130 ListAdd(list, MkInitializerAssignment(CopyExpression(member.initializer.exp)));
2134 // member.exp = null;
2135 member.takeOutExp = true;
2137 else if(member && member.initializer && member.initializer.type == listInitializer)
2139 ListAdd(list, member.initializer);
2140 member.initializer = null;
2142 else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/)
2146 if(!dataMember.dataType)
2147 dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
2148 classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
2150 if(classSym && classSym.registered && classSym.registered.type == structClass)
2152 OldList * subList = MkList();
2153 Specifier spec = _MkSpecifierName(dataMember.dataTypeString, classSym, null);
2154 Instantiation inst = MkInstantiation(spec, null, null);
2155 ProcessBracketInst(inst, subList);
2157 ListAdd(list, MkInitializerList(subList));
2159 else if(dataMember.dataType.kind == arrayType)
2161 Type t = dataMember.dataType.type;
2162 Initializer inner = MkInitializerAssignment(null), i = inner;
2163 while(t && t.kind == arrayType)
2165 i = MkInitializerList(MkListOne(i));
2168 if(t && t.kind == classType && t._class && t._class.registered && t._class.registered.type == structClass)
2170 OldList * subList = MkList();
2171 Specifier spec = _MkSpecifierName(t._class.registered.name, classSym, null);
2172 Instantiation inst = MkInstantiation(spec, null, null);
2173 ProcessBracketInst(inst, subList);
2175 inner.type = listInitializer;
2176 inner.list = subList;
2179 inner.exp = MkExpConstant("0");
2180 ListAdd(list, MkInitializerList(MkListOne(i)));
2183 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2189 if(inst.members && inst.members->first)
2191 MembersInit members;
2192 MemberInit member = null;
2194 for(members = inst.members->first; members; members = members.next)
2196 if(members.type == dataMembersInit)
2198 for(member = members.dataMembers->first; member; member = member.next)
2200 if(member.takeOutExp)
2202 FreeInitializer(member.initializer);
2203 member.initializer = null;
2213 static Declaration curDecl;
2214 static int declTempCount;
2216 static void ProcessDeclaration(Declaration decl)
2221 case initDeclaration:
2223 if(!curDecl) { curDecl = decl; declTempCount = 0; }
2227 for(s = decl.specifiers->first; s; s = s.next)
2229 ProcessSpecifier(s);
2232 if(decl.declarators)
2236 for(d = decl.declarators->first; d; d = d.next)
2239 ProcessInitializer(d.initializer);
2242 if(curDecl == decl) { curDecl = null; declTempCount = 0; }
2245 case instDeclaration:
2247 Instantiation inst = decl.inst;
2251 Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
2256 if(!inst.isConstant || (classSym && classSym.registered && (classSym.registered.type == normalClass || classSym.registered.type == noHeadClass)))
2258 // If this instantiation is outside, turn it into a declaration plus an instantiation expression
2259 decl.type = initDeclaration;
2260 decl.specifiers = MkListOne(MkSpecifierName/*MkClassName*/(inst._class.name));
2261 if(decl.declMode == staticAccess)
2263 decl.specifiers->Insert(null, MkSpecifier(STATIC));
2265 decl.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst.exp.identifier.string)), null));
2267 ProcessDeclaration(decl);
2268 CreateInstancesBody();
2271 Expression exp = MkExpInstance(inst);
2272 stmt = MkExpressionStmt(MkListOne(exp)); // MkExpOp(inst.exp, '=',
2273 ListAdd(createInstancesBody.compound.statements, stmt);
2274 ProcessExpressionType(exp);
2277 if(classSym && classSym.registered && (classSym.registered.type == normalClass))
2279 ListAdd(createInstancesBody.compound.statements,
2280 MkExpressionStmt(MkListOne(MkExpCall(
2281 MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")),
2282 MkListOne(CopyExpression(inst.exp))))));
2284 // We'd like the = 0 as well...
2286 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2287 ListAddFront(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2288 ProcessExpressionType(exp);
2291 else if(classSym && classSym.registered && (classSym.registered.type == noHeadClass))
2293 Expression exp = MkExpOp(null, DELETE, CopyExpression(inst.exp));
2294 ListAddFront(destroyInstancesBody.compound.statements, MkExpressionStmt(MkListOne(exp)));
2295 ProcessExpressionType(exp);
2298 createInstancesExternal.CreateEdge(curExternal, false);
2299 destroyInstancesExternal.CreateEdge(curExternal, false);
2304 // Precompiler won't know if this isn't constant
2305 CreateInstancesBody();
2310 char className[1024];
2313 decl.type = initDeclaration;
2314 decl.specifiers = MkList();
2315 decl.declarators = MkList();
2317 // Replace instantiation here
2318 if(classSym && classSym.registered && classSym.registered.type == bitClass)
2320 OldList list = { 0 };
2322 // Put the instantiation in an InitDeclarator...
2323 ProcessInstMembers(inst, inst.exp, &list, false);
2324 ProcessExpression(inst.exp);
2326 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2327 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2328 MkInitializerAssignment(list.first)));
2329 inst.exp.identifier = null;
2331 else if(classSym && classSym.registered && classSym.registered.type == unitClass)
2333 OldList list = { 0 };
2335 // Put the instantiation in an InitDeclarator...
2336 ProcessInstMembers(inst, inst.exp, &list, false);
2337 ProcessExpression(inst.exp);
2339 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2340 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2341 MkInitializerAssignment(list.first)));
2343 inst.exp.identifier = null;
2345 else if(classSym && classSym.registered && classSym.registered.type == structClass)
2349 DeclareStruct(curExternal, inst._class.name, false, true);
2351 strcpy(className, "__ecereClass_");
2352 FullClassNameCat(className, classSym.string, true);
2353 DeclareClass(classSym, className);
2356 ProcessExpression(inst.exp);
2358 // Put the instantiation in an InitDeclarator...
2362 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2363 ListAdd(decl.declarators,
2364 MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier), null));
2365 inst.exp.identifier = null;
2369 OldList * list = MkList();
2370 if(ProcessBracketInst(inst, list))
2372 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2373 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2374 MkInitializerList(list)));
2375 inst.exp.identifier = null;
2379 // If bracket instantiation failed (property: for conversions only?)
2380 // TODO: (Fix this so it initializes members through brackets,
2381 // and then does properties)
2384 // TESTING THIS MEMORY LEAK FIX:
2385 FreeList(list, FreeInitializer);
2387 exp = MkExpBrackets(MkList());
2388 ProcessInstMembers(inst, inst.exp, exp.list, true);
2389 ListAdd(exp.list, CopyExpression(inst.exp));
2390 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2391 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst.exp.identifier),
2392 MkInitializerAssignment(exp)));
2393 inst.exp.identifier = null;
2402 strcpy(className, "__ecereClass_");
2404 if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
2406 classSym = FindClass(classSym.registered.templateClass.fullName);
2407 FullClassNameCat(className, classSym.string, true);
2410 FullClassNameCat(className, inst._class.name, true);
2413 DeclareClass(curExternal, classSym, className);
2415 if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
2416 (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
2419 Class c = classSym.registered.templateClass ? classSym.registered.templateClass : classSym.registered;
2420 Expression e = MkExpClassSize(MkSpecifierName(c.name));
2421 ProcessExpressionType(e);
2422 sprintf(size, "%d", c.structSize);
2423 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne( e /*MkExpConstant(size)*/));
2427 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
2428 ProcessExpressionType(newCall);
2429 newCall.byReference = true;
2434 Expression exp, newExp;
2435 Identifier id = CopyIdentifier(inst.exp.identifier);
2437 // Put the instantiation in an InitDeclarator...
2438 if(inst.members && inst.members->first)
2440 newExp = MkExpOp(CopyExpression(inst.exp), '=', newCall);
2442 exp = MkExpBrackets(MkList());
2443 ListAdd(exp.list, newExp);
2444 ProcessInstMembers(inst, inst.exp, exp.list, false);
2445 ListAdd(exp.list, inst.exp);
2447 ProcessExpression(inst.exp);
2449 // Take it out since we're using it...
2455 ListAdd(decl.specifiers, MkSpecifierName/*MkClassName*/(inst._class.name));
2456 ListAdd(decl.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id),
2457 MkInitializerAssignment(exp)));
2458 //inst.exp.identifier = null;
2461 FreeExpression(newCall);
2467 ProcessInstantiation(inst);
2470 case structDeclaration:
2475 for(spec = decl.specifiers->first; spec; spec = spec.next)
2476 ProcessSpecifier(spec);
2483 static void ProcessStatement(Statement stmt)
2489 if(stmt.labeled.stmt)
2490 ProcessStatement(stmt.labeled.stmt);
2493 if(stmt.caseStmt.exp)
2494 ProcessExpression(stmt.caseStmt.exp);
2495 if(stmt.caseStmt.stmt)
2496 ProcessStatement(stmt.caseStmt.stmt);
2500 if(stmt.compound.context)
2504 Statement prevCompound = curCompound;
2505 Context prevContext = curContext;
2507 if(!stmt.compound.isSwitch)
2510 curContext = stmt.compound.context;
2513 if(stmt.compound.declarations)
2515 for(decl = stmt.compound.declarations->first; decl; decl = decl.next)
2516 ProcessDeclaration(decl);
2518 if(stmt.compound.statements)
2520 for(s = stmt.compound.statements->first; s; s = s.next)
2522 ProcessStatement(s);
2526 curCompound = prevCompound;
2527 curContext = prevContext;
2531 case expressionStmt:
2534 if(stmt.expressions)
2536 for(exp = stmt.expressions->first; exp; exp = exp.next)
2538 ProcessExpression(exp);
2547 ((Expression)stmt.ifStmt.exp->last).usage.usageGet = true;
2548 for(exp = stmt.ifStmt.exp->first; exp; exp = exp.next)
2550 ProcessExpression(exp);
2552 if(stmt.ifStmt.stmt)
2553 ProcessStatement(stmt.ifStmt.stmt);
2554 if(stmt.ifStmt.elseStmt)
2555 ProcessStatement(stmt.ifStmt.elseStmt);
2561 ((Expression)stmt.switchStmt.exp->last).usage.usageGet = true;
2562 for(exp = stmt.switchStmt.exp->first; exp; exp = exp.next)
2563 ProcessExpression(exp);
2564 ProcessStatement(stmt.switchStmt.stmt);
2569 if(stmt.whileStmt.exp)
2573 ((Expression)stmt.whileStmt.exp->last).usage.usageGet = true;
2574 for(exp = stmt.whileStmt.exp->first; exp; exp = exp.next)
2576 ProcessExpression(exp);
2579 if(stmt.whileStmt.stmt)
2580 ProcessStatement(stmt.whileStmt.stmt);
2585 if(stmt.doWhile.exp)
2588 ((Expression)stmt.doWhile.exp->last).usage.usageGet = true;
2589 for(exp = stmt.doWhile.exp->first; exp; exp = exp.next)
2591 ProcessExpression(exp);
2594 if(stmt.doWhile.stmt)
2595 ProcessStatement(stmt.doWhile.stmt);
2601 if(stmt.forStmt.init)
2602 ProcessStatement(stmt.forStmt.init);
2604 if(stmt.forStmt.check && stmt.forStmt.check.expressions)
2606 ((Expression)stmt.forStmt.check.expressions->last).usage.usageGet = true;
2609 if(stmt.forStmt.check)
2610 ProcessStatement(stmt.forStmt.check);
2611 if(stmt.forStmt.increment)
2613 for(exp = stmt.forStmt.increment->first; exp; exp = exp.next)
2614 ProcessExpression(exp);
2616 if(stmt.forStmt.stmt)
2617 ProcessStatement(stmt.forStmt.stmt);
2629 if(stmt.expressions && stmt.expressions->last)
2631 ((Expression)stmt.expressions->last).usage.usageGet = true;
2632 for(exp = stmt.expressions->first; exp; exp = exp.next)
2634 ProcessExpression(exp);
2639 case badDeclarationStmt:
2641 ProcessDeclaration(stmt.decl);
2647 if(stmt.asmStmt.inputFields)
2649 for(field = stmt.asmStmt.inputFields->first; field; field = field.next)
2650 if(field.expression)
2651 ProcessExpression(field.expression);
2653 if(stmt.asmStmt.outputFields)
2655 for(field = stmt.asmStmt.outputFields->first; field; field = field.next)
2656 if(field.expression)
2657 ProcessExpression(field.expression);
2659 if(stmt.asmStmt.clobberedFields)
2661 for(field = stmt.asmStmt.clobberedFields->first; field; field = field.next)
2662 if(field.expression)
2663 ProcessExpression(field.expression);
2669 static void ProcessFunction(FunctionDefinition function)
2673 yylloc = function.loc;
2674 ProcessStatement(function.body);
2678 /////////// INSTANTIATIONS / DATA TYPES PASS /////////////////////////////////////////////
2679 public void ProcessInstantiations()
2682 // Is this still needed?
2683 //CreateInstancesBody();
2685 for(external = ast->first; external; external = external.next)
2687 curExternal = external;
2688 if(external.type == declarationExternal)
2690 //currentClass = external.function._class;
2691 if(external.declaration)
2693 bool isInstance = external.declaration.type == instDeclaration;
2694 Symbol sym = isInstance ? FindClass(external.declaration.inst._class.name) : null;
2695 ProcessDeclaration(external.declaration);
2699 // Move edges to the global instances to the create instance body instead
2701 for(e = external.incoming.first; e; e = next)
2703 External from = e.from;
2707 if(from.incoming.count)
2709 bool reroute = true;
2710 if(sym && sym.registered && sym.registered.type == structClass)
2712 else if(from.type == declarationExternal && from.declaration && (!from.declaration.declarators || !from.declaration.declarators->count) && from.declaration.specifiers)
2714 Specifier spec = null;
2715 for(spec = from.declaration.specifiers->first; spec; spec = spec.next)
2717 if(spec.type == structSpecifier || spec.type == unionSpecifier)
2720 if(sym.registered && spec && spec.id && spec.id.string)
2722 char className[1024];
2723 Class c = sym.registered;
2724 strcpy(className, "__ecereClass_");
2725 if(c.type == noHeadClass && c.templateClass)
2726 FullClassNameCat(className, c.templateClass.name, true);
2728 FullClassNameCat(className, c.name, true);
2729 if(!strcmp(c.name, spec.id.string))
2736 e.to = createInstancesExternal;
2737 external.incoming.Remove((IteratorPointer)e);
2738 for(i : createInstancesExternal.incoming)
2743 if(i.breakable && !e.breakable)
2746 createInstancesExternal.nonBreakableIncoming++;
2753 external.nonBreakableIncoming--;
2754 e.from.outgoing.Remove((IteratorPointer)e);
2759 createInstancesExternal.incoming.Add(e);
2762 external.nonBreakableIncoming--;
2763 createInstancesExternal.nonBreakableIncoming++;
2772 else if(external.type == functionExternal)
2774 //currentClass = null;
2775 ProcessFunction(external.function);
2777 else if(external.type == classExternal)
2779 ClassDefinition _class = external._class;
2780 //currentClass = external.symbol.registered;
2781 if(_class.definitions)
2784 //Class regClass = _class.symbol.registered;
2786 // Process all functions
2787 for(def = _class.definitions->first; def; def = def.next)
2789 if(def.type == functionClassDef)
2791 curExternal = def.function.declarator ? def.function.declarator.symbol.pointerExternal : external;
2792 ProcessFunction((FunctionDefinition)def.function);
2794 else if(def.type == declarationClassDef && def.decl.type == instDeclaration)
2796 ProcessInstantiation(def.decl.inst);
2798 else if(def.type == defaultPropertiesClassDef && def.defProperties)
2800 MemberInit defProperty;
2802 // Add this to the context
2805 string = CopyString("this");
2806 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2808 globalContext.symbols.Add((BTNode)thisSymbol);
2810 for(defProperty = def.defProperties->first; defProperty; defProperty = defProperty.next)
2812 //thisClass = regClass;
2813 ProcessMemberInitData(defProperty); ///*, regClass, &id
2817 globalContext.symbols.Remove((BTNode)thisSymbol);
2818 FreeSymbol(thisSymbol);
2820 else if(def.type == propertyClassDef && def.propertyDef)
2822 PropertyDef prop = def.propertyDef;
2824 // Add this to the context
2827 string = CopyString("this");
2828 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2830 globalContext.symbols.Add((BTNode)thisSymbol);
2832 //thisClass = regClass;
2835 curExternal = prop.symbol ? prop.symbol.externalSet : null;
2836 ProcessStatement(prop.setStmt);
2840 curExternal = prop.symbol ? prop.symbol.externalGet : null;
2841 ProcessStatement(prop.getStmt);
2845 curExternal = prop.symbol ? prop.symbol.externalIsSet : null;
2846 ProcessStatement(prop.issetStmt);
2850 globalContext.symbols.Remove((BTNode)thisSymbol);
2851 FreeSymbol(thisSymbol);
2853 else if(def.type == propertyWatchClassDef && def.propertyWatch)
2855 PropertyWatch propertyWatch = def.propertyWatch;
2857 // Add this to the context
2860 string = CopyString("this");
2861 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2863 globalContext.symbols.Add((BTNode)thisSymbol);
2865 //thisClass = regClass;
2866 if(propertyWatch.compound)
2868 /* This was already added in pass15:ProcessClass()
2871 string = CopyString("this");
2872 type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
2874 propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
2876 ProcessStatement(propertyWatch.compound);
2878 // thisClass = null;
2880 //globalContext.symbols.Delete((BTNode)thisSymbol);
2881 globalContext.symbols.Remove((BTNode)thisSymbol);
2882 FreeSymbol(thisSymbol);