diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2005-07-29 14:47:28 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2005-07-29 14:47:28 (GMT) |
commit | c00183e381bfa2fdf0f2d8537106526e0d2c67fb (patch) | |
tree | 63bf1a521ed230738277f4048802a97dd9c874ac /generic | |
parent | 89ebb58a5ad4882789b8b99380e0ceaa9f6ba58a (diff) | |
download | tcl-c00183e381bfa2fdf0f2d8537106526e0d2c67fb.zip tcl-c00183e381bfa2fdf0f2d8537106526e0d2c67fb.tar.gz tcl-c00183e381bfa2fdf0f2d8537106526e0d2c67fb.tar.bz2 |
Take care with globals that have an entry in the var table but "don't exist"
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclCmdIL.c | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 21aebe3..558f206 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -16,7 +16,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdIL.c,v 1.78 2005/07/17 21:17:30 dkf Exp $ + * RCS: @(#) $Id: tclCmdIL.c,v 1.79 2005/07/29 14:47:46 dkf Exp $ */ #include "tclInt.h" @@ -1245,8 +1245,11 @@ InfoGlobalsCmd(dummy, interp, objc, objv) if (pattern != NULL && TclMatchIsTrivial(pattern)) { entryPtr = Tcl_FindHashEntry(&globalNsPtr->varTable, pattern); if (entryPtr != NULL) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(pattern, -1)); + varPtr = (Var *) Tcl_GetHashValue(entryPtr); + if (!TclIsVarUndefined(varPtr)) { + Tcl_ListObjAppendElement(interp, listPtr, + Tcl_NewStringObj(pattern, -1)); + } } } else { for (entryPtr = Tcl_FirstHashEntry(&globalNsPtr->varTable, &search); @@ -1585,26 +1588,45 @@ AppendLocals(interp, listPtr, pattern, includeLinks) localPtr = localPtr->nextPtr; } - if (localVarTablePtr != NULL) { - if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { - if (Tcl_FindHashEntry(localVarTablePtr, pattern)) { + /* + * Do nothing if no local variables. + */ + + if (localVarTablePtr == NULL) { + return; + } + + /* + * Check for the simple and fast case. + */ + + if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { + entryPtr = Tcl_FindHashEntry(localVarTablePtr, pattern); + if (entryPtr != NULL) { + varPtr = (Var *) Tcl_GetHashValue(entryPtr); + if (!TclIsVarUndefined(varPtr) + && (includeLinks || !TclIsVarLink(varPtr))) { Tcl_ListObjAppendElement(interp, listPtr, Tcl_NewStringObj(pattern,-1)); } - return; } - for (entryPtr = Tcl_FirstHashEntry(localVarTablePtr, &search); - entryPtr != NULL; - entryPtr = Tcl_NextHashEntry(&search)) { - varPtr = (Var *) Tcl_GetHashValue(entryPtr); - if (!TclIsVarUndefined(varPtr) - && (includeLinks || !TclIsVarLink(varPtr))) { - varName = Tcl_GetHashKey(localVarTablePtr, entryPtr); - if ((pattern == NULL) - || Tcl_StringMatch(varName, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(varName, -1)); - } + return; + } + + /* + * Scan over and process all local variables. + */ + + for (entryPtr = Tcl_FirstHashEntry(localVarTablePtr, &search); + entryPtr != NULL; + entryPtr = Tcl_NextHashEntry(&search)) { + varPtr = (Var *) Tcl_GetHashValue(entryPtr); + if (!TclIsVarUndefined(varPtr) + && (includeLinks || !TclIsVarLink(varPtr))) { + varName = Tcl_GetHashKey(localVarTablePtr, entryPtr); + if ((pattern == NULL) || Tcl_StringMatch(varName, pattern)) { + Tcl_ListObjAppendElement(interp, listPtr, + Tcl_NewStringObj(varName, -1)); } } } |