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)
273 FreeSpecifierContents(spec);
278 void FreeSpecifierContents(Specifier spec)
283 //case classSpecifier:
285 if(spec.templateArgs)
287 FreeList(spec.templateArgs, FreeTemplateArgument);
288 spec.templateArgs = null;
291 case extendedSpecifier:
294 FreeExtDecl(spec.extDecl);
301 FreeList(spec.baseSpecs, FreeSpecifier);
302 spec.baseSpecs = null;
306 FreeIdentifier(spec.id);
311 FreeList(spec.list, FreeEnumerator);
316 FreeList(spec.definitions, FreeClassDef);
317 spec.definitions = null;
320 case structSpecifier:
324 FreeIdentifier(spec.id);
329 FreeList(spec.definitions, FreeClassDef);
330 spec.definitions = null;
334 FreeList(spec.baseSpecs, FreeSpecifier);
335 spec.baseSpecs = null;
337 if(spec.extDeclStruct)
339 FreeExtDecl(spec.extDeclStruct);
340 spec.extDeclStruct = null;
344 FreeContext(spec.ctx);
348 case subClassSpecifier:
351 FreeSpecifier(spec._class);
358 public void FreeIdentifier(Identifier id)
361 FreeIdentifier(id.badID);
364 FreeSpecifier(id._class);
368 void FreeTypeName(TypeName typeName)
370 if(typeName.qualifiers)
371 FreeList(typeName.qualifiers, FreeSpecifier);
372 if(typeName.declarator)
373 FreeDeclarator(typeName.declarator);
374 if(typeName.bitCount)
375 FreeExpression(typeName.bitCount);
380 public void FreeExpContents(Expression exp)
382 _FreeExpression(exp, false);
385 public void FreeExpression(Expression exp)
387 _FreeExpression(exp, true);
390 static void _FreeExpression(Expression exp, bool freePointer)
393 char debugExpString[4096];
394 debugExpString[0] = '\0';
395 PrintExpression(exp, debugExpString);
401 FreeExpression(exp._new.size);
402 FreeTypeName(exp._new.typeName);
406 FreeExpression(exp._renew.exp);
407 FreeExpression(exp._renew.size);
408 FreeTypeName(exp._renew.typeName);
415 FreeIdentifier(exp.identifier);
420 FreeInstance(exp.instance);
429 FreeExpression(exp.op.exp1);
431 FreeExpression(exp.op.exp2);
435 FreeList(exp.list, FreeExpression);
441 FreeExpression(exp.index.exp);
443 FreeList(exp.index.index, FreeExpression);
449 FreeExpression(exp.call.exp);
450 if(exp.call.arguments)
451 FreeList(exp.call.arguments, FreeExpression);
457 FreeExpression(exp.member.exp);
458 if(exp.member.member)
459 FreeIdentifier(exp.member.member);
462 FreeTypeName(exp._new.typeName);
465 FreeTypeName(exp._new.typeName);
469 FreeExpression(exp.cast.exp);
470 FreeTypeName(exp.cast.typeName);
475 FreeExpression(exp.cond.cond);
477 FreeList(exp.cond.exp, FreeExpression);
479 FreeExpression(exp.cond.elseExp);
482 case extensionCompoundExp:
485 FreeStatement(exp.compound);
488 case extensionExpressionExp:
491 FreeList(exp.list, FreeExpression);
494 case extensionInitializerExp:
496 if(exp.initializer.typeName)
497 FreeTypeName(exp.initializer.typeName);
498 if(exp.initializer.initializer)
499 FreeInitializer(exp.initializer.initializer);
505 if(exp._classExp.specifiers)
506 FreeList(exp._classExp.specifiers, FreeSpecifier);
507 if(exp._classExp.decl)
508 FreeDeclarator(exp._classExp.decl);
514 FreeIdentifier(exp.db.id);
519 if(exp.call.arguments)
520 FreeList(exp.call.arguments, FreeExpression);
523 FreeExpression(exp.dbopen.ds);
525 FreeExpression(exp.dbopen.name);
529 FreeExpression(exp.vaArg.exp);
530 if(exp.vaArg.typeName)
531 FreeTypeName(exp.vaArg.typeName);
535 FreeList(exp.list, FreeExpression);
539 FreeSpecifier(exp._class);
543 FreeIdentifier(exp.classData.id);
547 FreeIdentifier(exp.identifier);
552 case memberPropertyErrorExp:
553 case memberSymbolErrorExp:
555 FreeExpression(exp.member.exp);
556 if(exp.member.member)
557 FreeIdentifier(exp.member.member);
559 case functionCallErrorExp:
561 FreeExpression(exp.call.exp);
562 if(exp.call.arguments)
563 FreeList(exp.call.arguments, FreeExpression);
565 case dereferenceErrorExp:
566 case unknownErrorExp:
567 case noDebuggerErrorExp:
573 FreeType(exp.expType);
575 FreeType(exp.destType);
580 void FreePointer(Pointer pointer)
583 FreePointer(pointer.pointer);
584 if(pointer.qualifiers)
585 FreeList(pointer.qualifiers, FreeSpecifier);
589 void FreeAttrib(Attrib attr)
592 FreeList(attr.attribs, FreeAttribute);
596 void FreeAttribute(Attribute attr)
600 FreeExpression(attr.exp);
604 void FreeExtDecl(ExtDecl extDecl)
606 if(extDecl.type == extDeclAttrib && extDecl.attr)
607 FreeAttrib(extDecl.attr);
608 else if(extDecl.type == extDeclString)
613 void FreeDeclarator(Declarator decl)
616 FreeDeclarator(decl.declarator);
620 case structDeclarator:
621 if(decl.structDecl.exp)
622 FreeExpression(decl.structDecl.exp);
623 if(decl.structDecl.posExp)
624 FreeExpression(decl.structDecl.posExp);
625 if(decl.structDecl.attrib)
626 FreeAttrib(decl.structDecl.attrib);
628 case identifierDeclarator:
629 FreeIdentifier(decl.identifier);
631 case bracketsDeclarator:
633 case arrayDeclarator:
635 FreeExpression(decl.array.exp);
636 if(decl.array.enumClass)
637 FreeSpecifier(decl.array.enumClass);
639 case functionDeclarator:
640 FreeList(decl.function.parameters, FreeTypeName);
642 case pointerDeclarator:
643 if(decl.pointer.pointer)
644 FreePointer(decl.pointer.pointer);
646 case extendedDeclarator:
647 case extendedDeclaratorEnd:
648 if(decl.extended.extended)
649 FreeExtDecl(decl.extended.extended);
655 void FreePropertyWatch(PropertyWatch watcher)
657 if(watcher.properties)
658 FreeList(watcher.properties, FreeIdentifier);
660 FreeStatement(watcher.compound);
664 void FreeAsmField(AsmField field)
667 FreeExpression(field.expression);
669 FreeIdentifier(field.symbolic);
670 delete field.command;
674 void FreeStatement(Statement stmt)
680 if(stmt.asmStmt.spec)
681 FreeSpecifier(stmt.asmStmt.spec);
682 if(stmt.asmStmt.inputFields)
683 FreeList(stmt.asmStmt.inputFields, FreeAsmField);
684 if(stmt.asmStmt.outputFields)
685 FreeList(stmt.asmStmt.outputFields, FreeAsmField);
686 if(stmt.asmStmt.clobberedFields)
687 FreeList(stmt.asmStmt.clobberedFields, FreeAsmField);
688 delete stmt.asmStmt.statements;
692 if(stmt.labeled.stmt)
693 FreeStatement(stmt.labeled.stmt);
696 if(stmt.caseStmt.exp)
697 FreeExpression(stmt.caseStmt.exp);
698 if(stmt.caseStmt.stmt)
699 FreeStatement(stmt.caseStmt.stmt);
701 case badDeclarationStmt:
703 FreeDeclaration(stmt.decl);
707 if(stmt.compound.declarations)
708 FreeList(stmt.compound.declarations, FreeDeclaration);
709 if(stmt.compound.statements)
710 FreeList(stmt.compound.statements, FreeStatement);
711 if(stmt.compound.context)
713 FreeContext(stmt.compound.context);
714 delete stmt.compound.context;
721 FreeList(stmt.expressions, FreeExpression);
727 FreeList(stmt.ifStmt.exp, FreeExpression);
729 FreeStatement(stmt.ifStmt.stmt);
730 if(stmt.ifStmt.elseStmt)
731 FreeStatement(stmt.ifStmt.elseStmt);
736 if(stmt.switchStmt.exp)
737 FreeList(stmt.switchStmt.exp, FreeExpression);
738 if(stmt.switchStmt.stmt)
739 FreeStatement(stmt.switchStmt.stmt);
744 if(stmt.whileStmt.exp)
745 FreeList(stmt.whileStmt.exp, FreeExpression);
746 if(stmt.whileStmt.stmt)
747 FreeStatement(stmt.whileStmt.stmt);
752 if(stmt.doWhile.stmt)
753 FreeStatement(stmt.doWhile.stmt);
756 FreeList(stmt.doWhile.exp, FreeExpression);
761 if(stmt.forStmt.init)
762 FreeStatement(stmt.forStmt.init);
764 if(stmt.forStmt.check)
765 FreeStatement(stmt.forStmt.check);
767 if(stmt.forStmt.increment)
768 FreeList(stmt.forStmt.increment, FreeExpression);
769 if(stmt.forStmt.stmt)
770 FreeStatement(stmt.forStmt.stmt);
775 if(stmt.forEachStmt.id)
776 FreeIdentifier(stmt.forEachStmt.id);
777 if(stmt.forEachStmt.exp)
778 FreeList(stmt.forEachStmt.exp, FreeExpression);
779 if(stmt.forEachStmt.filter)
780 FreeList(stmt.forEachStmt.filter, FreeExpression);
781 if(stmt.forEachStmt.stmt)
782 FreeStatement(stmt.forEachStmt.stmt);
793 FreeList(stmt.expressions, FreeExpression);
796 case fireWatchersStmt:
797 case stopWatchingStmt:
799 if(stmt._watch.watcher)
800 FreeExpression(stmt._watch.watcher);
801 if(stmt._watch.object)
802 FreeExpression(stmt._watch.object);
803 if(stmt._watch.watches)
804 FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? (void *)FreePropertyWatch : (void *)FreeIdentifier);
811 void FreeInitializer(Initializer initializer)
813 switch(initializer.type)
815 case listInitializer:
816 FreeList(initializer.list, FreeInitializer);
820 FreeExpression(initializer.exp);
824 FreeIdentifier(initializer.id);
828 void FreeInitDeclarator(InitDeclarator decl)
831 FreeDeclarator(decl.declarator);
833 FreeInitializer(decl.initializer);
837 void FreeDeclaration(Declaration decl)
839 if(decl.symbol && !decl.symbol.type)
841 //FreeSymbol(decl.symbol);
845 case structDeclaration:
848 FreeList(decl.specifiers, FreeSpecifier);
850 FreeList(decl.declarators, FreeDeclarator);
852 FreeSpecifier(decl.extStorage);
855 case initDeclaration:
858 FreeList(decl.specifiers, FreeSpecifier);
860 FreeList(decl.declarators, FreeInitDeclarator);
863 case instDeclaration:
865 FreeInstance(decl.inst);
867 case defineDeclaration:
870 FreeExpression(decl.exp);
872 FreeIdentifier(decl.id);
879 void FreeFunction(FunctionDefinition func)
882 FreeStatement(func.body);
884 FreeDeclarator(func.declarator);
886 FreeList(func.specifiers, FreeSpecifier);
887 if(func.declarations)
888 FreeList(func.declarations, FreeDeclaration);
896 void FreeMemberInit(MemberInit init)
899 FreeInitializer(init.initializer);
901 FreeList(init.identifiers, FreeIdentifier);
905 void FreeMembersInit(MembersInit init)
907 if(init.type == dataMembersInit && init.dataMembers)
908 FreeList(init.dataMembers, FreeMemberInit);
910 if(init.type == methodMembersInit && init.function)
912 FreeClassFunction(init.function);
917 public void FreeInstance(Instantiation inst)
921 FreeList(inst.members, FreeMembersInit);
925 FreeExpression(inst.exp);
929 Symbol classSym = FindClass(inst._class.name);
930 Class _class = classSym ? classSym.registered : null;
933 if(_class.type == normalClass)
935 Instance instance = (Instance)inst.data;
938 else if(_class.type == noHeadClass)
940 if(_class.Destructor)
941 _class.Destructor((Instance)inst.data);
944 else if(_class.type == structClass)
951 Instance instance = (Instance)inst.data;
957 FreeSpecifier(inst._class);
965 public void FreeClassFunction(ClassFunction func)
968 if(func.declarator && func.declarator.symbol)
970 //FreeSymbol(func.declarator.symbol);
977 FreeStatement(func.body);
979 FreeDeclarator(func.declarator);
981 FreeList(func.specifiers, FreeSpecifier);
982 if(func.declarations)
983 FreeList(func.declarations, FreeDeclaration);
985 func.attached.Free(null);
990 void FreeProperty(PropertyDef def)
993 FreeList(def.specifiers, FreeSpecifier);
995 FreeDeclarator(def.declarator);
997 FreeIdentifier(def.id);
999 FreeStatement(def.getStmt);
1001 FreeStatement(def.setStmt);
1003 FreeStatement(def.issetStmt);
1005 FreeExpression(def.category);
1009 FreeFunction(def.getFunction);
1011 FreeFunction(def.setFunction);
1015 // FreeSymbol(def.symbol);
1021 void FreeClassDef(ClassDef def)
1025 case declarationClassDef:
1027 FreeDeclaration(def.decl);
1029 case defaultPropertiesClassDef:
1031 FreeList(def.defProperties, FreeMemberInit);
1034 case functionClassDef:
1036 FreeClassFunction(def.function);
1038 case propertyClassDef:
1040 FreeProperty(def.propertyDef);
1042 case classPropertyClassDef:
1044 FreeProperty(def.propertyDef);
1046 case accessOverrideClassDef:
1048 case classDataClassDef:
1051 FreeDeclaration(def.decl);
1054 case classDesignerClassDef:
1056 delete def.designer;
1059 case classFixedClassDef:
1061 case classNoExpansionClassDef:
1063 case classPropertyValueClassDef:
1065 FreeIdentifier(def.id);
1067 FreeInitializer(def.initializer);
1069 case designerDefaultPropertyClassDef:
1071 if(def.defaultProperty)
1072 FreeIdentifier(def.defaultProperty);
1075 case memberAccessClassDef:
1077 case propertyWatchClassDef:
1079 if(def.propertyWatch)
1080 FreePropertyWatch(def.propertyWatch);
1087 void FreeClass(ClassDefinition _class)
1089 if(_class.definitions)
1090 FreeList(_class.definitions, FreeClassDef);
1092 FreeSpecifier(_class._class);
1093 if(_class.baseSpecs)
1094 FreeList(_class.baseSpecs, FreeSpecifier);
1099 void FreeDBIndexItem(DBIndexItem item)
1102 FreeIdentifier(item.id);
1106 void FreeDBTableEntry(DBTableEntry entry)
1109 FreeIdentifier(entry.id);
1114 FreeTypeName(entry.dataType);
1120 FreeList(entry.items, FreeDBIndexItem);
1126 void FreeDBTable(DBTableDef table)
1128 if(table.definitions)
1129 FreeList(table.definitions, FreeDBTableEntry);
1131 FreeIdentifier(table.symbol);*/
1137 void FreeExternal(External external)
1139 switch(external.type)
1141 case functionExternal:
1142 if(external.function)
1143 FreeFunction(external.function);
1145 case declarationExternal:
1146 if(external.declaration)
1147 FreeDeclaration(external.declaration);
1151 FreeClass(external._class);
1153 case importExternal:
1154 delete external.importString;
1156 case nameSpaceExternal:
1157 FreeIdentifier(external.id);
1159 case dbtableExternal:
1161 FreeDBTable(external.table);
1167 public void FreeASTTree(OldList ast)
1172 while((external = ast.first))
1174 ast.Remove(external);
1175 FreeExternal(external);
1181 static void FreeDataMember(DataMember parentMember)
1183 DataMember dataMember;
1185 for(dataMember = parentMember.members.first; dataMember; dataMember = dataMember.next)
1187 if(dataMember.type == structMember || dataMember.type == unionMember)
1188 FreeDataMember(dataMember);
1190 if(dataMember.dataType)
1192 FreeType(dataMember.dataType);
1193 dataMember.dataType = null;
1198 static void FreeClassProperties(ClassProperty classProp)
1200 if(classProp.left) FreeClassProperties(classProp.left);
1201 if(classProp.right) FreeClassProperties(classProp.right);
1202 if(classProp.dataType)
1204 FreeType(classProp.dataType);
1205 classProp.dataType = null;
1209 void FreeModuleData(Module module)
1212 GlobalFunction function;
1215 for(_class = module.classes.first; _class; _class = _class.next)
1217 DataMember dataMember;
1219 ClassTemplateParameter param;
1223 FreeType(_class.dataType);
1224 _class.dataType = null;
1226 for(dataMember = _class.membersAndProperties.first; dataMember; dataMember = dataMember.next)
1228 if(dataMember.isProperty)
1230 Property prop = (Property)dataMember;
1233 FreeSymbol(prop.symbol);
1238 if(dataMember.type == structMember || dataMember.type == unionMember)
1239 FreeDataMember(dataMember);
1241 if(dataMember.dataType)
1243 FreeType(dataMember.dataType);
1244 dataMember.dataType = null;
1247 for(dataMember = _class.conversions.first; dataMember; dataMember = dataMember.next)
1249 Property prop = (Property) dataMember;
1252 FreeSymbol(prop.symbol);
1256 FreeType(prop.dataType);
1257 prop.dataType = null;
1260 if(_class.classProperties.first)
1261 FreeClassProperties((ClassProperty)_class.classProperties.first);
1262 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1266 FreeType(method.dataType);
1267 method.dataType = null;
1272 FreeSymbol(method.symbol);
1275 for(param = _class.templateParams.first; param; param = param.next)
1279 FreeTemplateParameter(param.param);
1285 for(function = module.functions.first; function; function = function.next)
1287 if(function.dataType)
1288 FreeType(function.dataType);
1290 FreeSymbol(function.symbol);
1293 // Free the extra module instance on closing the last code editor using it
1296 MapIterator <String, List<Module> > mapIt { map = loadedModules };
1299 List<Module> list = mapIt.data;
1300 Iterator<Module> it { list };
1304 if(it.data == module)
1306 list.Remove(it.pointer);
1315 // Unload the initial module that we loaded for safe sharing
1316 Module mod = list[0];
1317 list.Remove(list.GetFirst());
1318 loadedModules.Remove(mapIt.pointer);
1320 eModule_Unload(__thisModule.application, mod);
1328 public void FreeTypeData(Module privateModule)
1331 for(m = privateModule.application.allModules.first; m; m = m.next)
1335 FreeModuleData(privateModule);