summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tcl.h7
-rw-r--r--generic/tclCmdAH.c6
-rw-r--r--generic/tclCmdIL.c10
-rw-r--r--generic/tclExecute.c10
-rw-r--r--generic/tclInt.h55
-rw-r--r--generic/tclListObj.c16
-rw-r--r--generic/tclTestABSList.c14
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 ; i<statePtr->numLists ; i++) {
int isAbstractList =
- TclObjTypeHasProc(statePtr->aCopyList[i],TCL_OBJ_INDEX);
+ TclObjTypeHasProc(statePtr->aCopyList[i],indexProc) != NULL;
for (v=0 ; v<statePtr->varcList[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);