[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