summaryrefslogtreecommitdiffstats
path: root/generic/tclEnsemble.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 23:16:31 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 23:16:31 (GMT)
commit71b0ad990caaf6a297049da2c63821a4e29c57ac (patch)
treef27faff96ed68e42d4c00da3a522f9eef06a2528 /generic/tclEnsemble.c
parentda196c33450ded41b2370bf956f7d3cd7b081069 (diff)
downloadtcl-71b0ad990caaf6a297049da2c63821a4e29c57ac.zip
tcl-71b0ad990caaf6a297049da2c63821a4e29c57ac.tar.gz
tcl-71b0ad990caaf6a297049da2c63821a4e29c57ac.tar.bz2
Reduce shimmering: If a conclusion can be drawn about the number of list elements, don't get the elements before the list length is checked
Diffstat (limited to 'generic/tclEnsemble.c')
-rw-r--r--generic/tclEnsemble.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index 88b611f..963f1d8 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -562,8 +562,8 @@ TclNamespaceEnsembleCmd(
continue;
}
do {
- if (TclListObjGetElementsM(interp, listObj, &len,
- &listv) != TCL_OK) {
+ if (TclListObjLengthM(interp, listObj, &len
+ ) != TCL_OK) {
Tcl_DictObjDone(&search);
if (patchedDict) {
Tcl_DecrRefCount(patchedDict);
@@ -582,6 +582,14 @@ TclNamespaceEnsembleCmd(
}
goto freeMapAndError;
}
+ if (TclListObjGetElementsM(interp, listObj, &len,
+ &listv) != TCL_OK) {
+ Tcl_DictObjDone(&search);
+ if (patchedDict) {
+ Tcl_DecrRefCount(patchedDict);
+ }
+ goto freeMapAndError;
+ }
cmd = TclGetString(listv[0]);
if (!(cmd[0] == ':' && cmd[1] == ':')) {
Tcl_Obj *newList = Tcl_DuplicateObj(listObj);