Compare commits

...
4 Commits
3 changed files with 27 additions and 10 deletions
+4 -4
View File
@@ -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 */
+11 -6
View File
@@ -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.
+12
View File
@@ -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);
}