compiler/libec: Fixed new memory leaks
[sdk] / compiler / libec / src / freeAst.ec
index f23b946..73eee2e 100644 (file)
@@ -27,9 +27,8 @@ public void FreeType(Type type)
          {
             case enumType:
             {
-               NamedLink member, next;
-               if(type.enumName)
-                  delete type.enumName;
+               NamedLink64 member, next;
+               delete type.enumName;
                for(member = type.members.first; member; member = next)
                {
                   next = member.next;
@@ -287,6 +286,11 @@ void FreeSpecifierContents(Specifier spec)
             FreeList(spec.templateArgs, FreeTemplateArgument);
             spec.templateArgs = null;
          }
+         if(spec.nsSpec)
+         {
+            FreeSpecifier(spec.nsSpec);
+            spec.nsSpec = null;
+         }
          break;
       case extendedSpecifier:
          if(spec.extDecl)
@@ -801,7 +805,7 @@ void FreeStatement(Statement stmt)
          if(stmt._watch.object)
             FreeExpression(stmt._watch.object);
          if(stmt._watch.watches)
-            FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? FreePropertyWatch : FreeIdentifier);
+            FreeList(stmt._watch.watches, (stmt.type == watchStmt) ? (void *)FreePropertyWatch : (void *)FreeIdentifier);
          break;
       }
    }
@@ -813,17 +817,15 @@ void FreeInitializer(Initializer initializer)
    switch(initializer.type)
    {
       case listInitializer:
-      {
          FreeList(initializer.list, FreeInitializer);
          break;
-      }
       case expInitializer:
          if(initializer.exp)
             FreeExpression(initializer.exp);
-         if(initializer.id)
-            FreeIdentifier(initializer.id);
          break;
    }
+   if(initializer.id)
+      FreeIdentifier(initializer.id);
    delete initializer;
 }
 
@@ -1138,6 +1140,21 @@ void FreeDBTable(DBTableDef table)
 
 void FreeExternal(External external)
 {
+   TopoEdge e;
+   while((e = external.incoming.first))
+   {
+      e.from.outgoing.Remove((IteratorPointer)e);
+      external.incoming.Remove((IteratorPointer)e);
+      delete e;
+   }
+   while((e = external.outgoing.first))
+   {
+      e.to.incoming.Remove((IteratorPointer)e);
+      external.outgoing.Remove((IteratorPointer)e);
+      if(!e.breakable)
+         e.to.nonBreakableIncoming--;
+      delete e;
+   }
    switch(external.type)
    {
       case functionExternal: