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 NamedLink64 member, next;
32 for(member = type.members.first; member; member = next)
35 type.members.Remove(member);
46 for(member = type.members.first; member; member = next)
49 // Remove from list only when reaching last reference
50 // (The list is copied)
51 if(member.refCount == 1)
52 type.members.Remove(member);
61 FreeType(type.returnType);
62 for(param = type.params.first; param; param = next)
65 // WARNING: Don't unlink these as they might be reused
66 // type.params.Remove(param);
72 if(type.freeExp && type.arraySizeExp)
73 FreeExpression(type.arraySizeExp);
86 void FreeSymbol(Symbol symbol)
90 if(symbol.propCategory)
91 FreeExpression(symbol.propCategory);
93 FreeType(symbol.type);
95 while((link = symbol.templatedClasses.first))
96 symbol.templatedClasses.Delete(link);
100 if(symbol.templateParams)
101 FreeList(symbol.templateParams, FreeTemplateParameter);
103 // Used to be in ClassDefinition
104 delete symbol.constructorName;
105 delete symbol.structName;
106 delete symbol.className;
107 delete symbol.destructorName;
108 delete symbol.shortName;
111 FreeContext(symbol.ctx);
117 void FreeMethodImport(MethodImport imp)
122 void FreePropertyImport(MethodImport imp)
127 void FreeClassImport(ClassImport imp)
130 imp.methods.Free(FreeMethodImport);
131 imp.properties.Free(FreePropertyImport);
134 void FreeFunctionImport(ClassImport imp)
139 public void FreeModuleImport(ModuleImport imp)
142 imp.classes.Free(FreeClassImport);
143 imp.functions.Free(FreeFunctionImport);
146 public void FreeModuleDefine(Definition def)
151 public void FreeExcludedSymbols(OldList excludedSymbols)
155 while((symbol = excludedSymbols.first))
157 excludedSymbols.Remove(symbol);
162 public void FreeTemplateArgument(TemplateArgument arg)
168 FreeExpression(arg.expression);
172 FreeIdentifier(arg.identifier);
175 if(arg.templateDatatype)
176 FreeTemplateDataType(arg.templateDatatype);
180 FreeIdentifier(arg.name);
184 public void FreeTemplateDataType(TemplateDatatype type)
187 FreeDeclarator(type.decl);
189 FreeList(type.specifiers, FreeSpecifier);
193 public void FreeTemplateParameter(TemplateParameter param)
197 FreeIdentifier(param.identifier);
199 if(param.type == type || param.type == expression)
202 FreeTemplateDataType(param.dataType);
204 if(param.defaultArgument)
205 FreeTemplateArgument(param.defaultArgument);
207 FreeType(param.baseType);
211 public void FreeTemplateType(TemplatedType type)
215 FreeTemplateParameter(type.param);
220 public void FreeContext(Context context)
224 if(context == curContext)
225 curContext = globalContext;
227 while((symbol = (Symbol)context.types.root))
229 context.types.Remove((BTNode)symbol);
232 while((symbol = (Symbol)context.classes.root))
234 context.classes.Remove((BTNode)symbol);
237 while((symbol = (Symbol)context.symbols.root))
239 context.symbols.Remove((BTNode)symbol);
242 while((symbol = (Symbol)context.structSymbols.root))
244 context.structSymbols.Remove((BTNode)symbol);
247 while((symbol = (Symbol)context.templateTypes.root))
249 context.templateTypes.Remove((BTNode)symbol);
250 FreeTemplateType((TemplatedType)symbol);
254 context.simpleID = 0;
255 context.parent = null;
258 void FreeEnumerator(Enumerator enumerator)
261 FreeIdentifier(enumerator.id);
263 FreeExpression(enumerator.exp);
268 void FreeSpecifier(Specifier spec)
272 FreeSpecifierContents(spec);
277 void FreeSpecifierContents(Specifier spec)
282 //case classSpecifier:
284 if(spec.templateArgs)
286 FreeList(spec.templateArgs, FreeTemplateArgument);
287 spec.templateArgs = null;
290 case extendedSpecifier:
293 FreeExtDecl(spec.extDecl);
300 FreeList(spec.baseSpecs, FreeSpecifier);
301 spec.baseSpecs = null;
305 FreeIdentifier(spec.id);
310 FreeList(spec.list, FreeEnumerator);
315 FreeList(spec.definitions, FreeClassDef);
316 spec.definitions = null;
319 case structSpecifier:
323 FreeIdentifier(spec.id);
328 FreeList(spec.definitions, FreeClassDef);
329 spec.definitions = null;
333 FreeList(spec.baseSpecs, FreeSpecifier);
334 spec.baseSpecs = null;
336 if(spec.extDeclStruct)
338 FreeExtDecl(spec.extDeclStruct);
339 spec.extDeclStruct = null;
343 FreeContext(spec.ctx);
347 case subClassSpecifier:
350 FreeSpecifier(spec._class);
357 public void FreeIdentifier(Identifier id)
360 FreeIdentifier(id.badID);
363 FreeSpecifier(id._class);
367 void FreeTypeName(TypeName typeName)
369 if(typeName.qualifiers)
370 FreeList(typeName.qualifiers, FreeSpecifier);
371 if(typeName.declarator)
372 FreeDeclarator(typeName.declarator);
373 if(typeName.bitCount)
374 FreeExpression(typeName.bitCount);
379 public void FreeExpContents(Expression exp)
381 _FreeExpression(exp, false);
384 public void FreeExpression(Expression exp)
386 _FreeExpression(exp, true);
389 static void _FreeExpression(Expression exp, bool freePointer)
392 char debugExpString[4096];
393 debugExpString[0] = '\0';
394 PrintExpression(exp, debugExpString);
400 FreeExpression(exp._new.size);
401 FreeTypeName(exp._new.typeName);
405 FreeExpression(exp._renew.exp);
406 FreeExpression(exp._renew.size);
407 FreeTypeName(exp._renew.typeName);
414 FreeIdentifier(exp.identifier);
419 FreeInstance(exp.instance);
428 FreeExpression(exp.op.exp1);
430 FreeExpression(exp.op.exp2);
434 FreeList(exp.list, FreeExpression);
440 FreeExpression(exp.index.exp);
442 FreeList(exp.index.index, FreeExpression);
448 FreeExpression(exp.call.exp);
449 if(exp.call.arguments)
450 FreeList(exp.call.arguments, FreeExpression);
456 FreeExpression(exp.member.exp);
457 if(exp.member.member)
458 FreeIdentifier(exp.member.member);
461 FreeTypeName(exp._new.typeName);
464 FreeTypeName(exp._new.typeName);
468 FreeExpression(exp.cast.exp);
469 FreeTypeName(exp.cast.typeName);
474 FreeExpression(exp.cond.cond);
476 FreeList(exp.cond.exp, FreeExpression);
478 FreeExpression(exp.cond.elseExp);
481 case extensionCompoundExp:
484 FreeStatement(exp.compound);
487 case extensionExpressionExp:
490 FreeList(exp.list, FreeExpression);
493 case extensionInitializerExp:
495 if(exp.initializer.typeName)
496 FreeTypeName(exp.initializer.typeName);
497 if(exp.initializer.initializer)
498 FreeInitializer(exp.initializer.initializer);
504 if(exp._classExp.specifiers)
505 FreeList(exp._classExp.specifiers, FreeSpecifier);
506 if(exp._classExp.decl)
507 FreeDeclarator(exp._classExp.decl);
513 FreeIdentifier(exp.db.id);
518 if(exp.call.arguments)
519 FreeList(exp.call.arguments, FreeExpression);
522 FreeExpression(exp.dbopen.ds);
524 FreeExpression(exp.dbopen.name);
528 FreeExpression(exp.vaArg.exp);
529 if(exp.vaArg.typeName)
530 FreeTypeName(exp.vaArg.typeName);
534 FreeList(exp.list, FreeExpression);
538 FreeSpecifier(exp._class);
542 FreeIdentifier(exp.classData.id);
546 FreeIdentifier(exp.identifier);
551 case memberPropertyErrorExp:
552 case memberSymbolErrorExp:
554 FreeExpression(exp.member.exp);
555 if(exp.member.member)
556 FreeIdentifier(exp.member.member);
558 case functionCallErrorExp:
560 FreeExpression(exp.call.exp);
561 if(exp.call.arguments)
562 FreeList(exp.call.arguments, FreeExpression);
564 case dereferenceErrorExp:
565 case unknownErrorExp:
566 case noDebuggerErrorExp:
572 FreeType(exp.expType);
574 FreeType(exp.destType);
579 void FreePointer(Pointer pointer)
582 FreePointer(pointer.pointer);
583 if(pointer.qualifiers)
584 FreeList(pointer.qualifiers, FreeSpecifier);
588 void FreeAttrib(Attrib attr)
591 FreeList(attr.attribs, FreeAttribute);
595 void FreeAttribute(Attribute attr)
599 FreeExpression(attr.exp);
603 void FreeExtDecl(ExtDecl extDecl)
605 if(extDecl.type == extDeclAttrib && extDecl.attr)
606 FreeAttrib(extDecl.attr);
607 else if(extDecl.type == extDeclString)
612 void FreeDeclarator(Declarator decl)
615 FreeDeclarator(decl.declarator);
619 case structDeclarator:
620 if(decl.structDecl.exp)
621 FreeExpression(decl.structDecl.exp);
622 if(decl.structDecl.posExp)
623 FreeExpression(decl.structDecl.posExp);
624 if(decl.structDecl.attrib)
625 FreeAttrib(decl.structDecl.attrib);
627 case identifierDeclarator:
628 FreeIdentifier(decl.identifier);
630 case bracketsDeclarator:
632 case arrayDeclarator:
634 FreeExpression(decl.array.exp);
635 if(decl.array.enumClass)
636 FreeSpecifier(decl.array.enumClass);
638 case functionDeclarator:
639 FreeList(decl.function.parameters, FreeTypeName);
641 case pointerDeclarator:
642 if(decl.pointer.pointer)
643 FreePointer(decl.pointer.pointer);
645 case extendedDeclarator:
646 case extendedDeclaratorEnd:
647 if(decl.extended.extended)
648 FreeExtDecl(decl.extended.extended);
654 void FreePropertyWatch(PropertyWatch watcher)
656 if(watcher.properties)
657 FreeList(watcher.properties, FreeIdentifier);
659 FreeStatement(watcher.compound);
663 void FreeAsmField(AsmField field)
666 FreeExpression(field.expression);
668 FreeIdentifier(field.symbolic);
669 delete field.command;
673 void FreeStatement(Statement stmt)
679 if(stmt.asmStmt.spec)
680 FreeSpecifier(stmt.asmStmt.spec);
681 if(stmt.asmStmt.inputFields)
682 FreeList(stmt.asmStmt.inputFields, FreeAsmField);
683 if(stmt.asmStmt.outputFields)
684 FreeList(stmt.asmStmt.outputFields, FreeAsmField);
685 if(stmt.asmStmt.clobberedFields)
686 FreeList(stmt.asmStmt.clobberedFields, FreeAsmField);
687 delete stmt.asmStmt.statements;
691 if(stmt.labeled.stmt)
692 FreeStatement(stmt.labeled.stmt);
695 if(stmt.caseStmt.exp)
696 FreeExpression(stmt.caseStmt.exp);
697 if(stmt.caseStmt.stmt)
698 FreeStatement(stmt.caseStmt.stmt);
700 case badDeclarationStmt:
702 FreeDeclaration(stmt.decl);
706 if(stmt.compound.declarations)
707 FreeList(stmt.compound.declarations, FreeDeclaration);
708 if(stmt.compound.statements)
709 FreeList(stmt.compound.statements, FreeStatement);
710 if(stmt.compound.context)
712 FreeContext(stmt.compound.context);
713 delete stmt.compound.context;
720 FreeList(stmt.expressions, FreeExpression);
726 FreeList(stmt.ifStmt.exp, FreeExpression);
728 FreeStatement(stmt.ifStmt.stmt);
729 if(stmt.ifStmt.elseStmt)
730 FreeStatement(stmt.ifStmt.elseStmt);
735 if(stmt.switchStmt.exp)
736 FreeList(stmt.switchStmt.exp, FreeExpression);
737 if(stmt.switchStmt.stmt)
738 FreeStatement(stmt.switchStmt.stmt);
743 if(stmt.whileStmt.exp)
744 FreeList(stmt.whileStmt.exp, FreeExpression);
745 if(stmt.whileStmt.stmt)
746 FreeStatement(stmt.whileStmt.stmt);
751 if(stmt.doWhile.stmt)
752 FreeStatement(stmt.doWhile.stmt);
755 FreeList(stmt.doWhile.exp, FreeExpression);
760 if(stmt.forStmt.init)
761 FreeStatement(stmt.forStmt.init);
763 if(stmt.forStmt.check)
764 FreeStatement(stmt.forStmt.check);
766 if(stmt.forStmt.increment)
767 FreeList(stmt.forStmt.increment, FreeExpression);
768 if(stmt.forStmt.stmt)
769 FreeStatement(stmt.forStmt.stmt);
774 if(stmt.forEachStmt.id)
775 FreeIdentifier(stmt.forEachStmt.id);
776 if(stmt.forEachStmt.exp)
777 FreeList(stmt.forEachStmt.exp, FreeExpression);
778 if(stmt.forEachStmt.filter)
779 FreeList(stmt.forEachStmt.filter, FreeExpression);
780 if(stmt.forEachStmt.stmt)
781 FreeStatement(stmt.forEachStmt.stmt);
792 FreeList(stmt.expressions, FreeExpression);
795 case fireWatchersStmt:
796 case stopWatchingStmt:
798 if(stmt._watch.watcher)
799 FreeExpression(stmt._watch.watcher);
800 if(stmt._watch.object)
801 FreeExpression(stmt._watch.object);
802 if(stmt._watch.watches)
803 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? (void *)FreePropertyWatch : (void *)FreeIdentifier);
810 void FreeInitializer(Initializer initializer)
812 switch(initializer.type)
814 case listInitializer:
815 FreeList(initializer.list, FreeInitializer);
819 FreeExpression(initializer.exp);
823 FreeIdentifier(initializer.id);
827 void FreeInitDeclarator(InitDeclarator decl)
830 FreeDeclarator(decl.declarator);
832 FreeInitializer(decl.initializer);
836 void FreeDeclaration(Declaration decl)
838 if(decl.symbol && !decl.symbol.type)
840 //FreeSymbol(decl.symbol);
844 case structDeclaration:
847 FreeList(decl.specifiers, FreeSpecifier);
849 FreeList(decl.declarators, FreeDeclarator);
851 FreeSpecifier(decl.extStorage);
854 case initDeclaration:
857 FreeList(decl.specifiers, FreeSpecifier);
859 FreeList(decl.declarators, FreeInitDeclarator);
862 case instDeclaration:
864 FreeInstance(decl.inst);
866 case defineDeclaration:
869 FreeExpression(decl.exp);
871 FreeIdentifier(decl.id);
878 void FreeFunction(FunctionDefinition func)
881 FreeStatement(func.body);
883 FreeDeclarator(func.declarator);
885 FreeList(func.specifiers, FreeSpecifier);
886 if(func.declarations)
887 FreeList(func.declarations, FreeDeclaration);
895 void FreeMemberInit(MemberInit init)
898 FreeInitializer(init.initializer);
900 FreeList(init.identifiers, FreeIdentifier);
904 void FreeMembersInit(MembersInit init)
906 if(init.type == dataMembersInit && init.dataMembers)
907 FreeList(init.dataMembers, FreeMemberInit);
909 if(init.type == methodMembersInit && init.function)
911 FreeClassFunction(init.function);
916 public void FreeInstance(Instantiation inst)
920 FreeList(inst.members, FreeMembersInit);
924 FreeExpression(inst.exp);
928 Symbol classSym = FindClass(inst._class.name);
929 Class _class = classSym ? classSym.registered : null;
932 if(_class.type == normalClass)
934 Instance instance = (Instance)inst.data;
937 else if(_class.type == noHeadClass)
939 if(_class.Destructor)
940 _class.Destructor((Instance)inst.data);
943 else if(_class.type == structClass)
950 Instance instance = (Instance)inst.data;
956 FreeSpecifier(inst._class);
964 public void FreeClassFunction(ClassFunction func)
967 if(func.declarator && func.declarator.symbol)
969 //FreeSymbol(func.declarator.symbol);
976 FreeStatement(func.body);
978 FreeDeclarator(func.declarator);
980 FreeList(func.specifiers, FreeSpecifier);
981 if(func.declarations)
982 FreeList(func.declarations, FreeDeclaration);
984 func.attached.Free(null);
989 void FreeProperty(PropertyDef def)
992 FreeList(def.specifiers, FreeSpecifier);
994 FreeDeclarator(def.declarator);
996 FreeIdentifier(def.id);
998 FreeStatement(def.getStmt);
1000 FreeStatement(def.setStmt);
1002 FreeStatement(def.issetStmt);
1004 FreeExpression(def.category);
1008 FreeFunction(def.getFunction);
1010 FreeFunction(def.setFunction);
1014 // FreeSymbol(def.symbol);
1020 void FreeClassDef(ClassDef def)
1024 case declarationClassDef:
1026 FreeDeclaration(def.decl);
1028 case defaultPropertiesClassDef:
1030 FreeList(def.defProperties, FreeMemberInit);
1033 case functionClassDef:
1035 FreeClassFunction(def.function);
1037 case propertyClassDef:
1039 FreeProperty(def.propertyDef);
1041 case classPropertyClassDef:
1043 FreeProperty(def.propertyDef);
1045 case accessOverrideClassDef:
1047 case classDataClassDef:
1050 FreeDeclaration(def.decl);
1053 case classDesignerClassDef:
1055 delete def.designer;
1058 case classFixedClassDef:
1060 case classNoExpansionClassDef:
1062 case classPropertyValueClassDef:
1064 FreeIdentifier(def.id);
1066 FreeInitializer(def.initializer);
1068 case designerDefaultPropertyClassDef:
1070 if(def.defaultProperty)
1071 FreeIdentifier(def.defaultProperty);
1074 case memberAccessClassDef:
1076 case propertyWatchClassDef:
1078 if(def.propertyWatch)
1079 FreePropertyWatch(def.propertyWatch);
1086 void FreeClass(ClassDefinition _class)
1088 if(_class.definitions)
1089 FreeList(_class.definitions, FreeClassDef);
1091 FreeSpecifier(_class._class);
1092 if(_class.baseSpecs)
1093 FreeList(_class.baseSpecs, FreeSpecifier);
1098 void FreeDBIndexItem(DBIndexItem item)
1101 FreeIdentifier(item.id);
1105 void FreeDBTableEntry(DBTableEntry entry)
1108 FreeIdentifier(entry.id);
1113 FreeTypeName(entry.dataType);
1119 FreeList(entry.items, FreeDBIndexItem);
1125 void FreeDBTable(DBTableDef table)
1127 if(table.definitions)
1128 FreeList(table.definitions, FreeDBTableEntry);
1130 FreeIdentifier(table.symbol);*/
1136 void FreeExternal(External external)
1139 while((e = external.incoming.first))
1141 e.from.outgoing.Remove((IteratorPointer)e);
1142 external.incoming.Remove((IteratorPointer)e);
1145 while((e = external.outgoing.first))
1147 e.to.incoming.Remove((IteratorPointer)e);
1148 external.outgoing.Remove((IteratorPointer)e);
1150 e.to.nonBreakableIncoming--;
1153 switch(external.type)
1155 case functionExternal:
1156 if(external.function)
1157 FreeFunction(external.function);
1159 case declarationExternal:
1160 if(external.declaration)
1161 FreeDeclaration(external.declaration);
1165 FreeClass(external._class);
1167 case importExternal:
1168 delete external.importString;
1170 case nameSpaceExternal:
1171 FreeIdentifier(external.id);
1173 case dbtableExternal:
1175 FreeDBTable(external.table);
1181 public void FreeASTTree(OldList ast)
1186 while((external = ast.first))
1188 ast.Remove(external);
1189 FreeExternal(external);
1195 static void FreeDataMember(DataMember parentMember)
1197 DataMember dataMember;
1199 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1201 if(dataMember.type == structMember || dataMember.type == unionMember)
1202 FreeDataMember(dataMember);
1204 if(dataMember.dataType)
1206 FreeType(dataMember.dataType);
1207 dataMember.dataType = null;
1212 static void FreeClassProperties(ClassProperty classProp)
1214 if(classProp.left) FreeClassProperties(classProp.left);
1215 if(classProp.right) FreeClassProperties(classProp.right);
1216 if(classProp.dataType)
1218 FreeType(classProp.dataType);
1219 classProp.dataType = null;
1223 void FreeModuleData(Module module)
1226 GlobalFunction function;
1229 for(_class = module.classes.first; _class; _class = _class.next)
1231 DataMember dataMember;
1233 ClassTemplateParameter param;
1237 FreeType(_class.dataType);
1238 _class.dataType = null;
1240 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1242 if(dataMember.isProperty)
1244 Property prop = (Property)dataMember;
1247 FreeSymbol(prop.symbol);
1252 if(dataMember.type == structMember || dataMember.type == unionMember)
1253 FreeDataMember(dataMember);
1255 if(dataMember.dataType)
1257 FreeType(dataMember.dataType);
1258 dataMember.dataType = null;
1261 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1263 Property prop = (Property) dataMember;
1266 FreeSymbol(prop.symbol);
1270 FreeType(prop.dataType);
1271 prop.dataType = null;
1274 if(_class.classProperties.first)
1275 FreeClassProperties((ClassProperty)_class.classProperties.first);
1276 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1280 FreeType(method.dataType);
1281 method.dataType = null;
1286 FreeSymbol(method.symbol);
1289 for(param = _class.templateParams.first; param; param = param.next)
1293 FreeTemplateParameter(param.param);
1299 for(function = module.functions.first; function; function = function.next)
1301 if(function.dataType)
1302 FreeType(function.dataType);
1304 FreeSymbol(function.symbol);
1307 // Free the extra module instance on closing the last code editor using it
1310 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1313 List<Module> list = mapIt.data;
1314 Iterator<Module> it { list };
1318 if(it.data == module)
1320 list.Remove(it.pointer);
1329 // Unload the initial module that we loaded for safe sharing
1330 Module mod = list[0];
1331 list.Remove(list.GetFirst());
1332 loadedModules.Remove(mapIt.pointer);
1334 eModule_Unload(__thisModule.application, mod);
1342 public void FreeTypeData(Module privateModule)
1345 for(m = privateModule.application.allModules.first; m; m = m.next)
1349 FreeModuleData(privateModule);