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);
380 FreeInstance(exp.instance);
389 FreeExpression(exp.op.exp1);
391 FreeExpression(exp.op.exp2);
395 FreeList(exp.list, FreeExpression);
401 FreeExpression(exp.index.exp);
403 FreeList(exp.index.index, FreeExpression);
408 FreeExpression(exp.call.exp);
409 if(exp.call.arguments)
410 FreeList(exp.call.arguments, FreeExpression);
416 FreeExpression(exp.member.exp);
417 if(exp.member.member)
418 FreeIdentifier(exp.member.member);
421 FreeTypeName(exp._new.typeName);
424 FreeTypeName(exp._new.typeName);
428 FreeExpression(exp.cast.exp);
429 FreeTypeName(exp.cast.typeName);
434 FreeExpression(exp.cond.cond);
436 FreeList(exp.cond.exp, FreeExpression);
438 FreeExpression(exp.cond.elseExp);
441 case extensionCompoundExp:
444 FreeStatement(exp.compound);
447 case extensionExpressionExp:
450 FreeList(exp.list, FreeExpression);
453 case extensionInitializerExp:
455 if(exp.initializer.typeName)
456 FreeTypeName(exp.initializer.typeName);
457 if(exp.initializer.initializer)
458 FreeInitializer(exp.initializer.initializer);
464 if(exp._classExp.specifiers)
465 FreeList(exp._classExp.specifiers, FreeSpecifier);
466 if(exp._classExp.decl)
467 FreeDeclarator(exp._classExp.decl);
473 FreeIdentifier(exp.db.id);
478 if(exp.call.arguments)
479 FreeList(exp.call.arguments, FreeExpression);
482 FreeExpression(exp.dbopen.ds);
484 FreeExpression(exp.dbopen.name);
488 FreeExpression(exp.vaArg.exp);
489 if(exp.vaArg.typeName)
490 FreeTypeName(exp.vaArg.typeName);
494 FreeList(exp.list, FreeExpression);
498 FreeSpecifier(exp._class);
502 FreeIdentifier(exp.classData.id);
508 FreeType(exp.expType);
510 FreeType(exp.destType);
515 void FreePointer(Pointer pointer)
518 FreePointer(pointer.pointer);
519 if(pointer.qualifiers)
520 FreeList(pointer.qualifiers, FreeSpecifier);
524 void FreeAttrib(Attrib attr)
527 FreeList(attr.attribs, FreeAttribute);
531 void FreeAttribute(Attribute attr)
535 FreeExpression(attr.exp);
539 void FreeExtDecl(ExtDecl extDecl)
541 if(extDecl.type == extDeclAttrib && extDecl.attr)
542 FreeAttrib(extDecl.attr);
543 else if(extDecl.type == extDeclString)
548 void FreeDeclarator(Declarator decl)
551 FreeDeclarator(decl.declarator);
555 case structDeclarator:
556 if(decl.structDecl.exp)
557 FreeExpression(decl.structDecl.exp);
558 if(decl.structDecl.posExp)
559 FreeExpression(decl.structDecl.posExp);
560 if(decl.structDecl.attrib)
561 FreeAttrib(decl.structDecl.attrib);
563 case identifierDeclarator:
564 FreeIdentifier(decl.identifier);
566 case bracketsDeclarator:
568 case arrayDeclarator:
570 FreeExpression(decl.array.exp);
571 if(decl.array.enumClass)
572 FreeSpecifier(decl.array.enumClass);
574 case functionDeclarator:
575 FreeList(decl.function.parameters, FreeTypeName);
577 case pointerDeclarator:
578 if(decl.pointer.pointer)
579 FreePointer(decl.pointer.pointer);
581 case extendedDeclarator:
582 case extendedDeclaratorEnd:
583 if(decl.extended.extended)
584 FreeExtDecl(decl.extended.extended);
590 void FreePropertyWatch(PropertyWatch watcher)
592 if(watcher.properties)
593 FreeList(watcher.properties, FreeIdentifier);
595 FreeStatement(watcher.compound);
599 void FreeAsmField(AsmField field)
602 FreeExpression(field.expression);
603 delete field.command;
607 void FreeStatement(Statement stmt)
613 if(stmt.asmStmt.spec)
614 FreeSpecifier(stmt.asmStmt.spec);
615 if(stmt.asmStmt.inputFields)
616 FreeList(stmt.asmStmt.inputFields, FreeAsmField);
617 if(stmt.asmStmt.outputFields)
618 FreeList(stmt.asmStmt.outputFields, FreeAsmField);
619 if(stmt.asmStmt.clobberedFields)
620 FreeList(stmt.asmStmt.clobberedFields, FreeAsmField);
621 delete stmt.asmStmt.statements;
625 if(stmt.labeled.stmt)
626 FreeStatement(stmt.labeled.stmt);
629 if(stmt.caseStmt.exp)
630 FreeExpression(stmt.caseStmt.exp);
631 if(stmt.caseStmt.stmt)
632 FreeStatement(stmt.caseStmt.stmt);
634 case badDeclarationStmt:
636 FreeDeclaration(stmt.decl);
640 if(stmt.compound.declarations)
641 FreeList(stmt.compound.declarations, FreeDeclaration);
642 if(stmt.compound.statements)
643 FreeList(stmt.compound.statements, FreeStatement);
644 if(stmt.compound.context)
646 FreeContext(stmt.compound.context);
647 delete stmt.compound.context;
654 FreeList(stmt.expressions, FreeExpression);
660 FreeList(stmt.ifStmt.exp, FreeExpression);
662 FreeStatement(stmt.ifStmt.stmt);
663 if(stmt.ifStmt.elseStmt)
664 FreeStatement(stmt.ifStmt.elseStmt);
669 if(stmt.switchStmt.exp)
670 FreeList(stmt.switchStmt.exp, FreeExpression);
671 if(stmt.switchStmt.stmt)
672 FreeStatement(stmt.switchStmt.stmt);
677 if(stmt.whileStmt.exp)
678 FreeList(stmt.whileStmt.exp, FreeExpression);
679 if(stmt.whileStmt.stmt)
680 FreeStatement(stmt.whileStmt.stmt);
685 if(stmt.doWhile.stmt)
686 FreeStatement(stmt.doWhile.stmt);
689 FreeList(stmt.doWhile.exp, FreeExpression);
694 if(stmt.forStmt.init)
695 FreeStatement(stmt.forStmt.init);
697 if(stmt.forStmt.check)
698 FreeStatement(stmt.forStmt.check);
700 if(stmt.forStmt.increment)
701 FreeList(stmt.forStmt.increment, FreeExpression);
702 if(stmt.forStmt.stmt)
703 FreeStatement(stmt.forStmt.stmt);
708 if(stmt.forEachStmt.id)
709 FreeIdentifier(stmt.forEachStmt.id);
710 if(stmt.forEachStmt.exp)
711 FreeList(stmt.forEachStmt.exp, FreeExpression);
712 if(stmt.forEachStmt.filter)
713 FreeList(stmt.forEachStmt.filter, FreeExpression);
714 if(stmt.forEachStmt.stmt)
715 FreeStatement(stmt.forEachStmt.stmt);
726 FreeList(stmt.expressions, FreeExpression);
729 case fireWatchersStmt:
730 case stopWatchingStmt:
732 if(stmt._watch.watcher)
733 FreeExpression(stmt._watch.watcher);
734 if(stmt._watch.object)
735 FreeExpression(stmt._watch.object);
736 if(stmt._watch.watches)
737 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? FreePropertyWatch : FreeIdentifier);
744 void FreeInitializer(Initializer initializer)
746 switch(initializer.type)
748 case listInitializer:
750 FreeList(initializer.list, FreeInitializer);
755 FreeExpression(initializer.exp);
761 void FreeInitDeclarator(InitDeclarator decl)
764 FreeDeclarator(decl.declarator);
766 FreeInitializer(decl.initializer);
770 void FreeDeclaration(Declaration decl)
772 if(decl.symbol && !decl.symbol.type)
774 //FreeSymbol(decl.symbol);
778 case structDeclaration:
781 FreeList(decl.specifiers, FreeSpecifier);
783 FreeList(decl.declarators, FreeDeclarator);
785 FreeSpecifier(decl.extStorage);
788 case initDeclaration:
791 FreeList(decl.specifiers, FreeSpecifier);
793 FreeList(decl.declarators, FreeInitDeclarator);
796 case instDeclaration:
798 FreeInstance(decl.inst);
800 case defineDeclaration:
803 FreeExpression(decl.exp);
805 FreeIdentifier(decl.id);
812 void FreeFunction(FunctionDefinition func)
815 FreeStatement(func.body);
817 FreeDeclarator(func.declarator);
819 FreeList(func.specifiers, FreeSpecifier);
820 if(func.declarations)
821 FreeList(func.declarations, FreeDeclaration);
829 void FreeMemberInit(MemberInit init)
832 FreeInitializer(init.initializer);
834 FreeList(init.identifiers, FreeIdentifier);
838 void FreeMembersInit(MembersInit init)
840 if(init.type == dataMembersInit && init.dataMembers)
841 FreeList(init.dataMembers, FreeMemberInit);
843 if(init.type == methodMembersInit && init.function)
845 FreeClassFunction(init.function);
850 void FreeInstance(Instantiation inst)
854 FreeList(inst.members, FreeMembersInit);
858 FreeExpression(inst.exp);
862 Symbol classSym = FindClass(inst._class.name);
863 Class _class = classSym ? classSym.registered : null;
866 if(_class.type == normalClass)
868 Instance instance = (Instance)inst.data;
871 else if(_class.type == noHeadClass)
873 if(_class.Destructor)
874 _class.Destructor((Instance)inst.data);
877 else if(_class.type == structClass)
884 Instance instance = (Instance)inst.data;
890 FreeSpecifier(inst._class);
898 public void FreeClassFunction(ClassFunction func)
901 if(func.declarator && func.declarator.symbol)
903 //FreeSymbol(func.declarator.symbol);
910 FreeStatement(func.body);
912 FreeDeclarator(func.declarator);
914 FreeList(func.specifiers, FreeSpecifier);
915 if(func.declarations)
916 FreeList(func.declarations, FreeDeclaration);
918 func.attached.Free(null);
923 void FreeProperty(PropertyDef def)
926 FreeList(def.specifiers, FreeSpecifier);
928 FreeDeclarator(def.declarator);
930 FreeIdentifier(def.id);
932 FreeStatement(def.getStmt);
934 FreeStatement(def.setStmt);
936 FreeStatement(def.issetStmt);
938 FreeExpression(def.category);
942 FreeFunction(def.getFunction);
944 FreeFunction(def.setFunction);
948 // FreeSymbol(def.symbol);
954 void FreeClassDef(ClassDef def)
958 case declarationClassDef:
960 FreeDeclaration(def.decl);
962 case defaultPropertiesClassDef:
964 FreeList(def.defProperties, FreeMemberInit);
967 case functionClassDef:
969 FreeClassFunction(def.function);
971 case propertyClassDef:
973 FreeProperty(def.propertyDef);
975 case classPropertyClassDef:
977 FreeProperty(def.propertyDef);
979 case accessOverrideClassDef:
981 case classDataClassDef:
984 FreeDeclaration(def.decl);
987 case classDesignerClassDef:
992 case classFixedClassDef:
994 case classNoExpansionClassDef:
996 case classPropertyValueClassDef:
998 FreeIdentifier(def.id);
1000 FreeInitializer(def.initializer);
1002 case designerDefaultPropertyClassDef:
1004 if(def.defaultProperty)
1005 FreeIdentifier(def.defaultProperty);
1008 case memberAccessClassDef:
1010 case propertyWatchClassDef:
1012 if(def.propertyWatch)
1013 FreePropertyWatch(def.propertyWatch);
1020 void FreeClass(ClassDefinition _class)
1022 if(_class.definitions)
1023 FreeList(_class.definitions, FreeClassDef);
1025 FreeSpecifier(_class._class);
1026 if(_class.baseSpecs)
1027 FreeList(_class.baseSpecs, FreeSpecifier);
1032 void FreeDBIndexItem(DBIndexItem item)
1035 FreeIdentifier(item.id);
1039 void FreeDBTableEntry(DBTableEntry entry)
1042 FreeIdentifier(entry.id);
1047 FreeTypeName(entry.dataType);
1053 FreeList(entry.items, FreeDBIndexItem);
1059 void FreeDBTable(DBTableDef table)
1061 if(table.definitions)
1062 FreeList(table.definitions, FreeDBTableEntry);
1064 FreeIdentifier(table.symbol);*/
1070 void FreeExternal(External external)
1072 switch(external.type)
1074 case functionExternal:
1075 if(external.function)
1076 FreeFunction(external.function);
1078 case declarationExternal:
1079 if(external.declaration)
1080 FreeDeclaration(external.declaration);
1084 FreeClass(external._class);
1086 case importExternal:
1087 delete external.importString;
1089 case nameSpaceExternal:
1090 FreeIdentifier(external.id);
1092 case dbtableExternal:
1094 FreeDBTable(external.table);
1100 public void FreeASTTree(OldList ast)
1105 while(external = ast.first)
1107 ast.Remove(external);
1108 FreeExternal(external);
1114 static void FreeDataMember(DataMember parentMember)
1116 DataMember dataMember;
1118 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1120 if(dataMember.type == structMember || dataMember.type == unionMember)
1121 FreeDataMember(dataMember);
1123 if(dataMember.dataType)
1125 FreeType(dataMember.dataType);
1126 dataMember.dataType = null;
1131 void FreeModuleData(Module module)
1134 GlobalFunction function;
1137 for(_class = module.classes.first; _class; _class = _class.next)
1139 DataMember dataMember;
1141 ClassTemplateParameter param;
1142 ClassProperty classProp;
1146 FreeType(_class.dataType);
1147 _class.dataType = null;
1149 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1151 if(dataMember.isProperty)
1153 Property prop = (Property)dataMember;
1156 FreeSymbol(prop.symbol);
1161 if(dataMember.type == structMember || dataMember.type == unionMember)
1162 FreeDataMember(dataMember);
1164 if(dataMember.dataType)
1166 FreeType(dataMember.dataType);
1167 dataMember.dataType = null;
1170 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1172 Property prop = (Property) dataMember;
1175 FreeSymbol(prop.symbol);
1179 FreeType(prop.dataType);
1180 prop.dataType = null;
1183 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1187 FreeType(method.dataType);
1188 method.dataType = null;
1193 FreeSymbol(method.symbol);
1196 for(param = _class.templateParams.first; param; param = param.next)
1200 FreeTemplateParameter(param.param);
1206 for(function = module.functions.first; function; function = function.next)
1208 if(function.dataType)
1209 FreeType(function.dataType);
1211 FreeSymbol(function.symbol);
1214 // Free the extra module instance on closing the last code editor using it
1217 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1220 List<Module> list = mapIt.data;
1221 Iterator<Module> it { list };
1225 if(it.data == module)
1227 list.Remove(it.pointer);
1236 // Unload the initial module that we loaded for safe sharing
1237 Module mod = list[0];
1238 list.Remove(list.GetFirst());
1239 loadedModules.Remove(mapIt.pointer);
1241 eModule_Unload(__thisModule.application, mod);
1249 public void FreeTypeData(Module privateModule)
1252 for(m = privateModule.application.allModules.first; m; m = m.next)
1256 FreeModuleData(privateModule);