summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2005-07-29 14:47:28 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2005-07-29 14:47:28 (GMT)
commitc00183e381bfa2fdf0f2d8537106526e0d2c67fb (patch)
tree63bf1a521ed230738277f4048802a97dd9c874ac /generic
parent89ebb58a5ad4882789b8b99380e0ceaa9f6ba58a (diff)
downloadtcl-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.c60
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));
}
}
}