Index: TODO =================================================================== diff -u -race51b03d7e2b835c6867943f49c6ad5fa4c1b65 -re3487a745ff8d03bff82959c8fb0852e9ae23b36 --- TODO (.../TODO) (revision ace51b03d7e2b835c6867943f49c6ad5fa4c1b65) +++ TODO (.../TODO) (revision e3487a745ff8d03bff82959c8fb0852e9ae23b36) @@ -3134,8 +3134,43 @@ * deactivated CHECK_ACTIVATION_COUNTS oer default * tested refcounts with Tcl 8.6b2, found bug in Tcl and submitted patch to sourceforge +============================================================= +Tcl 8.6b2 has a memory leak when re-bytecompiling procs. The cleanup-section in function TclProcCompileProc() (in file tclProc.c) iterates over "old" compiledLocals and frees it blindly (see below: ckfree(toFree)). However, the resolveInfo can contain data, and might point to to a deleteProc. i discovered the issue when using resolvers. The cleanup is handled correctly in TclProcCleanupProc() and in a similar way in InitResolvedLocals(). To ease maintenance one should factor out a common small c-function to handle the cleanup of compiled locals. The issue does not exist in Tcl 8.5.*. The following patch fixes the issue, and runs clean with valgrind. +-gustaf neumann +PS: i have submitted the bugreport already yesterday, but it did not show up so far. Maybe, there is something broken at sourceforge, so i try again. I hope, this will not generate a duplicate entry. +--- generic/tclProc.c-orig 2011-07-31 18:16:22.000000000 +0200 ++++ generic/tclProc.c 2011-07-31 18:17:05.000000000 +0200 +@@ -2063,6 +2063,15 @@ + CompiledLocal *toFree = clPtr; + + clPtr = clPtr->nextPtr; ++ ++ if (toFree->resolveInfo) { ++ if (toFree->resolveInfo->deleteProc) { ++ toFree->resolveInfo->deleteProc(toFree->resolveInfo); ++ } else { ++ ckfree(toFree->resolveInfo); ++ } ++ } ++ + ckfree(toFree); + } + procPtr->numCompiledLocals = procPtr->numArgs; +============================================================= + +- nsf.c: + * fixed a bug in "info parameter list|... name" when the named + parameter is not found (returns now empty, before, it was + returing the full list). + * added flag "-nocomplain" to nsf::var::unset +- nx.tcl + * added "delete variable" analogous to "delete attribute" + * unset instance variable for object-level "delete attribute" + * extended regression test + + TODO: - zzz why is the method recompiled for /tmp/sp.tcl ? debug output with VAR_RESOLVER_TRACE @@ -3167,8 +3202,8 @@ - strange refcounting bug in 8.6b2 bug-is-86.tcl where 2 refcounted items are not freed (value:class, - issued from nx.tcl around line 120). Compile for more - info with DEBUG86B2 + issued from nx.tcl around line 120). Compile with DEBUG86B2 + for more info ================================================= # -*- Tcl -*- package req nx @@ -3219,7 +3254,6 @@ - fix mem_count on slottest.test (currently 4 / 0) - fix mem_count on xocomm.test (currently 26 / 26) - - add "delete variable" analogous to "delete attribute" - interface of "variable" and "attribute": * add switch -array for "variable"? * should we switch from "-class" to "-slotclass"?