]> git.sur5r.net Git - cc65/commitdiff
Fixed a rather large memory leak.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 1 Aug 2011 20:49:59 +0000 (20:49 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 1 Aug 2011 20:49:59 +0000 (20:49 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5102 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/lineinfo.c
src/ld65/lineinfo.h
src/ld65/objdata.c

index 2435563630b243b9c67f92c8d21103ab400e54fd..2ed4f7a33774c5a0d5bbac79667e3ab472e40dbe 100644 (file)
@@ -72,6 +72,15 @@ static CodeRange* NewCodeRange (Segment* Seg, unsigned long Offs, unsigned long
 
 
 
+static void FreeCodeRange (CodeRange* R)
+/* Free a CodeRange structure */
+{
+    /* Just free the memory */
+    xfree (R);
+}
+
+
+
 static LineInfo* NewLineInfo (void)
 /* Create and return a new LineInfo struct with mostly empty fields */
 {
@@ -93,6 +102,30 @@ static LineInfo* NewLineInfo (void)
 
 
 
+void FreeLineInfo (LineInfo* LI)
+/* Free a LineInfo structure. This function will not handle a non empty
+ * Fragments collection, it can only be used to free incomplete line infos.
+ */
+{
+    unsigned I;
+
+    /* Check, check, ... */
+    PRECONDITION (CollCount (&LI->Fragments) == 0);
+
+    /* Free all the code ranges */
+    for (I = 0; I < CollCount (&LI->CodeRanges); ++I) {
+        FreeCodeRange (CollAtUnchecked (&LI->CodeRanges, I));
+    }
+
+    /* Free the collections */
+    DoneCollection (&LI->CodeRanges);
+
+    /* Free the structure itself */
+    xfree (LI);
+}
+
+
+
 LineInfo* GenLineInfo (const FilePos* Pos)
 /* Generate a new (internally used) line info with the given information */
 {
@@ -245,4 +278,4 @@ void RelocLineInfo (Segment* S)
 
 
 
-                                
+
index 569ed797591f48e907d8301d1a9abacb6e54260c..0c92423fc344dc0f891baff4ddebb7f3806c9236 100644 (file)
@@ -97,11 +97,16 @@ struct LineInfo {
 
 
 LineInfo* GenLineInfo (const FilePos* Pos);
-/* Generate a new (internally used) line info  with the given information */
+/* Generate a new (internally used) line info with the given information */
 
 LineInfo* ReadLineInfo (FILE* F, struct ObjData* O);
 /* Read a line info from a file and return it */
 
+void FreeLineInfo (LineInfo* LI);
+/* Free a LineInfo structure. This function will not handle a non empty
+ * Fragments collection, it can only be used to free incomplete line infos.
+ */
+
 void ReadLineInfoList (FILE* F, struct ObjData* O, Collection* LineInfos);
 /* Read a list of line infos stored as a list of indices in the object file,
  * make real line infos from them and place them into the passed collection.
index 9d71a3ab92be6d8659c7db88f9db4b10d5d7c27e..fe6850513114fd69996d9db40ff72533575626ca 100644 (file)
@@ -105,14 +105,17 @@ void FreeObjData (ObjData* O)
 
     /* Unused ObjData do only have the string pool, Exports and Imports. */
     for (I = 0; I < CollCount (&O->Exports); ++I) {
-        FreeExport (CollAt (&O->Exports, I));
+        FreeExport (CollAtUnchecked (&O->Exports, I));
     }
     DoneCollection (&O->Exports);
     for (I = 0; I < CollCount (&O->Imports); ++I) {
-        FreeImport (CollAt (&O->Imports, I));
+        FreeImport (CollAtUnchecked (&O->Imports, I));
     }
     DoneCollection (&O->Imports);
     DoneCollection (&O->DbgSyms);
+    for (I = 0; I < CollCount (&O->LineInfos); ++I) {
+        FreeLineInfo (CollAtUnchecked (&O->LineInfos, I));
+    }
     DoneCollection (&O->LineInfos);
     xfree (O->Strings);
     DoneCollection (&O->Assertions);