From dfa5329058b763cbe42687ceba9095b5b13c5c2a Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 28 Feb 2002 00:53:32 +0000 Subject: * generic/tclMain.c (Tcl_Main,StdinProc): Corrected some reference count management errors on the interactive commandPtr Tcl_Obj found by Purify. Thanks to Jeff Hobbs for the report and assistance. --- ChangeLog | 6 ++++++ generic/tclMain.c | 27 ++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b24bcc2..23517ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2002-02-27 Don Porter + + * generic/tclMain.c (Tcl_Main,StdinProc): Corrected some reference + count management errors on the interactive command Tcl_Obj found by + Purify. Thanks to Jeff Hobbs for the report and assistance. + 2002-02-27 Jeff Hobbs * generic/tclBasic.c (Tcl_EvalTokensStandard): corrected mem leak diff --git a/generic/tclMain.c b/generic/tclMain.c index 53dc064..4bc67b6 100644 --- a/generic/tclMain.c +++ b/generic/tclMain.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: tclMain.c,v 1.17 2002/01/25 20:40:55 dgp Exp $ + * RCS: @(#) $Id: tclMain.c,v 1.18 2002/02/28 00:53:32 dgp Exp $ */ #include "tcl.h" @@ -353,6 +353,11 @@ Tcl_Main(argc, argv, appInitProc) break; } } + if (Tcl_IsShared(commandPtr)) { + Tcl_DecrRefCount(commandPtr); + commandPtr = Tcl_DuplicateObj(commandPtr); + Tcl_IncrRefCount(commandPtr); + } length = Tcl_GetsObj(inChannel, commandPtr); if (length < 0) { if (Tcl_InputBlocked(inChannel)) { @@ -380,6 +385,11 @@ Tcl_Main(argc, argv, appInitProc) * Add the newline removed by Tcl_GetsObj back to the string. */ + if (Tcl_IsShared(commandPtr)) { + Tcl_DecrRefCount(commandPtr); + commandPtr = Tcl_DuplicateObj(commandPtr); + Tcl_IncrRefCount(commandPtr); + } Tcl_AppendToObj(commandPtr, "\n", 1); if (!TclObjCommandComplete(commandPtr)) { prompt = PROMPT_CONTINUE; @@ -401,11 +411,13 @@ Tcl_Main(argc, argv, appInitProc) } } else if (tty) { resultPtr = Tcl_GetObjResult(interp); + Tcl_IncrRefCount(resultPtr); Tcl_GetStringFromObj(resultPtr, &length); if ((length > 0) && outChannel) { Tcl_WriteObj(outChannel, resultPtr); Tcl_WriteChars(outChannel, "\n", 1); } + Tcl_DecrRefCount(resultPtr); } if (mainLoopProc != NULL) { @@ -446,6 +458,7 @@ Tcl_Main(argc, argv, appInitProc) Tcl_LinkVar(interp, "tcl_interactive", (char *) &tty, TCL_LINK_BOOLEAN); prompt = isPtr->prompt; + commandPtr = isPtr->commandPtr; if (isPtr->input != (Tcl_Channel) NULL) { Tcl_DeleteChannelHandler(isPtr->input, StdinProc, (ClientData) isPtr); @@ -573,6 +586,11 @@ StdinProc(clientData, mask) Tcl_Interp *interp = isPtr->interp; int code, length; + if (Tcl_IsShared(commandPtr)) { + Tcl_DecrRefCount(commandPtr); + commandPtr = Tcl_DuplicateObj(commandPtr); + Tcl_IncrRefCount(commandPtr); + } length = Tcl_GetsObj(chan, commandPtr); if (length < 0) { if (Tcl_InputBlocked(chan)) { @@ -590,6 +608,11 @@ StdinProc(clientData, mask) return; } + if (Tcl_IsShared(commandPtr)) { + Tcl_DecrRefCount(commandPtr); + commandPtr = Tcl_DuplicateObj(commandPtr); + Tcl_IncrRefCount(commandPtr); + } Tcl_AppendToObj(commandPtr, "\n", 1); if (!TclObjCommandComplete(commandPtr)) { isPtr->prompt = PROMPT_CONTINUE; @@ -624,11 +647,13 @@ StdinProc(clientData, mask) } else if (isPtr->tty) { Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); Tcl_Channel outChannel = Tcl_GetStdChannel(TCL_STDOUT); + Tcl_IncrRefCount(resultPtr); Tcl_GetStringFromObj(resultPtr, &length); if ((length >0) && (outChannel != (Tcl_Channel) NULL)) { Tcl_WriteObj(outChannel, resultPtr); Tcl_WriteChars(outChannel, "\n", 1); } + Tcl_DecrRefCount(resultPtr); } /* -- cgit v0.12