summaryrefslogtreecommitdiffstats
path: root/generic/tclObj.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-23 17:04:18 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-23 17:04:18 (GMT)
commit826db93d76965d85df64187e05ec05095a6eae56 (patch)
tree9c1ba7619d9438dc5a8dc3a42b12190caa4df453 /generic/tclObj.c
parent52aada907a982dce6c92af04597de68b0e2737ba (diff)
downloadtcl-826db93d76965d85df64187e05ec05095a6eae56.zip
tcl-826db93d76965d85df64187e05ec05095a6eae56.tar.gz
tcl-826db93d76965d85df64187e05ec05095a6eae56.tar.bz2
Internal abstract list, don't let "llength" shimmer any more.
Diffstat (limited to 'generic/tclObj.c')
-rw-r--r--generic/tclObj.c102
1 files changed, 54 insertions, 48 deletions
diff --git a/generic/tclObj.c b/generic/tclObj.c
index 76f1627..5e3f4f1 100644
--- a/generic/tclObj.c
+++ b/generic/tclObj.c
@@ -225,37 +225,43 @@ static int SetCmdNameFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr);
* implementations.
*/
-const Tcl_ObjType tclBooleanType = {
- "boolean", /* name */
+static unsigned long long LengthOne(TCL_UNUSED(Tcl_Obj *)) {return 1;}
+
+const TclObjTypeWithAbstractList tclBooleanType= {
+ {"boolean", /* name */
NULL, /* freeIntRepProc */
NULL, /* dupIntRepProc */
NULL, /* updateStringProc */
TclSetBooleanFromAny, /* setFromAnyProc */
- TCL_OBJTYPE_V0
+ TCL_OBJTYPE_V0_1},
+ LengthOne
};
-const Tcl_ObjType tclDoubleType = {
- "double", /* name */
+const TclObjTypeWithAbstractList tclDoubleType= {
+ {"double", /* name */
NULL, /* freeIntRepProc */
NULL, /* dupIntRepProc */
UpdateStringOfDouble, /* updateStringProc */
SetDoubleFromAny, /* setFromAnyProc */
- TCL_OBJTYPE_V0
+ TCL_OBJTYPE_V0_1},
+ LengthOne
};
-const Tcl_ObjType tclIntType = {
- "int", /* name */
+const TclObjTypeWithAbstractList tclIntType = {
+ {"int", /* name */
NULL, /* freeIntRepProc */
NULL, /* dupIntRepProc */
UpdateStringOfInt, /* updateStringProc */
SetIntFromAny, /* setFromAnyProc */
- TCL_OBJTYPE_V0
+ TCL_OBJTYPE_V0_1},
+ LengthOne
};
-const Tcl_ObjType tclBignumType = {
- "bignum", /* name */
+const TclObjTypeWithAbstractList tclBignumType = {
+ {"bignum", /* name */
FreeBignum, /* freeIntRepProc */
DupBignum, /* dupIntRepProc */
UpdateStringOfBignum, /* updateStringProc */
NULL, /* setFromAnyProc */
- TCL_OBJTYPE_V0
+ TCL_OBJTYPE_V0_1},
+ LengthOne
};
/*
@@ -365,9 +371,9 @@ TclInitObjSubsystem(void)
Tcl_InitHashTable(&typeTable, TCL_STRING_KEYS);
Tcl_MutexUnlock(&tableMutex);
- Tcl_RegisterObjType(&tclDoubleType);
+ Tcl_RegisterObjType(&tclDoubleType.objType);
Tcl_RegisterObjType(&tclStringType);
- Tcl_RegisterObjType(&tclListType);
+ Tcl_RegisterObjType(&tclListType.objType);
Tcl_RegisterObjType(&tclDictType);
Tcl_RegisterObjType(&tclByteCodeType);
Tcl_RegisterObjType(&tclCmdNameType);
@@ -2007,11 +2013,11 @@ Tcl_GetBoolFromObj(
return TCL_ERROR;
}
do {
- if (objPtr->typePtr == &tclIntType || objPtr->typePtr == &tclBooleanType) {
+ if (objPtr->typePtr == &tclIntType.objType || objPtr->typePtr == &tclBooleanType.objType) {
result = (objPtr->internalRep.wideValue != 0);
goto boolEnd;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
/*
* Caution: Don't be tempted to check directly for the "double"
* Tcl_ObjType and then compare the internalrep to 0.0. This isn't
@@ -2028,7 +2034,7 @@ Tcl_GetBoolFromObj(
result = (d != 0.0);
goto boolEnd;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
result = 1;
boolEnd:
if (charPtr != NULL) {
@@ -2096,18 +2102,18 @@ TclSetBooleanFromAny(
*/
if (objPtr->bytes == NULL) {
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
if ((Tcl_WideUInt)objPtr->internalRep.wideValue < 2) {
return TCL_OK;
}
goto badBoolean;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
goto badBoolean;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
goto badBoolean;
}
}
@@ -2238,13 +2244,13 @@ ParseBoolean(
goodBoolean:
TclFreeInternalRep(objPtr);
objPtr->internalRep.wideValue = newBool;
- objPtr->typePtr = &tclBooleanType;
+ objPtr->typePtr = &tclBooleanType.objType;
return TCL_OK;
numericBoolean:
TclFreeInternalRep(objPtr);
objPtr->internalRep.wideValue = newBool;
- objPtr->typePtr = &tclIntType;
+ objPtr->typePtr = &tclIntType.objType;
return TCL_OK;
}
@@ -2336,7 +2342,7 @@ Tcl_DbNewDoubleObj(
objPtr->bytes = NULL;
objPtr->internalRep.doubleValue = dblValue;
- objPtr->typePtr = &tclDoubleType;
+ objPtr->typePtr = &tclDoubleType.objType;
return objPtr;
}
@@ -2409,7 +2415,7 @@ Tcl_GetDoubleFromObj(
double *dblPtr) /* Place to store resulting double. */
{
do {
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (isnan(objPtr->internalRep.doubleValue)) {
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
@@ -2422,11 +2428,11 @@ Tcl_GetDoubleFromObj(
*dblPtr = (double) objPtr->internalRep.doubleValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
*dblPtr = (double) objPtr->internalRep.wideValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
mp_int big;
TclUnpackBignum(objPtr, big);
@@ -2640,12 +2646,12 @@ Tcl_GetLongFromObj(
{
do {
#ifdef TCL_WIDE_INT_IS_LONG
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
*longPtr = objPtr->internalRep.wideValue;
return TCL_OK;
}
#else
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
/*
* We return any integer in the range LONG_MIN to ULONG_MAX
* converted to a long, ignoring overflow. The rule preserves
@@ -2664,7 +2670,7 @@ Tcl_GetLongFromObj(
goto tooLarge;
}
#endif
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"expected integer but got \"%s\"",
@@ -2673,7 +2679,7 @@ Tcl_GetLongFromObj(
}
return TCL_ERROR;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
/*
* Must check for those bignum values that can fit in a long, even
* when auto-narrowing is enabled. Only those values in the signed
@@ -2901,11 +2907,11 @@ Tcl_GetWideIntFromObj(
/* Place to store resulting long. */
{
do {
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
*wideIntPtr = objPtr->internalRep.wideValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"expected integer but got \"%s\"",
@@ -2914,7 +2920,7 @@ Tcl_GetWideIntFromObj(
}
return TCL_ERROR;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
/*
* Must check for those bignum values that can fit in a
* Tcl_WideInt, even when auto-narrowing is enabled.
@@ -2986,7 +2992,7 @@ Tcl_GetWideUIntFromObj(
/* Place to store resulting long. */
{
do {
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
if (objPtr->internalRep.wideValue < 0) {
wideUIntOutOfRange:
if (interp != NULL) {
@@ -3000,10 +3006,10 @@ Tcl_GetWideUIntFromObj(
*wideUIntPtr = (Tcl_WideUInt)objPtr->internalRep.wideValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
goto wideUIntOutOfRange;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
/*
* Must check for those bignum values that can fit in a
* Tcl_WideUInt, even when auto-narrowing is enabled.
@@ -3070,11 +3076,11 @@ TclGetWideBitsFromObj(
Tcl_WideInt *wideIntPtr) /* Place to store resulting wide integer. */
{
do {
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
*wideIntPtr = objPtr->internalRep.wideValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"expected integer but got \"%s\"",
@@ -3083,7 +3089,7 @@ TclGetWideBitsFromObj(
}
return TCL_ERROR;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
mp_int big;
mp_err err;
@@ -3162,7 +3168,7 @@ DupBignum(
mp_int bignumVal;
mp_int bignumCopy;
- copyPtr->typePtr = &tclBignumType;
+ copyPtr->typePtr = &tclBignumType.objType;
TclUnpackBignum(srcPtr, bignumVal);
if (mp_init_copy(&bignumCopy, &bignumVal) != MP_OKAY) {
Tcl_Panic("initialization failure in DupBignum");
@@ -3332,7 +3338,7 @@ GetBignumFromObj(
mp_int *bignumValue) /* Returned bignum value. */
{
do {
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
if (copy || Tcl_IsShared(objPtr)) {
mp_int temp;
@@ -3357,14 +3363,14 @@ GetBignumFromObj(
}
return TCL_OK;
}
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
if (mp_init_i64(bignumValue,
objPtr->internalRep.wideValue) != MP_OKAY) {
return TCL_ERROR;
}
return TCL_OK;
}
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"expected integer but got \"%s\"",
@@ -3524,7 +3530,7 @@ TclSetBignumInternalRep(
void *big)
{
mp_int *bignumValue = (mp_int *)big;
- objPtr->typePtr = &tclBignumType;
+ objPtr->typePtr = &tclBignumType.objType;
PACK_BIGNUM(*bignumValue, objPtr);
/*
@@ -3567,7 +3573,7 @@ Tcl_GetNumberFromObj(
int *typePtr)
{
do {
- if (objPtr->typePtr == &tclDoubleType) {
+ if (objPtr->typePtr == &tclDoubleType.objType) {
if (isnan(objPtr->internalRep.doubleValue)) {
*typePtr = TCL_NUMBER_NAN;
} else {
@@ -3576,12 +3582,12 @@ Tcl_GetNumberFromObj(
*clientDataPtr = &objPtr->internalRep.doubleValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclIntType) {
+ if (objPtr->typePtr == &tclIntType.objType) {
*typePtr = TCL_NUMBER_INT;
*clientDataPtr = &objPtr->internalRep.wideValue;
return TCL_OK;
}
- if (objPtr->typePtr == &tclBignumType) {
+ if (objPtr->typePtr == &tclBignumType.objType) {
static Tcl_ThreadDataKey bignumKey;
mp_int *bigPtr = (mp_int *)Tcl_GetThreadData(&bignumKey,
sizeof(mp_int));
@@ -4520,7 +4526,7 @@ Tcl_RepresentationCmd(
objv[1]->refCount, objv[1]);
if (objv[1]->typePtr) {
- if (objv[1]->typePtr == &tclDoubleType) {
+ if (objv[1]->typePtr == &tclDoubleType.objType) {
Tcl_AppendPrintfToObj(descObj, ", internal representation %g",
objv[1]->internalRep.doubleValue);
} else {