summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--generic/tclDate.c88
-rw-r--r--generic/tclGetDate.y84
-rw-r--r--unix/Makefile.in5
4 files changed, 179 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index cc7b500..b789c5a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2003-05-15 Kevin B. Kenny <kennykb@hippolyta>
+
+ * generic/tclGetDate.y: added further hackery to the yacc
+ * generic/tclDate.c: post-processing to arrange for the
+ * unix/Makefile.in: code to set up exit handlers to free
+ the stacks [Bug 736425].
+
2003-05-15 Jeff Hobbs <jeffh@ActiveState.com>
* doc/socket.n:
diff --git a/generic/tclDate.c b/generic/tclDate.c
index 31576d2..d6f8d45 100644
--- a/generic/tclDate.c
+++ b/generic/tclDate.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclDate.c,v 1.20 2001/10/18 20:20:28 hobbs Exp $
+ * RCS: @(#)
*/
#include "tclInt.h"
@@ -117,6 +117,88 @@ static int TclDatelex _ANSI_ARGS_((void));
int
TclDateparse _ANSI_ARGS_((void));
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateCleanup --
+ *
+ * Clean up allocated memory on process exit.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Frees the block of memory passed in as client data.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+TclDateCleanup( ClientData clientData )
+{
+ ckfree( (char*) clientData );
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateAlloc --
+ *
+ * Special purpose allocator for the two YACC stacks.
+ *
+ * Results:
+ * Returns a pointer to a block of memory.
+ *
+ * Side effects:
+ * Allocates the requested number of bytes, and
+ * sets up to delete the allocated memory on process exit.
+ *
+ * The YACC system is set up to free memory in its stacks only by
+ * abandonment. This procedure sets up to free it explicitly on exit
+ * from Tcl, as when unloading.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char*
+TclDateAlloc( size_t n )
+{
+ char* pointer = ckalloc( n );
+ Tcl_CreateExitHandler( TclDateCleanup, (ClientData) pointer );
+ return pointer;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateRealloc --
+ *
+ * Special purpose allocator for the two YACC stacks.
+ *
+ * Results:
+ * Returns a pointer to a block of memory.
+ *
+ * Side effects:
+ * Allocates the requested number of bytes, and
+ * sets up to delete the allocated memory on process exit.
+ *
+ * The YACC system is set up to free memory in its stacks only by
+ * abandonment. This procedure sets up to free it explicitly on exit
+ * from Tcl, as when unloading.
+ *
+ *----------------------------------------------------------------------
+ */
+static char*
+TclDateRealloc( char* oldPointer, size_t n )
+{
+ char* newPointer;
+ Tcl_DeleteExitHandler( TclDateCleanup, (ClientData) oldPointer );
+ newPointer = ckrealloc( oldPointer, n );
+ Tcl_CreateExitHandler( TclDateCleanup, (ClientData) newPointer );
+ return newPointer;
+}
+
typedef union
#ifdef __cplusplus
YYSTYPE
@@ -1146,11 +1228,11 @@ char * TclDatereds[] =
goto TclDatenewstate;\
}
#define YYRECOVERING() (!!TclDateerrflag)
-#define YYNEW(type) malloc(sizeof(type) * TclDatenewmax)
+#define YYNEW(type) TclDateAlloc(sizeof(type) * TclDatenewmax)
#define YYCOPY(to, from, type) \
(type *) memcpy(to, (char *) from, TclDatemaxdepth * sizeof (type))
#define YYENLARGE( from, type) \
- (type *) realloc((char *) from, TclDatenewmax * sizeof(type))
+ (type *) TclDateRealloc((char *) from, TclDatenewmax * sizeof(type))
#ifndef YYDEBUG
# define YYDEBUG 1 /* make debugging available */
#endif
diff --git a/generic/tclGetDate.y b/generic/tclGetDate.y
index 14b9869..3a7d032 100644
--- a/generic/tclGetDate.y
+++ b/generic/tclGetDate.y
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclGetDate.y,v 1.18 2001/10/18 20:20:28 hobbs Exp $
+ * RCS: @(#) $Id: tclGetDate.y,v 1.19 2003/05/15 21:51:46 kennykb Exp $
*/
%{
@@ -134,6 +134,88 @@ static int yylex _ANSI_ARGS_((void));
int
yyparse _ANSI_ARGS_((void));
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateCleanup --
+ *
+ * Clean up allocated memory on process exit.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Frees the block of memory passed in as client data.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+TclDateCleanup( ClientData clientData )
+{
+ ckfree( (char*) clientData );
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateAlloc --
+ *
+ * Special purpose allocator for the two YACC stacks.
+ *
+ * Results:
+ * Returns a pointer to a block of memory.
+ *
+ * Side effects:
+ * Allocates the requested number of bytes, and
+ * sets up to delete the allocated memory on process exit.
+ *
+ * The YACC system is set up to free memory in its stacks only by
+ * abandonment. This procedure sets up to free it explicitly on exit
+ * from Tcl, as when unloading.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char*
+TclDateAlloc( size_t n )
+{
+ char* pointer = ckalloc( n );
+ Tcl_CreateExitHandler( TclDateCleanup, (ClientData) pointer );
+ return pointer;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDateRealloc --
+ *
+ * Special purpose allocator for the two YACC stacks.
+ *
+ * Results:
+ * Returns a pointer to a block of memory.
+ *
+ * Side effects:
+ * Allocates the requested number of bytes, and
+ * sets up to delete the allocated memory on process exit.
+ *
+ * The YACC system is set up to free memory in its stacks only by
+ * abandonment. This procedure sets up to free it explicitly on exit
+ * from Tcl, as when unloading.
+ *
+ *----------------------------------------------------------------------
+ */
+static char*
+TclDateRealloc( char* oldPointer, size_t n )
+{
+ char* newPointer;
+ Tcl_DeleteExitHandler( TclDateCleanup, (ClientData) oldPointer );
+ newPointer = ckrealloc( oldPointer, n );
+ Tcl_CreateExitHandler( TclDateCleanup, (ClientData) newPointer );
+ return newPointer;
+}
+
%}
%union {
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 8401624..24eabc0 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -5,7 +5,7 @@
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
-# RCS: @(#) $Id: Makefile.in,v 1.125 2003/05/14 19:21:25 das Exp $
+# RCS: @(#) $Id: Makefile.in,v 1.126 2003/05/15 21:51:46 kennykb Exp $
VERSION = @TCL_VERSION@
MAJOR_VERSION = @TCL_MAJOR_VERSION@
@@ -354,6 +354,7 @@ GENERIC_SRCS = \
$(GENERIC_DIR)/tclCompile.c \
$(GENERIC_DIR)/tclDate.c \
$(GENERIC_DIR)/tclDictObj.c \
+ $(GENERIC_DIR)/tclDToA.c \
$(GENERIC_DIR)/tclEncoding.c \
$(GENERIC_DIR)/tclEnv.c \
$(GENERIC_DIR)/tclEvent.c \
@@ -564,6 +565,8 @@ gendate:
-e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \
-e '/TclDatenewstate:/d' -e '/#pragma/d' \
-e '/#include <inttypes.h>/d' -e 's/const /CONST /g' \
+ -e '/#define YYNEW/s/malloc/TclDateAlloc/g' \
+ -e '/#define YYENLARGE/,/realloc/s/realloc/TclDateRealloc/g' \
<y.tab.c >$(GENERIC_DIR)/tclDate.c
rm y.tab.c