diff options
-rw-r--r-- | generic/tclExecute.c | 8 | ||||
-rw-r--r-- | generic/tclListObj.c | 17 | ||||
-rw-r--r-- | generic/tclStrToD.c | 12 |
3 files changed, 27 insertions, 10 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index c244b08..466922f 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -511,8 +511,8 @@ VarHashCreateVar( *(ptrPtr) = (ClientData) \ (&((objPtr)->internalRep.doubleValue)), TCL_OK) : \ ((((objPtr)->typePtr == NULL) && ((objPtr)->bytes == NULL)) || \ - (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ - ? TCL_ERROR : \ + (((objPtr)->bytes != NULL) && ((objPtr)->length == 0)) || \ + ((objPtr)->typePtr == &tclDictType)) ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) #else /* !TCL_WIDE_INT_IS_LONG */ #define GetNumberFromObj(interp, objPtr, ptrPtr, tPtr) \ @@ -531,8 +531,8 @@ VarHashCreateVar( *(ptrPtr) = (ClientData) \ (&((objPtr)->internalRep.doubleValue)), TCL_OK) : \ ((((objPtr)->typePtr == NULL) && ((objPtr)->bytes == NULL)) || \ - (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ - ? TCL_ERROR : \ + (((objPtr)->bytes != NULL) && ((objPtr)->length == 0)) || \ + ((objPtr)->typePtr == &tclDictType)) ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) #endif /* TCL_WIDE_INT_IS_LONG */ 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. diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c index 6da6df3..ed2e80f 100644 --- a/generic/tclStrToD.c +++ b/generic/tclStrToD.c @@ -546,6 +546,18 @@ TclParseNumber( */ if (bytes == NULL) { + if (objPtr->typePtr == &tclDictType) { + /* A dict can never be a (single) number */ + return TCL_ERROR; + } + if (objPtr->typePtr == &tclListType) { + int length; + /* A list can only be a (single) number if its length == 1 */ + TclListObjLength(NULL, objPtr, &length); + if (length != 1) { + return TCL_ERROR; + } + } bytes = TclGetString(objPtr); } |