summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclExecute.c8
-rw-r--r--generic/tclListObj.c17
-rw-r--r--generic/tclStrToD.c12
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);
}