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 FreeAsmField(AsmField field)
599 FreeExpression(field.expression);
600 delete field.command;
604 void FreeStatement(Statement stmt)
610 if(stmt.asmStmt.spec)
611 FreeSpecifier(stmt.asmStmt.spec);
612 if(stmt.asmStmt.inputFields)
613 FreeList(stmt.asmStmt.inputFields, FreeAsmField);
614 if(stmt.asmStmt.outputFields)
615 FreeList(stmt.asmStmt.outputFields, FreeAsmField);
616 if(stmt.asmStmt.clobberedFields)
617 FreeList(stmt.asmStmt.clobberedFields, FreeAsmField);
618 delete stmt.asmStmt.statements;
622 if(stmt.labeled.stmt)
623 FreeStatement(stmt.labeled.stmt);
626 if(stmt.caseStmt.exp)
627 FreeExpression(stmt.caseStmt.exp);
628 if(stmt.caseStmt.stmt)
629 FreeStatement(stmt.caseStmt.stmt);
631 case badDeclarationStmt:
633 FreeDeclaration(stmt.decl);
637 if(stmt.compound.declarations)
638 FreeList(stmt.compound.declarations, FreeDeclaration);
639 if(stmt.compound.statements)
640 FreeList(stmt.compound.statements, FreeStatement);
641 if(stmt.compound.context)
643 FreeContext(stmt.compound.context);
644 delete stmt.compound.context;
651 FreeList(stmt.expressions, FreeExpression);
657 FreeList(stmt.ifStmt.exp, FreeExpression);
659 FreeStatement(stmt.ifStmt.stmt);
660 if(stmt.ifStmt.elseStmt)
661 FreeStatement(stmt.ifStmt.elseStmt);
666 if(stmt.switchStmt.exp)
667 FreeList(stmt.switchStmt.exp, FreeExpression);
668 if(stmt.switchStmt.stmt)
669 FreeStatement(stmt.switchStmt.stmt);
674 if(stmt.whileStmt.exp)
675 FreeList(stmt.whileStmt.exp, FreeExpression);
676 if(stmt.whileStmt.stmt)
677 FreeStatement(stmt.whileStmt.stmt);
682 if(stmt.doWhile.stmt)
683 FreeStatement(stmt.doWhile.stmt);
686 FreeList(stmt.doWhile.exp, FreeExpression);
691 if(stmt.forStmt.init)
692 FreeStatement(stmt.forStmt.init);
694 if(stmt.forStmt.check)
695 FreeStatement(stmt.forStmt.check);
697 if(stmt.forStmt.increment)
698 FreeList(stmt.forStmt.increment, FreeExpression);
699 if(stmt.forStmt.stmt)
700 FreeStatement(stmt.forStmt.stmt);
705 if(stmt.forEachStmt.id)
706 FreeIdentifier(stmt.forEachStmt.id);
707 if(stmt.forEachStmt.exp)
708 FreeList(stmt.forEachStmt.exp, FreeExpression);
709 if(stmt.forEachStmt.filter)
710 FreeList(stmt.forEachStmt.filter, FreeExpression);
711 if(stmt.forEachStmt.stmt)
712 FreeStatement(stmt.forEachStmt.stmt);
723 FreeList(stmt.expressions, FreeExpression);
726 case fireWatchersStmt:
727 case stopWatchingStmt:
729 if(stmt._watch.watcher)
730 FreeExpression(stmt._watch.watcher);
731 if(stmt._watch.object)
732 FreeExpression(stmt._watch.object);
733 if(stmt._watch.watches)
734 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? FreePropertyWatch : FreeIdentifier);
741 void FreeInitializer(Initializer initializer)
743 switch(initializer.type)
745 case listInitializer:
747 FreeList(initializer.list, FreeInitializer);
752 FreeExpression(initializer.exp);
758 void FreeInitDeclarator(InitDeclarator decl)
761 FreeDeclarator(decl.declarator);
763 FreeInitializer(decl.initializer);
767 void FreeDeclaration(Declaration decl)
769 if(decl.symbol && !decl.symbol.type)
771 //FreeSymbol(decl.symbol);
775 case structDeclaration:
778 FreeList(decl.specifiers, FreeSpecifier);
780 FreeList(decl.declarators, FreeDeclarator);
782 FreeSpecifier(decl.extStorage);
785 case initDeclaration:
788 FreeList(decl.specifiers, FreeSpecifier);
790 FreeList(decl.declarators, FreeInitDeclarator);
793 case instDeclaration:
795 FreeInstance(decl.inst);
797 case defineDeclaration:
800 FreeExpression(decl.exp);
802 FreeIdentifier(decl.id);
809 void FreeFunction(FunctionDefinition func)
812 FreeStatement(func.body);
814 FreeDeclarator(func.declarator);
816 FreeList(func.specifiers, FreeSpecifier);
817 if(func.declarations)
818 FreeList(func.declarations, FreeDeclaration);
826 void FreeMemberInit(MemberInit init)
829 FreeInitializer(init.initializer);
831 FreeList(init.identifiers, FreeIdentifier);
835 void FreeMembersInit(MembersInit init)
837 if(init.type == dataMembersInit && init.dataMembers)
838 FreeList(init.dataMembers, FreeMemberInit);
840 if(init.type == methodMembersInit && init.function)
842 FreeClassFunction(init.function);
847 void FreeInstance(Instantiation inst)
851 FreeList(inst.members, FreeMembersInit);
855 FreeExpression(inst.exp);
859 Symbol classSym = FindClass(inst._class.name);
860 Class _class = classSym ? classSym.registered : null;
863 if(_class.type == normalClass)
865 Instance instance = (Instance)inst.data;
868 else if(_class.type == noHeadClass)
870 if(_class.Destructor)
871 _class.Destructor((Instance)inst.data);
874 else if(_class.type == structClass)
881 Instance instance = (Instance)inst.data;
887 FreeSpecifier(inst._class);
895 public void FreeClassFunction(ClassFunction func)
898 if(func.declarator && func.declarator.symbol)
900 //FreeSymbol(func.declarator.symbol);
907 FreeStatement(func.body);
909 FreeDeclarator(func.declarator);
911 FreeList(func.specifiers, FreeSpecifier);
912 if(func.declarations)
913 FreeList(func.declarations, FreeDeclaration);
915 func.attached.Free(null);
920 void FreeProperty(PropertyDef def)
923 FreeList(def.specifiers, FreeSpecifier);
925 FreeDeclarator(def.declarator);
927 FreeIdentifier(def.id);
929 FreeStatement(def.getStmt);
931 FreeStatement(def.setStmt);
933 FreeStatement(def.issetStmt);
935 FreeExpression(def.category);
939 FreeFunction(def.getFunction);
941 FreeFunction(def.setFunction);
945 // FreeSymbol(def.symbol);
951 void FreeClassDef(ClassDef def)
955 case declarationClassDef:
957 FreeDeclaration(def.decl);
959 case defaultPropertiesClassDef:
961 FreeList(def.defProperties, FreeMemberInit);
964 case functionClassDef:
966 FreeClassFunction(def.function);
968 case propertyClassDef:
970 FreeProperty(def.propertyDef);
972 case classPropertyClassDef:
974 FreeProperty(def.propertyDef);
976 case accessOverrideClassDef:
978 case classDataClassDef:
981 FreeDeclaration(def.decl);
984 case classDesignerClassDef:
989 case classFixedClassDef:
991 case classNoExpansionClassDef:
993 case classPropertyValueClassDef:
995 FreeIdentifier(def.id);
997 FreeInitializer(def.initializer);
999 case designerDefaultPropertyClassDef:
1001 if(def.defaultProperty)
1002 FreeIdentifier(def.defaultProperty);
1005 case memberAccessClassDef:
1007 case propertyWatchClassDef:
1009 if(def.propertyWatch)
1010 FreePropertyWatch(def.propertyWatch);
1017 void FreeClass(ClassDefinition _class)
1019 if(_class.definitions)
1020 FreeList(_class.definitions, FreeClassDef);
1022 FreeSpecifier(_class._class);
1023 if(_class.baseSpecs)
1024 FreeList(_class.baseSpecs, FreeSpecifier);
1029 void FreeDBIndexItem(DBIndexItem item)
1032 FreeIdentifier(item.id);
1036 void FreeDBTableEntry(DBTableEntry entry)
1039 FreeIdentifier(entry.id);
1044 FreeTypeName(entry.dataType);
1050 FreeList(entry.items, FreeDBIndexItem);
1056 void FreeDBTable(DBTableDef table)
1058 if(table.definitions)
1059 FreeList(table.definitions, FreeDBTableEntry);
1061 FreeIdentifier(table.symbol);*/
1067 void FreeExternal(External external)
1069 switch(external.type)
1071 case functionExternal:
1072 if(external.function)
1073 FreeFunction(external.function);
1075 case declarationExternal:
1076 if(external.declaration)
1077 FreeDeclaration(external.declaration);
1081 FreeClass(external._class);
1083 case importExternal:
1084 delete external.importString;
1086 case nameSpaceExternal:
1087 FreeIdentifier(external.id);
1089 case dbtableExternal:
1091 FreeDBTable(external.table);
1097 public void FreeASTTree(OldList ast)
1102 while(external = ast.first)
1104 ast.Remove(external);
1105 FreeExternal(external);
1111 static void FreeDataMember(DataMember parentMember)
1113 DataMember dataMember;
1115 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1117 if(dataMember.type == structMember || dataMember.type == unionMember)
1118 FreeDataMember(dataMember);
1120 if(dataMember.dataType)
1122 FreeType(dataMember.dataType);
1123 dataMember.dataType = null;
1128 void FreeModuleData(Module module)
1131 GlobalFunction function;
1134 for(_class = module.classes.first; _class; _class = _class.next)
1136 DataMember dataMember;
1138 ClassTemplateParameter param;
1139 ClassProperty classProp;
1143 FreeType(_class.dataType);
1144 _class.dataType = null;
1146 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1148 if(dataMember.isProperty)
1150 Property prop = (Property)dataMember;
1153 FreeSymbol(prop.symbol);
1158 if(dataMember.type == structMember || dataMember.type == unionMember)
1159 FreeDataMember(dataMember);
1161 if(dataMember.dataType)
1163 FreeType(dataMember.dataType);
1164 dataMember.dataType = null;
1167 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1169 Property prop = (Property) dataMember;
1172 FreeSymbol(prop.symbol);
1176 FreeType(prop.dataType);
1177 prop.dataType = null;
1180 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1184 FreeType(method.dataType);
1185 method.dataType = null;
1190 FreeSymbol(method.symbol);
1193 for(param = _class.templateParams.first; param; param = param.next)
1197 FreeTemplateParameter(param.param);
1203 for(function = module.functions.first; function; function = function.next)
1205 if(function.dataType)
1206 FreeType(function.dataType);
1208 FreeSymbol(function.symbol);
1211 // Free the extra module instance on closing the last code editor using it
1214 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1217 List<Module> list = mapIt.data;
1218 Iterator<Module> it { list };
1222 if(it.data == module)
1224 list.Remove(it.pointer);
1233 // Unload the initial module that we loaded for safe sharing
1234 Module mod = list[0];
1235 list.Remove(list.GetFirst());
1236 loadedModules.Remove(mapIt.pointer);
1238 eModule_Unload(__thisModule.application, mod);
1246 public void FreeTypeData(Module privateModule)
1249 for(m = privateModule.application.allModules.first; m; m = m.next)
1253 FreeModuleData(privateModule);