Hi,

I've found a memory leak in the compiler: there are extra INC_(SAVE/RESTORE)_POINTER
in compile_block and _gst_make_constant that create a leak.

Once the object is allocated and protected in a context (ie created by save_pointer) once leaving the function they should be either protected or added in a protected object
otherwise they could be GCed

The patch remove those extra INC_(SAVE/RESTORE)_POINTER protection

Gwen


>From 6901cd09585043e5c6fb33c08ef2db2a8e377fe4 Mon Sep 17 00:00:00 2001
From: Gwenael Casaccio <mrg...@gmail.com>
Date: Tue, 16 Jul 2013 08:50:32 +0200
Subject: [PATCH] Remove INC_SAVE_POINTER in _gst_make_constant and in
 compile_block

All the Smalltalk objects created in those methods can be GCed while
leaving the method (after calling INC_RESTORE_POINTER)
---
 ChangeLog     |  5 +++++
 libgst/comp.c | 15 ---------------
 2 files changed, 5 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3c2a4f5..c7ef8bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-16  Gwenael Casaccio <gwenael.casac...@gmail.com>
+
+        * libgst/comp.c: Fix an issue with extra INC_SAVE_POINTER in 
+        _gst_make_constant and compile_block.
+
 2013-07-01  Gwenael Casaccio <gwenael.casac...@gmail.com>
 
         * kernel/DirPackage.st: Return the loaded package.
diff --git a/libgst/comp.c b/libgst/comp.c
index 10330e1..b786b04 100644
--- a/libgst/comp.c
+++ b/libgst/comp.c
@@ -1066,7 +1066,6 @@ compile_block (tree_node blockExpr)
   int stack_depth;
   OOP blockClosureOOP, blockOOP;
   gst_compiled_block block;
-  inc_ptr incPtr;
 
   current_bytecodes = _gst_save_bytecode_array ();
 
@@ -1095,10 +1094,6 @@ compile_block (tree_node blockExpr)
 
   _gst_restore_bytecode_array (current_bytecodes);
 
-  /* Always allocate objects starting from the deepest one! (that is,
-     subtle bugs arise if make_block triggers a GC, because
-     the pointer in the closure might be no longer valid!) */
-  incPtr = INC_SAVE_POINTER ();
   blockOOP = make_block (_gst_get_arg_count (), _gst_get_temp_count (),
 			 blockByteCodes, stack_depth);
   INC_ADD_OOP (blockOOP);
@@ -1123,8 +1118,6 @@ compile_block (tree_node blockExpr)
       _gst_compile_byte (PUSH_LIT_CONSTANT, add_literal (blockOOP));
       _gst_compile_byte (MAKE_DIRTY_BLOCK, 0);
     }
-
-  INC_RESTORE_POINTER (incPtr);
 }
 
 
@@ -2076,7 +2069,6 @@ _gst_make_constant_oop (tree_node constExpr)
   tree_node subexpr;
   int len, i;
   OOP resultOOP, elementOOP;
-  inc_ptr incPtr;
   byte_object bo;
   gst_object result;
 
@@ -2092,8 +2084,6 @@ _gst_make_constant_oop (tree_node constExpr)
       for (len = 0, subexpr = constExpr; subexpr;
 	   len++, subexpr = subexpr->v_list.next);
 
-      incPtr = INC_SAVE_POINTER ();
-
       /* this might be an uninitialized form of array creation for
          speed; but not now -- with the array temporarily part of the
          root set it must be completely initialized (sigh).  */
@@ -2108,7 +2098,6 @@ _gst_make_constant_oop (tree_node constExpr)
 	  result->data[i] = elementOOP;
 	}
       MAKE_OOP_READONLY (resultOOP, true);
-      INC_RESTORE_POINTER (incPtr);
       return (resultOOP);
     }
 
@@ -2146,7 +2135,6 @@ _gst_make_constant_oop (tree_node constExpr)
 	gst_deferred_variable_binding dvb;
 	tree_node varNode = constExpr->v_const.val.aVal;
 
-        incPtr = INC_SAVE_POINTER ();
         dvb = (gst_deferred_variable_binding)
 	  instantiate (_gst_deferred_variable_binding_class, &resultOOP);
         INC_ADD_OOP (resultOOP);
@@ -2169,7 +2157,6 @@ _gst_make_constant_oop (tree_node constExpr)
 	      array->data[i] = _gst_intern_string (varNode->v_list.name);
 	  }
 
-        INC_RESTORE_POINTER (incPtr);
         return (resultOOP);
       }
 
@@ -2192,7 +2179,6 @@ _gst_make_constant_oop (tree_node constExpr)
       for (len = 0, subexpr = constExpr->v_const.val.aVal; subexpr;
 	   len++, subexpr = subexpr->v_list.next);
 
-      incPtr = INC_SAVE_POINTER ();
       result = instantiate_with (_gst_array_class, len, &resultOOP);
       INC_ADD_OOP (resultOOP);
 
@@ -2205,7 +2191,6 @@ _gst_make_constant_oop (tree_node constExpr)
 	}
 
       MAKE_OOP_READONLY (resultOOP, true);
-      INC_RESTORE_POINTER (incPtr);
       return (resultOOP);
     }
 
-- 
1.8.1.2

_______________________________________________
help-smalltalk mailing list
help-smalltalk@gnu.org
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to