5 void FreeList(OldList list, void (* FreeFunction)(void *))
10 while(item = list.first)
19 public void FreeType(Type type)
24 if(type.refCount <= 0)
30 NamedLink member, next;
33 for(member = type.members.first; member; member = next)
36 type.members.Remove(member);
47 for(member = type.members.first; member; member = next)
50 // Remove from list only when reaching last reference
51 // (The list is copied)
52 if(member.refCount == 1)
53 type.members.Remove(member);
62 FreeType(type.returnType);
63 for(param = type.params.first; param; param = next)
66 // WARNING: Don't unlink these as they might be reused
67 // type.params.Remove(param);
73 if(type.freeExp && type.arraySizeExp)
74 FreeExpression(type.arraySizeExp);
87 void FreeSymbol(Symbol symbol)
91 if(symbol.propCategory)
92 FreeExpression(symbol.propCategory);
94 FreeType(symbol.type);
96 while(link = symbol.templatedClasses.first)
97 symbol.templatedClasses.Delete(link);
101 if(symbol.templateParams)
102 FreeList(symbol.templateParams, FreeTemplateParameter);
104 // Used to be in ClassDefinition
105 delete symbol.constructorName;
106 delete symbol.structName;
107 delete symbol.className;
108 delete symbol.destructorName;
109 delete symbol.shortName;
112 FreeContext(symbol.ctx);
118 void FreeMethodImport(MethodImport imp)
123 void FreePropertyImport(MethodImport imp)
128 void FreeClassImport(ClassImport imp)
131 imp.methods.Free(FreeMethodImport);
132 imp.properties.Free(FreePropertyImport);
135 void FreeFunctionImport(ClassImport imp)
140 public void FreeModuleImport(ModuleImport imp)
143 imp.classes.Free(FreeClassImport);
144 imp.functions.Free(FreeFunctionImport);
147 public void FreeModuleDefine(Definition def)
152 public void FreeExcludedSymbols(OldList excludedSymbols)
156 while(symbol = excludedSymbols.first)
158 excludedSymbols.Remove(symbol);
163 public void FreeTemplateArgument(TemplateArgument arg)
169 FreeExpression(arg.expression);
173 FreeIdentifier(arg.identifier);
176 if(arg.templateDatatype)
177 FreeTemplateDataType(arg.templateDatatype);
181 FreeIdentifier(arg.name);
185 public void FreeTemplateDataType(TemplateDatatype type)
188 FreeDeclarator(type.decl);
190 FreeList(type.specifiers, FreeSpecifier);
194 public void FreeTemplateParameter(TemplateParameter param)
198 FreeIdentifier(param.identifier);
200 if(param.type == type || param.type == expression)
203 FreeTemplateDataType(param.dataType);
205 if(param.defaultArgument)
206 FreeTemplateArgument(param.defaultArgument);
208 FreeType(param.baseType);
212 public void FreeTemplateType(TemplatedType type)
216 FreeTemplateParameter(type.param);
221 public void FreeContext(Context context)
225 if(context == curContext)
226 curContext = globalContext;
228 while(symbol = (Symbol)context.types.root)
230 context.types.Remove((BTNode)symbol);
233 while(symbol = (Symbol)context.classes.root)
235 context.classes.Remove((BTNode)symbol);
238 while(symbol = (Symbol)context.symbols.root)
240 context.symbols.Remove((BTNode)symbol);
243 while(symbol = (Symbol)context.structSymbols.root)
245 context.structSymbols.Remove((BTNode)symbol);
248 while(symbol = (Symbol)context.templateTypes.root)
250 context.templateTypes.Remove((BTNode)symbol);
251 FreeTemplateType((TemplatedType)symbol);
255 context.simpleID = 0;
256 context.parent = null;
259 void FreeEnumerator(Enumerator enumerator)
262 FreeIdentifier(enumerator.id);
264 FreeExpression(enumerator.exp);
269 void FreeSpecifier(Specifier spec)
276 //case classSpecifier:
278 if(spec.templateArgs)
279 FreeList(spec.templateArgs, FreeTemplateArgument);
281 case extendedSpecifier:
283 FreeExtDecl(spec.extDecl);
287 FreeIdentifier(spec.id);
289 FreeList(spec.list, FreeEnumerator);
291 FreeList(spec.definitions, FreeClassDef);
293 case structSpecifier:
296 FreeIdentifier(spec.id);
298 FreeList(spec.definitions, FreeClassDef);
300 FreeList(spec.baseSpecs, FreeSpecifier);
301 if(spec.extDeclStruct)
302 FreeExtDecl(spec.extDeclStruct);
305 FreeContext(spec.ctx);
309 case subClassSpecifier:
311 FreeSpecifier(spec._class);
318 public void FreeIdentifier(Identifier id)
321 FreeIdentifier(id.badID);
324 FreeSpecifier(id._class);
328 void FreeTypeName(TypeName typeName)
330 if(typeName.qualifiers)
331 FreeList(typeName.qualifiers, FreeSpecifier);
332 if(typeName.declarator)
333 FreeDeclarator(typeName.declarator);
334 if(typeName.bitCount)
335 FreeExpression(typeName.bitCount);
340 public void FreeExpContents(Expression exp)
342 _FreeExpression(exp, false);
345 public void FreeExpression(Expression exp)
347 _FreeExpression(exp, true);
350 static void _FreeExpression(Expression exp, bool freePointer)
353 char debugExpString[4096];
354 debugExpString[0] = '\0';
355 PrintExpression(exp, debugExpString);
361 FreeExpression(exp._new.size);
362 FreeTypeName(exp._new.typeName);
366 FreeExpression(exp._renew.exp);
367 FreeExpression(exp._renew.size);
368 FreeTypeName(exp._renew.typeName);
375 FreeIdentifier(exp.identifier);
379 FreeInstance(exp.instance);
386 FreeExpression(exp.op.exp1);
388 FreeExpression(exp.op.exp2);
392 FreeList(exp.list, FreeExpression);
398 FreeExpression(exp.index.exp);
400 FreeList(exp.index.index, FreeExpression);
405 FreeExpression(exp.call.exp);
406 if(exp.call.arguments)
407 FreeList(exp.call.arguments, FreeExpression);
413 FreeExpression(exp.member.exp);
414 if(exp.member.member)
415 FreeIdentifier(exp.member.member);
418 FreeTypeName(exp._new.typeName);
421 FreeTypeName(exp._new.typeName);
425 FreeExpression(exp.cast.exp);
426 FreeTypeName(exp.cast.typeName);
431 FreeExpression(exp.cond.cond);
433 FreeList(exp.cond.exp, FreeExpression);
435 FreeExpression(exp.cond.elseExp);
438 case extensionCompoundExp:
441 FreeStatement(exp.compound);
444 case extensionExpressionExp:
447 FreeList(exp.list, FreeExpression);
450 case extensionInitializerExp:
452 if(exp.initializer.typeName)
453 FreeTypeName(exp.initializer.typeName);
454 if(exp.initializer.initializer)
455 FreeInitializer(exp.initializer.initializer);
461 if(exp._classExp.specifiers)
462 FreeList(exp._classExp.specifiers, FreeSpecifier);
463 if(exp._classExp.decl)
464 FreeDeclarator(exp._classExp.decl);
470 FreeIdentifier(exp.db.id);
475 if(exp.call.arguments)
476 FreeList(exp.call.arguments, FreeExpression);
479 FreeExpression(exp.dbopen.ds);
481 FreeExpression(exp.dbopen.name);
485 FreeExpression(exp.vaArg.exp);
486 if(exp.vaArg.typeName)
487 FreeTypeName(exp.vaArg.typeName);
491 FreeList(exp.list, FreeExpression);
495 FreeSpecifier(exp._class);
499 FreeIdentifier(exp.classData.id);
505 FreeType(exp.expType);
507 FreeType(exp.destType);
512 void FreePointer(Pointer pointer)
515 FreePointer(pointer.pointer);
516 if(pointer.qualifiers)
517 FreeList(pointer.qualifiers, FreeSpecifier);
521 void FreeAttrib(Attrib attr)
524 FreeList(attr.attribs, FreeAttribute);
528 void FreeAttribute(Attribute attr)
532 FreeExpression(attr.exp);
536 void FreeExtDecl(ExtDecl extDecl)
538 if(extDecl.type == extDeclAttrib && extDecl.attr)
539 FreeAttrib(extDecl.attr);
540 else if(extDecl.type == extDeclString)
545 void FreeDeclarator(Declarator decl)
548 FreeDeclarator(decl.declarator);
552 case structDeclarator:
553 if(decl.structDecl.exp)
554 FreeExpression(decl.structDecl.exp);
555 if(decl.structDecl.posExp)
556 FreeExpression(decl.structDecl.posExp);
557 if(decl.structDecl.attrib)
558 FreeAttrib(decl.structDecl.attrib);
560 case identifierDeclarator:
561 FreeIdentifier(decl.identifier);
563 case bracketsDeclarator:
565 case arrayDeclarator:
567 FreeExpression(decl.array.exp);
568 if(decl.array.enumClass)
569 FreeSpecifier(decl.array.enumClass);
571 case functionDeclarator:
572 FreeList(decl.function.parameters, FreeTypeName);
574 case pointerDeclarator:
575 if(decl.pointer.pointer)
576 FreePointer(decl.pointer.pointer);
578 case extendedDeclarator:
579 case extendedDeclaratorEnd:
580 if(decl.extended.extended)
581 FreeExtDecl(decl.extended.extended);
587 void FreePropertyWatch(PropertyWatch watcher)
589 if(watcher.properties)
590 FreeList(watcher.properties, FreeIdentifier);
592 FreeStatement(watcher.compound);
596 void FreeStatement(Statement stmt)
601 if(stmt.labeled.stmt)
602 FreeStatement(stmt.labeled.stmt);
605 if(stmt.caseStmt.exp)
606 FreeExpression(stmt.caseStmt.exp);
607 if(stmt.caseStmt.stmt)
608 FreeStatement(stmt.caseStmt.stmt);
610 case badDeclarationStmt:
611 FreeDeclaration(stmt.decl);
615 if(stmt.compound.declarations)
616 FreeList(stmt.compound.declarations, FreeDeclaration);
617 if(stmt.compound.statements)
618 FreeList(stmt.compound.statements, FreeStatement);
619 if(stmt.compound.context)
621 FreeContext(stmt.compound.context);
622 delete stmt.compound.context;
629 FreeList(stmt.expressions, FreeExpression);
635 FreeList(stmt.ifStmt.exp, FreeExpression);
637 FreeStatement(stmt.ifStmt.stmt);
638 if(stmt.ifStmt.elseStmt)
639 FreeStatement(stmt.ifStmt.elseStmt);
644 if(stmt.switchStmt.exp)
645 FreeList(stmt.switchStmt.exp, FreeExpression);
646 if(stmt.switchStmt.stmt)
647 FreeStatement(stmt.switchStmt.stmt);
652 if(stmt.whileStmt.exp)
653 FreeList(stmt.whileStmt.exp, FreeExpression);
654 if(stmt.whileStmt.stmt)
655 FreeStatement(stmt.whileStmt.stmt);
660 if(stmt.doWhile.stmt)
661 FreeStatement(stmt.doWhile.stmt);
664 FreeList(stmt.doWhile.exp, FreeExpression);
669 if(stmt.forStmt.init)
670 FreeStatement(stmt.forStmt.init);
672 if(stmt.forStmt.check)
673 FreeStatement(stmt.forStmt.check);
675 if(stmt.forStmt.increment)
676 FreeList(stmt.forStmt.increment, FreeExpression);
677 if(stmt.forStmt.stmt)
678 FreeStatement(stmt.forStmt.stmt);
683 if(stmt.forEachStmt.id)
684 FreeIdentifier(stmt.forEachStmt.id);
685 if(stmt.forEachStmt.exp)
686 FreeList(stmt.forEachStmt.exp, FreeExpression);
687 if(stmt.forEachStmt.filter)
688 FreeList(stmt.forEachStmt.filter, FreeExpression);
689 if(stmt.forEachStmt.stmt)
690 FreeStatement(stmt.forEachStmt.stmt);
701 FreeList(stmt.expressions, FreeExpression);
704 case fireWatchersStmt:
705 case stopWatchingStmt:
707 if(stmt._watch.watcher)
708 FreeExpression(stmt._watch.watcher);
709 if(stmt._watch.object)
710 FreeExpression(stmt._watch.object);
711 if(stmt._watch.watches)
712 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? FreePropertyWatch : FreeIdentifier);
719 void FreeInitializer(Initializer initializer)
721 switch(initializer.type)
723 case listInitializer:
725 FreeList(initializer.list, FreeInitializer);
730 FreeExpression(initializer.exp);
736 void FreeInitDeclarator(InitDeclarator decl)
739 FreeDeclarator(decl.declarator);
741 FreeInitializer(decl.initializer);
745 void FreeDeclaration(Declaration decl)
747 if(decl.symbol && !decl.symbol.type)
749 //FreeSymbol(decl.symbol);
753 case structDeclaration:
756 FreeList(decl.specifiers, FreeSpecifier);
758 FreeList(decl.declarators, FreeDeclarator);
760 FreeSpecifier(decl.extStorage);
763 case initDeclaration:
766 FreeList(decl.specifiers, FreeSpecifier);
768 FreeList(decl.declarators, FreeInitDeclarator);
771 case instDeclaration:
773 FreeInstance(decl.inst);
775 case defineDeclaration:
778 FreeExpression(decl.exp);
780 FreeIdentifier(decl.id);
787 void FreeFunction(FunctionDefinition func)
790 FreeStatement(func.body);
792 FreeDeclarator(func.declarator);
794 FreeList(func.specifiers, FreeSpecifier);
795 if(func.declarations)
796 FreeList(func.declarations, FreeDeclaration);
804 void FreeMemberInit(MemberInit init)
807 FreeInitializer(init.initializer);
809 FreeList(init.identifiers, FreeIdentifier);
813 void FreeMembersInit(MembersInit init)
815 if(init.type == dataMembersInit && init.dataMembers)
816 FreeList(init.dataMembers, FreeMemberInit);
818 if(init.type == methodMembersInit && init.function)
820 FreeClassFunction(init.function);
825 void FreeInstance(Instantiation inst)
829 FreeList(inst.members, FreeMembersInit);
833 FreeExpression(inst.exp);
837 Symbol classSym = FindClass(inst._class.name);
838 Class _class = classSym ? classSym.registered : null;
841 if(_class.type == normalClass)
843 Instance instance = (Instance)inst.data;
846 else if(_class.type == noHeadClass)
848 if(_class.Destructor)
849 _class.Destructor((Instance)inst.data);
852 else if(_class.type == structClass)
859 Instance instance = (Instance)inst.data;
865 FreeSpecifier(inst._class);
873 public void FreeClassFunction(ClassFunction func)
876 if(func.declarator && func.declarator.symbol)
878 //FreeSymbol(func.declarator.symbol);
885 FreeStatement(func.body);
887 FreeDeclarator(func.declarator);
889 FreeList(func.specifiers, FreeSpecifier);
890 if(func.declarations)
891 FreeList(func.declarations, FreeDeclaration);
893 func.attached.Free(null);
898 void FreeProperty(PropertyDef def)
901 FreeList(def.specifiers, FreeSpecifier);
903 FreeDeclarator(def.declarator);
905 FreeIdentifier(def.id);
907 FreeStatement(def.getStmt);
909 FreeStatement(def.setStmt);
911 FreeStatement(def.issetStmt);
913 FreeExpression(def.category);
917 FreeFunction(def.getFunction);
919 FreeFunction(def.setFunction);
923 // FreeSymbol(def.symbol);
929 void FreeClassDef(ClassDef def)
933 case declarationClassDef:
935 FreeDeclaration(def.decl);
937 case defaultPropertiesClassDef:
939 FreeList(def.defProperties, FreeMemberInit);
942 case functionClassDef:
944 FreeClassFunction(def.function);
946 case propertyClassDef:
948 FreeProperty(def.propertyDef);
950 case classPropertyClassDef:
952 FreeProperty(def.propertyDef);
954 case accessOverrideClassDef:
956 case classDataClassDef:
959 FreeDeclaration(def.decl);
962 case classDesignerClassDef:
967 case classFixedClassDef:
969 case classNoExpansionClassDef:
971 case classPropertyValueClassDef:
973 FreeIdentifier(def.id);
975 FreeInitializer(def.initializer);
977 case designerDefaultPropertyClassDef:
979 if(def.defaultProperty)
980 FreeIdentifier(def.defaultProperty);
983 case memberAccessClassDef:
985 case propertyWatchClassDef:
987 if(def.propertyWatch)
988 FreePropertyWatch(def.propertyWatch);
995 void FreeClass(ClassDefinition _class)
997 if(_class.definitions)
998 FreeList(_class.definitions, FreeClassDef);
1000 FreeSpecifier(_class._class);
1001 if(_class.baseSpecs)
1002 FreeList(_class.baseSpecs, FreeSpecifier);
1007 void FreeDBIndexItem(DBIndexItem item)
1010 FreeIdentifier(item.id);
1014 void FreeDBTableEntry(DBTableEntry entry)
1017 FreeIdentifier(entry.id);
1022 FreeTypeName(entry.dataType);
1028 FreeList(entry.items, FreeDBIndexItem);
1034 void FreeDBTable(DBTableDef table)
1036 if(table.definitions)
1037 FreeList(table.definitions, FreeDBTableEntry);
1039 FreeIdentifier(table.symbol);*/
1045 void FreeExternal(External external)
1047 switch(external.type)
1049 case functionExternal:
1050 if(external.function)
1051 FreeFunction(external.function);
1053 case declarationExternal:
1054 if(external.declaration)
1055 FreeDeclaration(external.declaration);
1059 FreeClass(external._class);
1061 case importExternal:
1062 delete external.importString;
1064 case nameSpaceExternal:
1065 FreeIdentifier(external.id);
1067 case dbtableExternal:
1069 FreeDBTable(external.table);
1075 public void FreeASTTree(OldList ast)
1080 while(external = ast.first)
1082 ast.Remove(external);
1083 FreeExternal(external);
1089 static void FreeDataMember(DataMember parentMember)
1091 DataMember dataMember;
1093 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1095 if(dataMember.type == structMember || dataMember.type == unionMember)
1096 FreeDataMember(dataMember);
1098 if(dataMember.dataType)
1100 FreeType(dataMember.dataType);
1101 dataMember.dataType = null;
1106 void FreeModuleData(Module module)
1109 GlobalFunction function;
1112 for(_class = module.classes.first; _class; _class = _class.next)
1114 DataMember dataMember;
1116 ClassTemplateParameter param;
1117 ClassProperty classProp;
1121 FreeType(_class.dataType);
1122 _class.dataType = null;
1124 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1126 if(dataMember.isProperty)
1128 Property prop = (Property)dataMember;
1131 FreeSymbol(prop.symbol);
1136 if(dataMember.type == structMember || dataMember.type == unionMember)
1137 FreeDataMember(dataMember);
1139 if(dataMember.dataType)
1141 FreeType(dataMember.dataType);
1142 dataMember.dataType = null;
1145 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1147 Property prop = (Property) dataMember;
1150 FreeSymbol(prop.symbol);
1154 FreeType(prop.dataType);
1155 prop.dataType = null;
1158 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1162 FreeType(method.dataType);
1163 method.dataType = null;
1168 FreeSymbol(method.symbol);
1171 for(param = _class.templateParams.first; param; param = param.next)
1175 FreeTemplateParameter(param.param);
1181 for(function = module.functions.first; function; function = function.next)
1183 if(function.dataType)
1184 FreeType(function.dataType);
1186 FreeSymbol(function.symbol);
1189 // Free the extra module instance on closing the last code editor using it
1192 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1195 List<Module> list = mapIt.data;
1196 Iterator<Module> it { list };
1200 if(it.data == module)
1202 list.Remove(it.pointer);
1211 // Unload the initial module that we loaded for safe sharing
1212 Module mod = list[0];
1213 list.Remove(list.GetFirst());
1214 loadedModules.Remove(mapIt.pointer);
1216 eModule_Unload(__thisModule, mod);
1224 public void FreeTypeData(Module privateModule)
1227 for(m = privateModule.application.allModules.first; m; m = m.next)
1231 FreeModuleData(privateModule);