diff options
author | griffin <briang42@easystreet.net> | 2022-08-19 18:08:39 (GMT) |
---|---|---|
committer | griffin <briang42@easystreet.net> | 2022-08-19 18:08:39 (GMT) |
commit | f9e3b4dd740c0d808fef53f9eba4b44e67734c34 (patch) | |
tree | b3d402586b3073876cd55494a2ab063aac23eaec /generic/tclInt.h | |
parent | 8bf1d3fbf168db2b518b750ba6554b7e33796815 (diff) | |
download | tcl-f9e3b4dd740c0d808fef53f9eba4b44e67734c34.zip tcl-f9e3b4dd740c0d808fef53f9eba4b44e67734c34.tar.gz tcl-f9e3b4dd740c0d808fef53f9eba4b44e67734c34.tar.bz2 |
Reimplement AbstrctList type structure to simplify. fix various bugs.
Diffstat (limited to 'generic/tclInt.h')
-rw-r--r-- | generic/tclInt.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/generic/tclInt.h b/generic/tclInt.h index bb79e28..38927dc 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -2632,31 +2632,40 @@ typedef struct ListRep { (((listObj_)->typePtr == &tclListType) ? ListObjIsCanonical((listObj_)) : 0) +#define AbstractListGetType(abstractListObjPtr) \ + (Tcl_AbstractListType *) ((abstractListObjPtr)->internalRep.twoPtrValue.ptr1) + static inline Tcl_WideInt AbstractListObjLength(Tcl_Obj* abstractListObjPtr) { - AbstractList *oaRepPtr = - (AbstractList *)abstractListObjPtr->internalRep.twoPtrValue.ptr1; - return oaRepPtr->lengthProc(abstractListObjPtr); + Tcl_AbstractListType *typePtr = + (Tcl_AbstractListType *) abstractListObjPtr->internalRep.twoPtrValue.ptr1; + return typePtr->lengthProc(abstractListObjPtr); } static inline int TclAbstractListHasProc(Tcl_Obj* abstractListObjPtr, Tcl_AbstractListProcType ptype) { - AbstractList* repPtr = Tcl_AbstractListRepPtr(abstractListObjPtr); + Tcl_AbstractListType *typePtr = AbstractListGetType(abstractListObjPtr); switch (ptype) { case TCL_ABSL_NEW: - return (repPtr->newObjProc != NULL); + return (typePtr->newObjProc != NULL); case TCL_ABSL_DUPREP: - return (repPtr->dupRepProc != NULL); + return (typePtr->dupRepProc != NULL); case TCL_ABSL_LENGTH: - return (repPtr->lengthProc != NULL); + return (typePtr->lengthProc != NULL); case TCL_ABSL_INDEX: - return (repPtr->indexProc != NULL); + return (typePtr->indexProc != NULL); case TCL_ABSL_SLICE: - return (repPtr->sliceProc != NULL); + return (typePtr->sliceProc != NULL); case TCL_ABSL_REVERSE: - return (repPtr->reverseProc != NULL); + return (typePtr->reverseProc != NULL); + case TCL_ABSL_GETELEMENTS: + return (typePtr->getElementsProc != NULL); + case TCL_ABSL_FREEREP: + return (typePtr->freeRepProc != NULL); + case TCL_ABSL_TOSTRING: + return (typePtr->toStringProc != NULL); } return 0; } |