diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclListObj.c | 39 |
1 files changed, 34 insertions, 5 deletions
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)); |