diff options
Diffstat (limited to 'generic/tclListObj.c')
-rw-r--r-- | generic/tclListObj.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 11374cc..e29e547 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -407,6 +407,7 @@ TclListObjCopy( * to be returned. */ { Tcl_Obj *copyPtr; + int length; if (listPtr->typePtr != &tclListType) { if (SetListFromAny(interp, listPtr) != TCL_OK) { @@ -415,8 +416,11 @@ TclListObjCopy( } TclNewObj(copyPtr); - TclInvalidateStringRep(copyPtr); - DupListInternalRep(listPtr, copyPtr); + TclListObjLength(NULL, listPtr, &length); + if (length > 0) { + TclInvalidateStringRep(copyPtr); + DupListInternalRep(listPtr, copyPtr); + } return copyPtr; } @@ -465,15 +469,15 @@ Tcl_ListObjGetElements( if (listPtr->typePtr != &tclListType) { int result; + result = SetListFromAny(interp, listPtr); + if (result != TCL_OK) { + return result; + } if (listPtr->bytes == &tclEmptyString) { *objcPtr = 0; *objvPtr = NULL; return TCL_OK; } - result = SetListFromAny(interp, listPtr); - if (result != TCL_OK) { - return result; - } } listRepPtr = ListRepPtr(listPtr); *objcPtr = listRepPtr->elemCount; @@ -1871,6 +1875,7 @@ SetListFromAny( int estCount, length; const char *limit, *nextElem = TclGetStringFromObj(objPtr, &length); + if (length == 0) return TCL_OK; /* * Allocate enough space to hold a (Tcl_Obj *) for each * (possible) list element. |