From 7157c6b87856701344156a0926230589704b9bd5 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Sun, 18 Dec 2022 10:05:40 +0000 Subject: Reserve a place in abstractlist for an additional function --- generic/tcl.h | 8 +++++--- generic/tclArithSeries.c | 1 + generic/tclDictObj.c | 1 + generic/tclInt.h | 8 +++++--- generic/tclListObj.c | 1 + generic/tclObj.c | 14 ++++++++------ generic/tclTestABSList.c | 11 +++++++++++ generic/tclUtil.c | 12 +++++++++--- 8 files changed, 41 insertions(+), 15 deletions(-) diff --git a/generic/tcl.h b/generic/tcl.h index b02b1f4..63be548 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -657,6 +657,7 @@ typedef struct Tcl_ObjType { /* List emulation functions - ObjType Version 1 */ Tcl_ALLengthProc *lengthProc; /* Return the [llength] of the ** AbstractList */ + void *reserved; Tcl_ALIndexProc *indexProc; /* Return a value (Tcl_Obj) for ** [lindex $al $index] */ Tcl_ALSliceProc *sliceProc; /* Return an AbstractList for @@ -679,11 +680,12 @@ typedef struct Tcl_ObjType { NULL, \ NULL, \ NULL, \ + NULL, \ NULL -#define TCL_OBJTYPE_CURRENT 1 -#define TCL_OBJTYPE_V1(a,b,c,d,e,f,g,h) \ +#define TCL_OBJTYPE_CURRENT sizeof(Tcl_ObjType) +#define TCL_OBJTYPE_V1(a,b,c,d,e,f,g,h,i) \ TCL_OBJTYPE_CURRENT, \ - a,b,c,d,e,f,g,h /* Tcl 9 - AbstractLists */ + a,b,c,d,e,f,g,h,i /* Tcl 9 - AbstractLists */ /* * The following structure stores an internal representation (internalrep) for diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c index e2addf1..4902158 100755 --- a/generic/tclArithSeries.c +++ b/generic/tclArithSeries.c @@ -78,6 +78,7 @@ static Tcl_ObjType arithSeriesType = { NULL, /* setFromAnyProc */ TCL_OBJTYPE_V1( TclArithSeriesObjLength, + NULL, TclArithSeriesObjIndex, TclArithSeriesObjRange, TclArithSeriesObjReverse, diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 5ae7224..45d798c 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -152,6 +152,7 @@ const Tcl_ObjType tclDictType = { TCL_OBJTYPE_V1( /* Extended type for AbstractLists */ DictAsListLength, /* return "list" length of dict value w/o * shimmering */ + NULL, DictAsListIndex, /* return key or value at "list" index * location. (keysare at even indicies, * values at odd indicies) */ diff --git a/generic/tclInt.h b/generic/tclInt.h index bbdbb16..3dfb4d7 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -1091,9 +1091,11 @@ typedef struct ActiveInterpTrace { #define TCL_TRACE_ENTER_EXEC 1 #define TCL_TRACE_LEAVE_EXEC 2 -#define ABSTRACTLIST_PROC(objPtr, proc) ((((objPtr)->typePtr) \ - && (offsetof(Tcl_ObjType, proc) <= offsetof(Tcl_ObjType, setFromAnyProc) || (objPtr)->typePtr->version == TCL_OBJTYPE_CURRENT)) \ - ? (objPtr)->typePtr->proc : NULL) +#define ABSTRACTLIST_PROC(objPtr, proc) (((objPtr)->typePtr \ + && ((objPtr)->typePtr->version > offsetof(Tcl_ObjType, proc))) ? \ + ((objPtr)->typePtr)->proc : NULL) + +MODULE_SCOPE size_t TclLengthOne(Tcl_Obj *); /* * The structure below defines an entry in the assocData hash table which is diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 32b7455..dad5b99 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -166,6 +166,7 @@ const Tcl_ObjType tclListType = { NULL, NULL, NULL, + NULL, NULL) }; diff --git a/generic/tclObj.c b/generic/tclObj.c index a05adec..a51ba45 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -225,8 +225,6 @@ static int SetCmdNameFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr); * implementations. */ -static size_t LengthOne(TCL_UNUSED(Tcl_Obj *)) {return 1;} - const Tcl_ObjType tclBooleanType= { "boolean", /* name */ NULL, /* freeIntRepProc */ @@ -234,7 +232,8 @@ const Tcl_ObjType tclBooleanType= { NULL, /* updateStringProc */ TclSetBooleanFromAny, /* setFromAnyProc */ TCL_OBJTYPE_V1( - LengthOne, + TclLengthOne, + NULL, NULL, NULL, NULL, @@ -250,7 +249,8 @@ const Tcl_ObjType tclDoubleType= { UpdateStringOfDouble, /* updateStringProc */ SetDoubleFromAny, /* setFromAnyProc */ TCL_OBJTYPE_V1( - LengthOne, + TclLengthOne, + NULL, NULL, NULL, NULL, @@ -266,7 +266,8 @@ const Tcl_ObjType tclIntType = { UpdateStringOfInt, /* updateStringProc */ SetIntFromAny, /* setFromAnyProc */ TCL_OBJTYPE_V1( - LengthOne, + TclLengthOne, + NULL, NULL, NULL, NULL, @@ -282,7 +283,8 @@ const Tcl_ObjType tclBignumType = { UpdateStringOfBignum, /* updateStringProc */ NULL, /* setFromAnyProc */ TCL_OBJTYPE_V1( - LengthOne, + TclLengthOne, + NULL, NULL, NULL, NULL, diff --git a/generic/tclTestABSList.c b/generic/tclTestABSList.c index 07d04ec..286ed0a 100644 --- a/generic/tclTestABSList.c +++ b/generic/tclTestABSList.c @@ -66,6 +66,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -82,6 +83,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( NULL, /*default my_LStringObjLength,*/ + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -98,6 +100,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, NULL, /*default my_LStringObjIndex,*/ my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -115,6 +118,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, NULL, /*default my_LStringObjRange,*/ my_LStringObjReverse, @@ -131,6 +135,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ NULL, /*defaults my_LStringObjReverse,*/ @@ -147,6 +152,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -163,6 +169,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -179,6 +186,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -195,6 +203,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -211,6 +220,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, @@ -227,6 +237,7 @@ static const Tcl_ObjType lstringTypes[11] = { NULL, TCL_OBJTYPE_V1( my_LStringObjLength, + NULL, my_LStringObjIndex, my_LStringObjRange,/*ObjRange*/ my_LStringObjReverse, diff --git a/generic/tclUtil.c b/generic/tclUtil.c index b48537a..38e562d 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -122,8 +122,6 @@ static int FindElement(Tcl_Interp *interp, const char *string, * is unregistered, so has no need of a setFromAnyProc either. */ -static size_t LengthOne(TCL_UNUSED(Tcl_Obj *)) {return 1;} - static const Tcl_ObjType endOffsetType = { "end-offset", /* name */ NULL, /* freeIntRepProc */ @@ -131,7 +129,8 @@ static const Tcl_ObjType endOffsetType = { NULL, /* updateStringProc */ NULL, /* setFromAnyProc */ TCL_OBJTYPE_V1( - LengthOne, + TclLengthOne, + NULL, NULL, NULL, NULL, @@ -141,6 +140,13 @@ static const Tcl_ObjType endOffsetType = { NULL) }; +size_t +TclLengthOne( + TCL_UNUSED(Tcl_Obj *)) +{ + return 1; +} + /* * * STRING REPRESENTATION OF LISTS * * * * -- cgit v0.12