From 64383b33bd0277ac8c9e3218da0b6a39582af7e1 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Mon, 28 Nov 2022 21:45:49 +0000 Subject: Simplify TclObjTypeHasProc() (a lot!) --- generic/tcl.h | 7 ------ generic/tclCmdAH.c | 6 +++--- generic/tclCmdIL.c | 10 ++++----- generic/tclExecute.c | 10 ++++----- generic/tclInt.h | 55 +++--------------------------------------------- generic/tclListObj.c | 16 +++++++------- generic/tclTestABSList.c | 14 ++++++------ 7 files changed, 31 insertions(+), 87 deletions(-) diff --git a/generic/tcl.h b/generic/tcl.h index f342d07..a358919 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -748,13 +748,6 @@ typedef struct Tcl_Obj { */ -typedef enum { - TCL_OBJ_FREEREP, TCL_OBJ_DUPREP, TCL_OBJ_UPDATESTRING, TCL_OBJ_SETFROMANY, - TCL_OBJ_LENGTH, TCL_OBJ_INDEX, - TCL_OBJ_SLICE, TCL_OBJ_REVERSE, TCL_OBJ_GETELEMENTS, - TCL_OBJ_SETELEMENT, TCL_OBJ_REPLACE -} Tcl_ObjProcType; - #define Tcl_ObjTypeLength(objPtr) (objPtr)->typePtr->lengthProc(objPtr) #define Tcl_ObjTypeIndex(interp, objPtr, index, elemObjPtr) \ (objPtr)->typePtr->indexProc((interp),(objPtr),(index),(elemObjPtr)) diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index b8b5de3..016c06b 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -2726,8 +2726,8 @@ EachloopCmd( /* Values */ if (!TclHasInternalRep(objv[2+i*2], &tclListType) && - TclObjTypeHasProc(objv[2+i*2],TCL_OBJ_DUPREP) && - TclObjTypeHasProc(objv[2+i*2],TCL_OBJ_INDEX)) { + TclObjTypeHasProc(objv[2+i*2],dupIntRepProc) && + TclObjTypeHasProc(objv[2+i*2],indexProc)) { /* Special case for AbstractList */ statePtr->aCopyList[i] = Tcl_DuplicateObj(objv[2+i*2]); if (statePtr->aCopyList[i] == NULL) { @@ -2869,7 +2869,7 @@ ForeachAssignments( for (i=0 ; inumLists ; i++) { int isAbstractList = - TclObjTypeHasProc(statePtr->aCopyList[i],TCL_OBJ_INDEX); + TclObjTypeHasProc(statePtr->aCopyList[i],indexProc) != NULL; for (v=0 ; vvarcList[i] ; v++) { k = statePtr->index[i]++; diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index dc9cc34..c619e2d 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -2216,7 +2216,7 @@ Tcl_JoinObjCmd( * pointer to its array of element pointers. */ - if (TclObjTypeHasProc(objv[1], TCL_OBJ_GETELEMENTS)) { + if (TclObjTypeHasProc(objv[1], getElementsProc)) { listLen = Tcl_ObjTypeLength(objv[1]); isAbstractList = (listLen ? 1 : 0); if (listLen > 1 && @@ -2730,7 +2730,7 @@ Tcl_LrangeObjCmd( return result; } - if (TclObjTypeHasProc(objv[1], TCL_OBJ_SLICE)) { + if (TclObjTypeHasProc(objv[1], sliceProc)) { Tcl_Obj *resultObj; int status = Tcl_ObjTypeSlice(interp, objv[1], first, last, &resultObj); if (status == TCL_OK) { @@ -3127,7 +3127,7 @@ Tcl_LreverseObjCmd( * Handle AbstractList special case - do not shimmer into a list, if it * supports a private Reverse function, just to reverse it. */ - if (TclObjTypeHasProc(objv[1], TCL_OBJ_REVERSE)) { + if (TclObjTypeHasProc(objv[1], reverseProc)) { Tcl_Obj *resultObj; if (Tcl_ObjTypeReverse(interp, objv[1], &resultObj) == TCL_OK) { @@ -4397,7 +4397,7 @@ Tcl_LsetObjCmd( if (objc == 4) { finalValuePtr = TclLsetList(interp, listPtr, objv[2], objv[3]); } else { - if (TclObjTypeHasProc(listPtr, TCL_OBJ_SETELEMENT)) { + if (TclObjTypeHasProc(listPtr, setElementProc)) { finalValuePtr = Tcl_ObjTypeSetElement(interp, listPtr, objc-3, objv+2, objv[objc-1]); if (finalValuePtr) { @@ -4707,7 +4707,7 @@ Tcl_LsortObjCmd( sortInfo.compareCmdPtr = newCommandPtr; } - if (TclObjTypeHasProc(objv[1], TCL_OBJ_GETELEMENTS)) { + if (TclObjTypeHasProc(objv[1], getElementsProc)) { sortInfo.resultCode = Tcl_ObjTypeGetElements(interp, listObj, &length, &listObjPtrs); } else { diff --git a/generic/tclExecute.c b/generic/tclExecute.c index b0a58ea..5d2abab 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -4659,7 +4659,7 @@ TEBCresume( TRACE(("\"%.30s\" \"%.30s\" => ", O2S(valuePtr), O2S(value2Ptr))); /* special case for AbstractList */ - if (TclObjTypeHasProc(valuePtr,TCL_OBJ_INDEX)) { + if (TclObjTypeHasProc(valuePtr,indexProc)) { length = Tcl_ObjTypeLength(valuePtr); if (TclGetIntForIndexM(interp, value2Ptr, length-1, &index)!=TCL_OK) { CACHE_STACK_INFO(); @@ -4728,7 +4728,7 @@ TEBCresume( */ /* special case for AbstractList */ - if (TclObjTypeHasProc(valuePtr,TCL_OBJ_INDEX)) { + if (TclObjTypeHasProc(valuePtr,indexProc)) { length = Tcl_ObjTypeLength(valuePtr); /* Decode end-offset index values. */ @@ -4818,7 +4818,7 @@ TEBCresume( * Compute the new variable value. */ - if (TclObjTypeHasProc(valuePtr, TCL_OBJ_SLICE)) { + if (TclObjTypeHasProc(valuePtr, sliceProc)) { objResultPtr = Tcl_ObjTypeSetElement(interp, valuePtr, numIndices, &OBJ_AT_DEPTH(numIndices), OBJ_AT_TOS); @@ -4946,7 +4946,7 @@ TEBCresume( fromIdx = TclIndexDecode(fromIdx, objc - 1); - if (TclObjTypeHasProc(valuePtr, TCL_OBJ_SLICE)) { + if (TclObjTypeHasProc(valuePtr, sliceProc)) { if (Tcl_ObjTypeSlice(interp, valuePtr, fromIdx, toIdx, &objResultPtr) != TCL_OK) { TRACE_ERROR(interp); goto gotError; @@ -4973,7 +4973,7 @@ TEBCresume( if (length > 0) { size_t i = 0; Tcl_Obj *o; - int isAbstractList = TclObjTypeHasProc(value2Ptr,TCL_OBJ_INDEX); + int isAbstractList = TclObjTypeHasProc(value2Ptr,indexProc) != NULL; /* * An empty list doesn't match anything. diff --git a/generic/tclInt.h b/generic/tclInt.h index 1acf0c0..ca0e351 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -4674,58 +4674,9 @@ MODULE_SCOPE int TclIsPureByteArray(Tcl_Obj *objPtr); #define TclFetchInternalRep(objPtr, type) \ (TclHasInternalRep((objPtr), (type)) ? &((objPtr)->internalRep) : NULL) -static inline int -TclObjTypeHasProc(Tcl_Obj* objPtr, Tcl_ObjProcType ptype) -{ - Tcl_ObjType const *typePtr = objPtr->typePtr; - if (typePtr == NULL) { - return 0; - } - switch ((size_t)typePtr->version) { - case 0: - switch (ptype) { - case TCL_OBJ_DUPREP: - return (typePtr->dupIntRepProc != NULL); - case TCL_OBJ_FREEREP: - return (typePtr->freeIntRepProc != NULL); - case TCL_OBJ_UPDATESTRING: - return (typePtr->updateStringProc != NULL); - case TCL_OBJ_SETFROMANY: - return (typePtr->setFromAnyProc != NULL); - default: - return 0; - } - case (size_t)TCL_OBJTYPE_V1: - switch (ptype) { - case TCL_OBJ_DUPREP: - return (typePtr->dupIntRepProc != NULL); - case TCL_OBJ_LENGTH: - return (typePtr->lengthProc != NULL); - case TCL_OBJ_INDEX: - return (typePtr->indexProc != NULL); - case TCL_OBJ_SLICE: - return (typePtr->sliceProc != NULL); - case TCL_OBJ_REVERSE: - return (typePtr->reverseProc != NULL); - case TCL_OBJ_GETELEMENTS: - return (typePtr->getElementsProc != NULL); - case TCL_OBJ_FREEREP: - return (typePtr->freeIntRepProc != NULL); - case TCL_OBJ_UPDATESTRING: - return (typePtr->updateStringProc != NULL); - case TCL_OBJ_SETELEMENT: - return (typePtr->setElementProc != NULL); - case TCL_OBJ_REPLACE: - return (typePtr->replaceProc != NULL); - default: - return 0; - } - default: - return 0; - } - return 0; -} - +#define TclObjTypeHasProc(objPtr, proc) ((((objPtr)->typePtr) \ + && (offsetof(Tcl_ObjType, proc) <= offsetof(Tcl_ObjType, setFromAnyProc) || (objPtr)->typePtr->version == TCL_OBJTYPE_V1)) \ + ? (objPtr)->typePtr->proc : NULL) /* diff --git a/generic/tclListObj.c b/generic/tclListObj.c index a8358fa..f52a1cd 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -1368,8 +1368,8 @@ TclListObjCopy( Tcl_Obj *copyObj; if (!TclHasInternalRep(listObj, &tclListType)) { - if (TclObjTypeHasProc(listObj,TCL_OBJ_DUPREP) && - TclObjTypeHasProc(listObj,TCL_OBJ_INDEX)) { + if (TclObjTypeHasProc(listObj,dupIntRepProc) && + TclObjTypeHasProc(listObj,indexProc)) { return Tcl_DuplicateObj(listObj); } if (SetListFromAny(interp, listObj) != TCL_OK) { @@ -1665,7 +1665,7 @@ Tcl_ListObjGetElements( { ListRep listRep; - if (TclObjTypeHasProc(objPtr, TCL_OBJ_GETELEMENTS) && + if (TclObjTypeHasProc(objPtr, getElementsProc) && objPtr->typePtr->getElementsProc(interp, objPtr, objcPtr, objvPtr) == TCL_OK) { return TCL_OK; } else if (TclListObjGetRep(interp, objPtr, &listRep) != TCL_OK) { @@ -2003,7 +2003,7 @@ Tcl_ListObjLength( ListRep listRep; /* Handle AbstractList before attempting SetListFromAny */ - if (TclObjTypeHasProc(listObj, TCL_OBJ_LENGTH)) { + if (TclObjTypeHasProc(listObj, lengthProc)) { *lenPtr = listObj->typePtr->lengthProc(listObj); return TCL_OK; @@ -2084,7 +2084,7 @@ Tcl_ListObjReplace( Tcl_Panic("%s called with shared object", "Tcl_ListObjReplace"); } - if (TclObjTypeHasProc(listObj, TCL_OBJ_REPLACE)) { + if (TclObjTypeHasProc(listObj, replaceProc)) { return Tcl_ObjTypeReplace(interp, listObj, first, numToDelete, numToInsert, insertObjs); } @@ -2642,7 +2642,7 @@ TclLindexFlat( Tcl_Size i; /* Handle AbstractList as special case */ - if (TclObjTypeHasProc(listObj,TCL_OBJ_INDEX)) { + if (TclObjTypeHasProc(listObj,indexProc)) { Tcl_WideInt listLen = Tcl_ObjTypeLength(listObj); Tcl_Size index; Tcl_Obj *elemObj = NULL; @@ -2766,7 +2766,7 @@ TclLsetList( TclGetIntForIndexM(NULL, indexArgObj, ListSizeT_MAX - 1, &index) == TCL_OK) { - if (TclObjTypeHasProc(listObj, TCL_OBJ_SETELEMENT)) { + if (TclObjTypeHasProc(listObj, setElementProc)) { indices = &indexArgObj; Tcl_Obj *returnValue = Tcl_ObjTypeSetElement(interp, listObj, 1, indices, valueObj); @@ -3311,7 +3311,7 @@ SetListFromAny( Tcl_IncrRefCount(valuePtr); Tcl_DictObjNext(&search, &keyPtr, &valuePtr, &done); } - } else if (TclObjTypeHasProc(objPtr,TCL_OBJ_INDEX)) { + } else if (TclObjTypeHasProc(objPtr,indexProc)) { Tcl_Size elemCount, i; elemCount = Tcl_ObjTypeLength(objPtr); diff --git a/generic/tclTestABSList.c b/generic/tclTestABSList.c index 3819c2c..1e128a9 100644 --- a/generic/tclTestABSList.c +++ b/generic/tclTestABSList.c @@ -609,13 +609,13 @@ my_LStringReplace( return TCL_OK; } -static Tcl_ObjType * -my_SetAbstractProc(Tcl_ObjProcType ptype) +static const Tcl_ObjType * +my_SetAbstractProc(int ptype) { Tcl_ObjType *typePtr = &lstringTypes[0]; /* default value */ - if (TCL_OBJ_LENGTH <= ptype && ptype <= TCL_OBJ_REPLACE) { + if (4 <= ptype && ptype <= 11) { /* Table has no entries for the slots upto setfromany */ - typePtr = &lstringTypes[(ptype-TCL_OBJ_SETFROMANY)]; + typePtr = &lstringTypes[(ptype-3)]; } return typePtr; } @@ -651,11 +651,11 @@ my_NewLStringObj( static const char* procTypeNames[] = { "FREEREP", "DUPREP", "UPDATESTRING", "SETFROMANY", "LENGTH", "INDEX", "SLICE", "REVERSE", "GETELEMENTS", - "TOSTRING", "SETELEMENT", "REPLACE", NULL + "SETELEMENT", "REPLACE", NULL }; int i = 0; - Tcl_ObjProcType ptype; - Tcl_ObjType *lstringTypePtr = &lstringTypes[10]; + int ptype; + const Tcl_ObjType *lstringTypePtr = &lstringTypes[10]; repSize = sizeof(LString); lstringRepPtr = (LString*)Tcl_Alloc(repSize); -- cgit v0.12