diff options
author | treectrl <treectrl> | 2006-11-10 22:33:41 (GMT) |
---|---|---|
committer | treectrl <treectrl> | 2006-11-10 22:33:41 (GMT) |
commit | ffa291e3aa916cd0859e9a399f02bd26a2dc2d17 (patch) | |
tree | 0d7ba298df75ab8c9640486a1189afccc76f02c2 | |
parent | e24b264f02476d27fec90db4162b339b5021aa31 (diff) | |
download | tktreectrl-ffa291e3aa916cd0859e9a399f02bd26a2dc2d17.zip tktreectrl-ffa291e3aa916cd0859e9a399f02bd26a2dc2d17.tar.gz tktreectrl-ffa291e3aa916cd0859e9a399f02bd26a2dc2d17.tar.bz2 |
Always include tclInt.h to fix compilation under 8.5.
Fixed incorrect duplicating of list objects in PerStateInfo_Undefine.
-rw-r--r-- | generic/tkTreeUtils.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/generic/tkTreeUtils.c b/generic/tkTreeUtils.c index ba172cf..8120b1b 100644 --- a/generic/tkTreeUtils.c +++ b/generic/tkTreeUtils.c @@ -5,10 +5,12 @@ * * Copyright (c) 2002-2006 Tim Baker * - * RCS: @(#) $Id: tkTreeUtils.c,v 1.51 2006/11/06 23:37:23 treectrl Exp $ + * RCS: @(#) $Id: tkTreeUtils.c,v 1.52 2006/11/10 22:33:41 treectrl Exp $ */ #include "tkTreeCtrl.h" +#include "tclInt.h" /* TCL_ALIGN */ + #ifdef WIN32 #include "tkWinInt.h" #endif @@ -17,7 +19,6 @@ #if defined(MAC_OSX_TK) #include <Carbon/Carbon.h> #include "tkMacOSXInt.h" -#include "tclInt.h" static PixPatHandle gPenPat = NULL; #endif @@ -2425,6 +2426,27 @@ PerStateInfo_ObjForState( *---------------------------------------------------------------------- */ +Tcl_Obj * +DuplicateListObj( + Tcl_Obj *objPtr + ) +{ + int objc; + Tcl_Obj **objv; + int result; + + /* + * Comment from TclLsetFlat: + * ... A plain Tcl_DuplicateObj + * will just increase the intrep's refCount without upping the sublists' + * refCount, so that their true shared status cannot be determined from + * their refCount. + */ + + result = Tcl_ListObjGetElements(NULL, objPtr, &objc, &objv); + return Tcl_NewListObj(objc, objv); +} + int PerStateInfo_Undefine( TreeCtrl *tree, /* Widget info. */ PerStateType *typePtr, /* Type-specific functions and values. */ @@ -2448,14 +2470,14 @@ int PerStateInfo_Undefine( pData->stateOff &= ~state; pData->stateOn &= ~state; if (Tcl_IsShared(configObj)) { - configObj = Tcl_DuplicateObj(configObj); + configObj = DuplicateListObj(configObj); Tcl_DecrRefCount(pInfo->obj); Tcl_IncrRefCount(configObj); pInfo->obj = configObj; } Tcl_ListObjIndex(tree->interp, configObj, i * 2 + 1, &listObj); if (Tcl_IsShared(listObj)) { - listObj = Tcl_DuplicateObj(listObj); + listObj = DuplicateListObj(listObj); Tcl_ListObjReplace(tree->interp, configObj, i * 2 + 1, 1, 1, &listObj); } Tcl_ListObjLength(tree->interp, listObj, &numStates); @@ -2477,6 +2499,7 @@ int PerStateInfo_Undefine( } pData = (PerStateData *) (((char *) pData) + typePtr->size); } + return modified; } @@ -5250,8 +5273,9 @@ if (save->objPtr) { else dbwin("DynamicCO_Free free object NULL\n"); #endif - if (save->objPtr) + if (save->objPtr) { Tcl_DecrRefCount(save->objPtr); + } } ckfree((char *) save); } else { @@ -5273,8 +5297,9 @@ if (*objPtrPtr) { else dbwin("DynamicCO_Free free object NULL\n"); #endif - if (*objPtrPtr != NULL) + if (*objPtrPtr != NULL) { Tcl_DecrRefCount(*objPtrPtr); + } } } } |