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 FreeList(spec.baseSpecs, FreeSpecifier);
289 FreeIdentifier(spec.id);
291 FreeList(spec.list, FreeEnumerator);
293 FreeList(spec.definitions, FreeClassDef);
295 case structSpecifier:
298 FreeIdentifier(spec.id);
300 FreeList(spec.definitions, FreeClassDef);
302 FreeList(spec.baseSpecs, FreeSpecifier);
303 if(spec.extDeclStruct)
304 FreeExtDecl(spec.extDeclStruct);
307 FreeContext(spec.ctx);
311 case subClassSpecifier:
313 FreeSpecifier(spec._class);
320 public void FreeIdentifier(Identifier id)
323 FreeIdentifier(id.badID);
326 FreeSpecifier(id._class);
330 void FreeTypeName(TypeName typeName)
332 if(typeName.qualifiers)
333 FreeList(typeName.qualifiers, FreeSpecifier);
334 if(typeName.declarator)
335 FreeDeclarator(typeName.declarator);
336 if(typeName.bitCount)
337 FreeExpression(typeName.bitCount);
342 public void FreeExpContents(Expression exp)
344 _FreeExpression(exp, false);
347 public void FreeExpression(Expression exp)
349 _FreeExpression(exp, true);
352 static void _FreeExpression(Expression exp, bool freePointer)
355 char debugExpString[4096];
356 debugExpString[0] = '\0';
357 PrintExpression(exp, debugExpString);
363 FreeExpression(exp._new.size);
364 FreeTypeName(exp._new.typeName);
368 FreeExpression(exp._renew.exp);
369 FreeExpression(exp._renew.size);
370 FreeTypeName(exp._renew.typeName);
377 FreeIdentifier(exp.identifier);
382 FreeInstance(exp.instance);
391 FreeExpression(exp.op.exp1);
393 FreeExpression(exp.op.exp2);
397 FreeList(exp.list, FreeExpression);
403 FreeExpression(exp.index.exp);
405 FreeList(exp.index.index, FreeExpression);
411 FreeExpression(exp.call.exp);
412 if(exp.call.arguments)
413 FreeList(exp.call.arguments, FreeExpression);
419 FreeExpression(exp.member.exp);
420 if(exp.member.member)
421 FreeIdentifier(exp.member.member);
424 FreeTypeName(exp._new.typeName);
427 FreeTypeName(exp._new.typeName);
431 FreeExpression(exp.cast.exp);
432 FreeTypeName(exp.cast.typeName);
437 FreeExpression(exp.cond.cond);
439 FreeList(exp.cond.exp, FreeExpression);
441 FreeExpression(exp.cond.elseExp);
444 case extensionCompoundExp:
447 FreeStatement(exp.compound);
450 case extensionExpressionExp:
453 FreeList(exp.list, FreeExpression);
456 case extensionInitializerExp:
458 if(exp.initializer.typeName)
459 FreeTypeName(exp.initializer.typeName);
460 if(exp.initializer.initializer)
461 FreeInitializer(exp.initializer.initializer);
467 if(exp._classExp.specifiers)
468 FreeList(exp._classExp.specifiers, FreeSpecifier);
469 if(exp._classExp.decl)
470 FreeDeclarator(exp._classExp.decl);
476 FreeIdentifier(exp.db.id);
481 if(exp.call.arguments)
482 FreeList(exp.call.arguments, FreeExpression);
485 FreeExpression(exp.dbopen.ds);
487 FreeExpression(exp.dbopen.name);
491 FreeExpression(exp.vaArg.exp);
492 if(exp.vaArg.typeName)
493 FreeTypeName(exp.vaArg.typeName);
497 FreeList(exp.list, FreeExpression);
501 FreeSpecifier(exp._class);
505 FreeIdentifier(exp.classData.id);
509 FreeIdentifier(exp.identifier);
514 case memberPropertyErrorExp:
515 case memberSymbolErrorExp:
517 FreeExpression(exp.member.exp);
518 if(exp.member.member)
519 FreeIdentifier(exp.member.member);
521 case functionCallErrorExp:
523 FreeExpression(exp.call.exp);
524 if(exp.call.arguments)
525 FreeList(exp.call.arguments, FreeExpression);
527 case dereferenceErrorExp:
528 case unknownErrorExp:
529 case noDebuggerErrorExp:
535 FreeType(exp.expType);
537 FreeType(exp.destType);
542 void FreePointer(Pointer pointer)
545 FreePointer(pointer.pointer);
546 if(pointer.qualifiers)
547 FreeList(pointer.qualifiers, FreeSpecifier);
551 void FreeAttrib(Attrib attr)
554 FreeList(attr.attribs, FreeAttribute);
558 void FreeAttribute(Attribute attr)
562 FreeExpression(attr.exp);
566 void FreeExtDecl(ExtDecl extDecl)
568 if(extDecl.type == extDeclAttrib && extDecl.attr)
569 FreeAttrib(extDecl.attr);
570 else if(extDecl.type == extDeclString)
575 void FreeDeclarator(Declarator decl)
578 FreeDeclarator(decl.declarator);
582 case structDeclarator:
583 if(decl.structDecl.exp)
584 FreeExpression(decl.structDecl.exp);
585 if(decl.structDecl.posExp)
586 FreeExpression(decl.structDecl.posExp);
587 if(decl.structDecl.attrib)
588 FreeAttrib(decl.structDecl.attrib);
590 case identifierDeclarator:
591 FreeIdentifier(decl.identifier);
593 case bracketsDeclarator:
595 case arrayDeclarator:
597 FreeExpression(decl.array.exp);
598 if(decl.array.enumClass)
599 FreeSpecifier(decl.array.enumClass);
601 case functionDeclarator:
602 FreeList(decl.function.parameters, FreeTypeName);
604 case pointerDeclarator:
605 if(decl.pointer.pointer)
606 FreePointer(decl.pointer.pointer);
608 case extendedDeclarator:
609 case extendedDeclaratorEnd:
610 if(decl.extended.extended)
611 FreeExtDecl(decl.extended.extended);
617 void FreePropertyWatch(PropertyWatch watcher)
619 if(watcher.properties)
620 FreeList(watcher.properties, FreeIdentifier);
622 FreeStatement(watcher.compound);
626 void FreeAsmField(AsmField field)
629 FreeExpression(field.expression);
631 FreeIdentifier(field.symbolic);
632 delete field.command;
636 void FreeStatement(Statement stmt)
642 if(stmt.asmStmt.spec)
643 FreeSpecifier(stmt.asmStmt.spec);
644 if(stmt.asmStmt.inputFields)
645 FreeList(stmt.asmStmt.inputFields, FreeAsmField);
646 if(stmt.asmStmt.outputFields)
647 FreeList(stmt.asmStmt.outputFields, FreeAsmField);
648 if(stmt.asmStmt.clobberedFields)
649 FreeList(stmt.asmStmt.clobberedFields, FreeAsmField);
650 delete stmt.asmStmt.statements;
654 if(stmt.labeled.stmt)
655 FreeStatement(stmt.labeled.stmt);
658 if(stmt.caseStmt.exp)
659 FreeExpression(stmt.caseStmt.exp);
660 if(stmt.caseStmt.stmt)
661 FreeStatement(stmt.caseStmt.stmt);
663 case badDeclarationStmt:
665 FreeDeclaration(stmt.decl);
669 if(stmt.compound.declarations)
670 FreeList(stmt.compound.declarations, FreeDeclaration);
671 if(stmt.compound.statements)
672 FreeList(stmt.compound.statements, FreeStatement);
673 if(stmt.compound.context)
675 FreeContext(stmt.compound.context);
676 delete stmt.compound.context;
683 FreeList(stmt.expressions, FreeExpression);
689 FreeList(stmt.ifStmt.exp, FreeExpression);
691 FreeStatement(stmt.ifStmt.stmt);
692 if(stmt.ifStmt.elseStmt)
693 FreeStatement(stmt.ifStmt.elseStmt);
698 if(stmt.switchStmt.exp)
699 FreeList(stmt.switchStmt.exp, FreeExpression);
700 if(stmt.switchStmt.stmt)
701 FreeStatement(stmt.switchStmt.stmt);
706 if(stmt.whileStmt.exp)
707 FreeList(stmt.whileStmt.exp, FreeExpression);
708 if(stmt.whileStmt.stmt)
709 FreeStatement(stmt.whileStmt.stmt);
714 if(stmt.doWhile.stmt)
715 FreeStatement(stmt.doWhile.stmt);
718 FreeList(stmt.doWhile.exp, FreeExpression);
723 if(stmt.forStmt.init)
724 FreeStatement(stmt.forStmt.init);
726 if(stmt.forStmt.check)
727 FreeStatement(stmt.forStmt.check);
729 if(stmt.forStmt.increment)
730 FreeList(stmt.forStmt.increment, FreeExpression);
731 if(stmt.forStmt.stmt)
732 FreeStatement(stmt.forStmt.stmt);
737 if(stmt.forEachStmt.id)
738 FreeIdentifier(stmt.forEachStmt.id);
739 if(stmt.forEachStmt.exp)
740 FreeList(stmt.forEachStmt.exp, FreeExpression);
741 if(stmt.forEachStmt.filter)
742 FreeList(stmt.forEachStmt.filter, FreeExpression);
743 if(stmt.forEachStmt.stmt)
744 FreeStatement(stmt.forEachStmt.stmt);
755 FreeList(stmt.expressions, FreeExpression);
758 case fireWatchersStmt:
759 case stopWatchingStmt:
761 if(stmt._watch.watcher)
762 FreeExpression(stmt._watch.watcher);
763 if(stmt._watch.object)
764 FreeExpression(stmt._watch.object);
765 if(stmt._watch.watches)
766 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? FreePropertyWatch : FreeIdentifier);
773 void FreeInitializer(Initializer initializer)
775 switch(initializer.type)
777 case listInitializer:
779 FreeList(initializer.list, FreeInitializer);
784 FreeExpression(initializer.exp);
790 void FreeInitDeclarator(InitDeclarator decl)
793 FreeDeclarator(decl.declarator);
795 FreeInitializer(decl.initializer);
799 void FreeDeclaration(Declaration decl)
801 if(decl.symbol && !decl.symbol.type)
803 //FreeSymbol(decl.symbol);
807 case structDeclaration:
810 FreeList(decl.specifiers, FreeSpecifier);
812 FreeList(decl.declarators, FreeDeclarator);
814 FreeSpecifier(decl.extStorage);
817 case initDeclaration:
820 FreeList(decl.specifiers, FreeSpecifier);
822 FreeList(decl.declarators, FreeInitDeclarator);
825 case instDeclaration:
827 FreeInstance(decl.inst);
829 case defineDeclaration:
832 FreeExpression(decl.exp);
834 FreeIdentifier(decl.id);
841 void FreeFunction(FunctionDefinition func)
844 FreeStatement(func.body);
846 FreeDeclarator(func.declarator);
848 FreeList(func.specifiers, FreeSpecifier);
849 if(func.declarations)
850 FreeList(func.declarations, FreeDeclaration);
858 void FreeMemberInit(MemberInit init)
861 FreeInitializer(init.initializer);
863 FreeList(init.identifiers, FreeIdentifier);
867 void FreeMembersInit(MembersInit init)
869 if(init.type == dataMembersInit && init.dataMembers)
870 FreeList(init.dataMembers, FreeMemberInit);
872 if(init.type == methodMembersInit && init.function)
874 FreeClassFunction(init.function);
879 void FreeInstance(Instantiation inst)
883 FreeList(inst.members, FreeMembersInit);
887 FreeExpression(inst.exp);
891 Symbol classSym = FindClass(inst._class.name);
892 Class _class = classSym ? classSym.registered : null;
895 if(_class.type == normalClass)
897 Instance instance = (Instance)inst.data;
900 else if(_class.type == noHeadClass)
902 if(_class.Destructor)
903 _class.Destructor((Instance)inst.data);
906 else if(_class.type == structClass)
913 Instance instance = (Instance)inst.data;
919 FreeSpecifier(inst._class);
927 public void FreeClassFunction(ClassFunction func)
930 if(func.declarator && func.declarator.symbol)
932 //FreeSymbol(func.declarator.symbol);
939 FreeStatement(func.body);
941 FreeDeclarator(func.declarator);
943 FreeList(func.specifiers, FreeSpecifier);
944 if(func.declarations)
945 FreeList(func.declarations, FreeDeclaration);
947 func.attached.Free(null);
952 void FreeProperty(PropertyDef def)
955 FreeList(def.specifiers, FreeSpecifier);
957 FreeDeclarator(def.declarator);
959 FreeIdentifier(def.id);
961 FreeStatement(def.getStmt);
963 FreeStatement(def.setStmt);
965 FreeStatement(def.issetStmt);
967 FreeExpression(def.category);
971 FreeFunction(def.getFunction);
973 FreeFunction(def.setFunction);
977 // FreeSymbol(def.symbol);
983 void FreeClassDef(ClassDef def)
987 case declarationClassDef:
989 FreeDeclaration(def.decl);
991 case defaultPropertiesClassDef:
993 FreeList(def.defProperties, FreeMemberInit);
996 case functionClassDef:
998 FreeClassFunction(def.function);
1000 case propertyClassDef:
1002 FreeProperty(def.propertyDef);
1004 case classPropertyClassDef:
1006 FreeProperty(def.propertyDef);
1008 case accessOverrideClassDef:
1010 case classDataClassDef:
1013 FreeDeclaration(def.decl);
1016 case classDesignerClassDef:
1018 delete def.designer;
1021 case classFixedClassDef:
1023 case classNoExpansionClassDef:
1025 case classPropertyValueClassDef:
1027 FreeIdentifier(def.id);
1029 FreeInitializer(def.initializer);
1031 case designerDefaultPropertyClassDef:
1033 if(def.defaultProperty)
1034 FreeIdentifier(def.defaultProperty);
1037 case memberAccessClassDef:
1039 case propertyWatchClassDef:
1041 if(def.propertyWatch)
1042 FreePropertyWatch(def.propertyWatch);
1049 void FreeClass(ClassDefinition _class)
1051 if(_class.definitions)
1052 FreeList(_class.definitions, FreeClassDef);
1054 FreeSpecifier(_class._class);
1055 if(_class.baseSpecs)
1056 FreeList(_class.baseSpecs, FreeSpecifier);
1061 void FreeDBIndexItem(DBIndexItem item)
1064 FreeIdentifier(item.id);
1068 void FreeDBTableEntry(DBTableEntry entry)
1071 FreeIdentifier(entry.id);
1076 FreeTypeName(entry.dataType);
1082 FreeList(entry.items, FreeDBIndexItem);
1088 void FreeDBTable(DBTableDef table)
1090 if(table.definitions)
1091 FreeList(table.definitions, FreeDBTableEntry);
1093 FreeIdentifier(table.symbol);*/
1099 void FreeExternal(External external)
1101 switch(external.type)
1103 case functionExternal:
1104 if(external.function)
1105 FreeFunction(external.function);
1107 case declarationExternal:
1108 if(external.declaration)
1109 FreeDeclaration(external.declaration);
1113 FreeClass(external._class);
1115 case importExternal:
1116 delete external.importString;
1118 case nameSpaceExternal:
1119 FreeIdentifier(external.id);
1121 case dbtableExternal:
1123 FreeDBTable(external.table);
1129 public void FreeASTTree(OldList ast)
1134 while(external = ast.first)
1136 ast.Remove(external);
1137 FreeExternal(external);
1143 static void FreeDataMember(DataMember parentMember)
1145 DataMember dataMember;
1147 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1149 if(dataMember.type == structMember || dataMember.type == unionMember)
1150 FreeDataMember(dataMember);
1152 if(dataMember.dataType)
1154 FreeType(dataMember.dataType);
1155 dataMember.dataType = null;
1160 static void FreeClassProperties(ClassProperty classProp)
1162 if(classProp.left) FreeClassProperties(classProp.left);
1163 if(classProp.right) FreeClassProperties(classProp.right);
1164 if(classProp.dataType)
1166 FreeType(classProp.dataType);
1167 classProp.dataType = null;
1171 void FreeModuleData(Module module)
1174 GlobalFunction function;
1177 for(_class = module.classes.first; _class; _class = _class.next)
1179 DataMember dataMember;
1181 ClassTemplateParameter param;
1182 ClassProperty classProp;
1186 FreeType(_class.dataType);
1187 _class.dataType = null;
1189 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1191 if(dataMember.isProperty)
1193 Property prop = (Property)dataMember;
1196 FreeSymbol(prop.symbol);
1201 if(dataMember.type == structMember || dataMember.type == unionMember)
1202 FreeDataMember(dataMember);
1204 if(dataMember.dataType)
1206 FreeType(dataMember.dataType);
1207 dataMember.dataType = null;
1210 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1212 Property prop = (Property) dataMember;
1215 FreeSymbol(prop.symbol);
1219 FreeType(prop.dataType);
1220 prop.dataType = null;
1223 if(_class.classProperties.first)
1224 FreeClassProperties((ClassProperty)_class.classProperties.first);
1225 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1229 FreeType(method.dataType);
1230 method.dataType = null;
1235 FreeSymbol(method.symbol);
1238 for(param = _class.templateParams.first; param; param = param.next)
1242 FreeTemplateParameter(param.param);
1248 for(function = module.functions.first; function; function = function.next)
1250 if(function.dataType)
1251 FreeType(function.dataType);
1253 FreeSymbol(function.symbol);
1256 // Free the extra module instance on closing the last code editor using it
1259 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1262 List<Module> list = mapIt.data;
1263 Iterator<Module> it { list };
1267 if(it.data == module)
1269 list.Remove(it.pointer);
1278 // Unload the initial module that we loaded for safe sharing
1279 Module mod = list[0];
1280 list.Remove(list.GetFirst());
1281 loadedModules.Remove(mapIt.pointer);
1283 eModule_Unload(__thisModule.application, mod);
1291 public void FreeTypeData(Module privateModule)
1294 for(m = privateModule.application.allModules.first; m; m = m.next)
1298 FreeModuleData(privateModule);