diff options
author | dgp <dgp@noemail.net> | 2011-05-05 16:35:00 (GMT) |
---|---|---|
committer | dgp <dgp@noemail.net> | 2011-05-05 16:35:00 (GMT) |
commit | 0e167452101823c7961bcd4db968b57723742936 (patch) | |
tree | 6801818ca99f1fd4c859ecd74412c672848d8a7b | |
parent | 27b8fc2b2893db6af259bb789953306b445f532f (diff) | |
download | tcl-0e167452101823c7961bcd4db968b57723742936.zip tcl-0e167452101823c7961bcd4db968b57723742936.tar.gz tcl-0e167452101823c7961bcd4db968b57723742936.tar.bz2 |
Stop generating string rep of dict when converting to list.
FossilOrigin-Name: 746b228680c5817d5515c9ca543aa3219c32ca7d
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | generic/tclListObj.c | 39 |
2 files changed, 39 insertions, 5 deletions
@@ -1,3 +1,8 @@ +2011-05-05 Don Porter <dgp@users.sourceforge.net> + + * generic/tclListObj.c: Stop generating string rep of dict when + converting to list. + 2011-05-03 Don Porter <dgp@users.sourceforge.net> * generic/tclUtil.c: Tighten Tcl_SplitList(). diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 164fa4a..a9c986b 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -589,7 +589,11 @@ Tcl_ListObjAppendElement( if (listPtr->typePtr != &tclListType) { int result, length; - (void) TclGetStringFromObj(listPtr, &length); + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { Tcl_SetListObj(listPtr, 1, &objPtr); return TCL_OK; @@ -700,7 +704,11 @@ Tcl_ListObjIndex( if (listPtr->typePtr != &tclListType) { int result, length; - (void) TclGetStringFromObj(listPtr, &length); + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { *objPtrPtr = NULL; return TCL_OK; @@ -755,7 +763,20 @@ Tcl_ListObjLength( if (listPtr->typePtr != &tclListType) { int result, length; - (void) TclGetStringFromObj(listPtr, &length); + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + /* + * It's tempting to just report 2*length as the list length + * of this dict, but arguably that's false since the max sizes + * for dicts and lists are not the same, so some dicts don't + * actually convert to lists, and it's good to get that error + * back from the SetListFromAny() call below instead of a false + * indication we can treat the value as a list. ([llength $val] + * often used as a "listiness" test) + */ + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { *intPtr = 0; return TCL_OK; @@ -830,7 +851,11 @@ Tcl_ListObjReplace( if (listPtr->typePtr != &tclListType) { int length; - (void) TclGetStringFromObj(listPtr, &length); + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { if (objc) { Tcl_SetListObj(listPtr, objc, NULL); @@ -1526,7 +1551,11 @@ TclListObjSetElement( if (listPtr->typePtr != &tclListType) { int length, result; - (void) TclGetStringFromObj(listPtr, &length); + if (listPtr->typePtr == &tclDictType) { + (void) Tcl_DictObjSize(NULL, listPtr, &length); + } else { + (void) TclGetStringFromObj(listPtr, &length); + } if (!length) { Tcl_SetObjResult(interp, Tcl_NewStringObj("list index out of range", -1)); |