From 6b52bc1a6490f533e0f9f1a8ccdc55e47f117010 Mon Sep 17 00:00:00 2001 From: griffin Date: Wed, 7 Dec 2022 23:56:10 +0000 Subject: Add 'getdouble' function to ObjType, used for abstractlist types. -- Experimental --- generic/tcl.h | 37 ++++++++++++++++++++++--------------- generic/tclArithSeries.c | 3 ++- generic/tclDictObj.c | 1 + generic/tclListObj.c | 1 + generic/tclObj.c | 7 +++++++ generic/tclUtil.c | 1 + 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/generic/tcl.h b/generic/tcl.h index fec2880..c86b24e 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -612,24 +612,26 @@ typedef void (Tcl_FinalizeNotifierProc) (void *clientData); typedef void (Tcl_MainLoopProc) (void); /* Abstract List functions */ -typedef Tcl_Size (Tcl_ALLengthProc) (struct Tcl_Obj *listPtr); -typedef int (Tcl_ALIndexProc) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, - Tcl_Size index, struct Tcl_Obj** elemObj); -typedef int (Tcl_ALSliceProc) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, - Tcl_Size fromIdx, Tcl_Size toIdx, - struct Tcl_Obj **newObjPtr); +typedef Tcl_Size (Tcl_ALLengthProc) (struct Tcl_Obj *listPtr); +typedef int (Tcl_ALIndexProc) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, + Tcl_Size index, struct Tcl_Obj** elemObj); +typedef int (Tcl_ALSliceProc) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, + Tcl_Size fromIdx, Tcl_Size toIdx, + struct Tcl_Obj **newObjPtr); typedef int (Tcl_ALReverseProc) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, struct Tcl_Obj **newObjPtr); typedef int (Tcl_ALGetElements) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, Tcl_Size *objcptr, struct Tcl_Obj ***objvptr); -typedef struct Tcl_Obj* (Tcl_ALSetElement) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, - Tcl_Size indexCount, - struct Tcl_Obj *const indexArray[], - struct Tcl_Obj *valueObj); +typedef struct Tcl_Obj* (Tcl_ALSetElement) (Tcl_Interp *interp, struct Tcl_Obj *listPtr, + Tcl_Size indexCount, + struct Tcl_Obj *const indexArray[], + struct Tcl_Obj *valueObj); typedef int (Tcl_ALReplaceProc) (Tcl_Interp *interp, struct Tcl_Obj *listObj, - Tcl_Size first, Tcl_Size numToDelete, - Tcl_Size numToInsert, - struct Tcl_Obj *const insertObjs[]); + Tcl_Size first, Tcl_Size numToDelete, + Tcl_Size numToInsert, + struct Tcl_Obj *const insertObjs[]); +typedef int (Tcl_ALGetDblProc) (Tcl_Interp *interp, struct Tcl_Obj *objPtr, + double *doublePtr); #ifndef TCL_NO_DEPRECATED # define Tcl_PackageInitProc Tcl_LibraryInitProc @@ -675,6 +677,8 @@ typedef struct Tcl_ObjType { Tcl_ALSetElement *setElementProc; /* Replace the element at the indicie ** with the given valueObj. */ Tcl_ALReplaceProc *replaceProc; /* Replace subset with subset */ + Tcl_ALGetDblProc *getDoubleProc; /* GetDouble from internal rep */ + } Tcl_ObjType; #define TCL_OBJTYPE_V0 0, /* Pre-Tcl 9 */ \ @@ -684,11 +688,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) \ +#define TCL_OBJTYPE_V1(a,b,c,d,e,f,g,h) \ TCL_OBJTYPE_CURRENT, \ - a,b,c,d,e,f,g /* Tcl 9 - AbstractLists */ + a,b,c,d,e,f,g,h /* Tcl 9 - AbstractLists */ /* * The following structure stores an internal representation (internalrep) for @@ -763,6 +768,8 @@ typedef struct Tcl_Obj { (objPtr)->typePtr->setElementProc((interp), (objPtr), (indexCount), (indexArray), (valueObj)) #define Tcl_ObjTypeReplace(interp, objPtr, first, numToDelete, numToInsert, insertObjs) \ (objPtr)->typePtr->replaceProc((interp), (objPtr), (first), (numToDelete), (numToInsert), (insertObjs)) +#define Tcl_ObjTypeGetDouble(interp, objPtr, doublePtr) \ + (objPtr)->typePtr->getDoubleProc((interp), (objPtr), (doublePtr)) /* diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c index 8d1841f..e2addf1 100755 --- a/generic/tclArithSeries.c +++ b/generic/tclArithSeries.c @@ -83,7 +83,8 @@ static Tcl_ObjType arithSeriesType = { TclArithSeriesObjReverse, TclArithSeriesGetElements, NULL, // SetElement - NULL) // Replace + NULL, // Replace + NULL) // GetDouble }; /* diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index b13bdb5..5ae7224 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -159,6 +159,7 @@ const Tcl_ObjType tclDictType = { NULL, NULL, NULL, + NULL, NULL) }; diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 4ae4443..441e06e 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -165,6 +165,7 @@ const Tcl_ObjType tclListType = { NULL, NULL, NULL, + NULL, NULL) }; diff --git a/generic/tclObj.c b/generic/tclObj.c index 735dc4f..6bedfea 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -240,6 +240,7 @@ const Tcl_ObjType tclBooleanType= { NULL, NULL, NULL, + NULL, NULL) }; const Tcl_ObjType tclDoubleType= { @@ -255,6 +256,7 @@ const Tcl_ObjType tclDoubleType= { NULL, NULL, NULL, + NULL, NULL) }; const Tcl_ObjType tclIntType = { @@ -270,6 +272,7 @@ const Tcl_ObjType tclIntType = { NULL, NULL, NULL, + NULL, NULL) }; const Tcl_ObjType tclBignumType = { @@ -285,6 +288,7 @@ const Tcl_ObjType tclBignumType = { NULL, NULL, NULL, + NULL, NULL) }; @@ -2448,6 +2452,9 @@ Tcl_GetDoubleFromObj( double *dblPtr) /* Place to store resulting double. */ { do { + if (ABSTRACTLIST_PROC(objPtr, getDoubleProc)) { + return Tcl_ObjTypeGetDouble(interp, objPtr, dblPtr); + } if (objPtr->typePtr == &tclDoubleType) { if (isnan(objPtr->internalRep.doubleValue)) { if (interp != NULL) { diff --git a/generic/tclUtil.c b/generic/tclUtil.c index eb09e8b..b48537a 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -137,6 +137,7 @@ static const Tcl_ObjType endOffsetType = { NULL, NULL, NULL, + NULL, NULL) }; -- cgit v0.12