[svn:parrot] r39483 - trunk/compilers/imcc

chromatic at svn.parrot.org chromatic at svn.parrot.org
Tue Jun 9 22:52:11 UTC 2009


Author: chromatic
Date: Tue Jun  9 22:52:10 2009
New Revision: 39483
URL: https://trac.parrot.org/parrot/changeset/39483

Log:
[IMCC] Plugged a memory leak of macro names used in PIR programs (in
certain cases).

Modified:
   trunk/compilers/imcc/imcc.l
   trunk/compilers/imcc/imclexer.c

Modified: trunk/compilers/imcc/imcc.l
==============================================================================
--- trunk/compilers/imcc/imcc.l	Tue Jun  9 22:26:30 2009	(r39482)
+++ trunk/compilers/imcc/imcc.l	Tue Jun  9 22:52:10 2009	(r39483)
@@ -773,10 +773,12 @@
 
     if (IMCC_INFO(interp)->frames) {
         tmp->s.pasm_file = IMCC_INFO(interp)->frames->s.pasm_file;
+
         if (IMCC_INFO(interp)->frames->s.file_needs_free)
-            tmp->s.file = str_dup(IMCC_INFO(interp)->frames->s.file);
+            tmp->s.file            = str_dup(IMCC_INFO(interp)->frames->s.file);
         else
-            tmp->s.file = IMCC_INFO(interp)->frames->s.file;
+            tmp->s.file            = IMCC_INFO(interp)->frames->s.file;
+
         tmp->s.file_needs_free = IMCC_INFO(interp)->frames->s.file_needs_free;
     }
 
@@ -1138,8 +1140,12 @@
         frame->is_macro = 1;
 
         /* remember macro name for error reporting
-        RT #42384 check that all the .file text is malloced / freed */
-        frame->s.file = str_dup(name);
+         * first free any filename allocated in new_frame() */
+        if (frame->s.file && frame->s.file_needs_free)
+            mem_sys_free(frame->s.file);
+
+        /* RT #42384 check that all the .file text is malloced / freed */
+        frame->s.file            = str_dup(name);
         frame->s.file_needs_free = 1;
 
         /* whitespace can be safely ignored */
@@ -1231,10 +1237,10 @@
         IMCC_fataly(interp, EXCEPTION_EXTERNAL_ERROR, strerror(errno));
 
     mem_sys_free(s);
-    frame->s.file   = file_name;
+    frame->s.file            = file_name;
     frame->s.file_needs_free = 0;
-    frame->s.handle = file;
-    ext             = strrchr(file_name, '.');
+    frame->s.handle          = file;
+    ext                      = strrchr(file_name, '.');
 
     if (ext) {
         if (STREQ(ext, ".pasm")) {

Modified: trunk/compilers/imcc/imclexer.c
==============================================================================
--- trunk/compilers/imcc/imclexer.c	Tue Jun  9 22:26:30 2009	(r39482)
+++ trunk/compilers/imcc/imclexer.c	Tue Jun  9 22:52:10 2009	(r39483)
@@ -5186,10 +5186,12 @@
 
     if (IMCC_INFO(interp)->frames) {
         tmp->s.pasm_file = IMCC_INFO(interp)->frames->s.pasm_file;
+
         if (IMCC_INFO(interp)->frames->s.file_needs_free)
-            tmp->s.file = str_dup(IMCC_INFO(interp)->frames->s.file);
+            tmp->s.file            = str_dup(IMCC_INFO(interp)->frames->s.file);
         else
-            tmp->s.file = IMCC_INFO(interp)->frames->s.file;
+            tmp->s.file            = IMCC_INFO(interp)->frames->s.file;
+
         tmp->s.file_needs_free = IMCC_INFO(interp)->frames->s.file_needs_free;
     }
 
@@ -5551,8 +5553,12 @@
         frame->is_macro = 1;
 
         /* remember macro name for error reporting
-        RT #42384 check that all the .file text is malloced / freed */
-        frame->s.file = str_dup(name);
+         * first free any filename allocated in new_frame() */
+        if (frame->s.file && frame->s.file_needs_free)
+            mem_sys_free(frame->s.file);
+
+        /* RT #42384 check that all the .file text is malloced / freed */
+        frame->s.file            = str_dup(name);
         frame->s.file_needs_free = 1;
 
         /* whitespace can be safely ignored */
@@ -5644,10 +5650,10 @@
         IMCC_fataly(interp, EXCEPTION_EXTERNAL_ERROR, strerror(errno));
 
     mem_sys_free(s);
-    frame->s.file   = file_name;
+    frame->s.file            = file_name;
     frame->s.file_needs_free = 0;
-    frame->s.handle = file;
-    ext             = strrchr(file_name, '.');
+    frame->s.handle          = file;
+    ext                      = strrchr(file_name, '.');
 
     if (ext) {
         if (STREQ(ext, ".pasm")) {


More information about the parrot-commits mailing list