diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2008-09-10 13:03:02 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2008-09-10 13:03:02 (GMT) |
commit | eb97dfe76d6d46cf1b3c040b8a907305e5300afe (patch) | |
tree | 505549710d71ed6f9ba0007bf5973534e1f03730 | |
parent | 15f99b3fa80902c78a829d71b3d6159e9769cac1 (diff) | |
download | tcl-eb97dfe76d6d46cf1b3c040b8a907305e5300afe.zip tcl-eb97dfe76d6d46cf1b3c040b8a907305e5300afe.tar.gz tcl-eb97dfe76d6d46cf1b3c040b8a907305e5300afe.tar.bz2 |
Fix efficiency bug detected by Kieran Elby.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclListObj.c | 13 |
2 files changed, 18 insertions, 2 deletions
@@ -1,3 +1,10 @@ +2008-09-10 Donal K. Fellows <dkf@users.sf.net> + + * generic/tclListObj.c (Tcl_ListObjGetElements): Make this list->dict + transformation - encountered when using [foreach] with dicts - not as + expensive as it was before. Spotted by Kieran Elby and reported on + tcl-core. + 2008-09-08 Donal K. Fellows <dkf@users.sf.net> * tests/append.test, appendComp.test, cmdAH.test: Use the powers of diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 7505569..aebaee8 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.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: tclListObj.c,v 1.52 2008/08/23 10:54:24 dkf Exp $ + * RCS: @(#) $Id: tclListObj.c,v 1.53 2008/09/10 13:03:33 dkf Exp $ */ #include "tclInt.h" @@ -428,7 +428,16 @@ Tcl_ListObjGetElements( if (listPtr->typePtr != &tclListType) { int result, length; - (void) TclGetStringFromObj(listPtr, &length); + /* + * Don't get the string version of a dictionary; that transformation + * is not lossy, but is expensive. + */ + + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { *objcPtr = 0; *objvPtr = NULL; |