summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tcl.decls7
-rw-r--r--generic/tcl.h19
-rw-r--r--generic/tclDecls.h8
-rw-r--r--generic/tclInt.h1
-rw-r--r--generic/tclStubInit.c2
5 files changed, 28 insertions, 9 deletions
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 8b16a1b..2c72914 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -134,10 +134,9 @@ declare 28 {
declare 29 {
Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *objPtr)
}
-# Removed in 9.0
-#declare 30 {
-# void TclFreeObj(Tcl_Obj *objPtr)
-#}
+declare 30 {
+ void TclFreeObj(Tcl_Obj *objPtr)
+}
declare 31 {
int Tcl_GetBoolean(Tcl_Interp *interp, const char *src, int *boolPtr)
}
diff --git a/generic/tcl.h b/generic/tcl.h
index c88ddde..f5bb8b9 100644
--- a/generic/tcl.h
+++ b/generic/tcl.h
@@ -2281,6 +2281,25 @@ EXTERN int TclZipfs_AppHook(int *argc, char ***argv);
# undef Tcl_IsShared
# define Tcl_IsShared(objPtr) \
Tcl_DbIsShared(objPtr, __FILE__, __LINE__)
+#else
+# undef Tcl_IncrRefCount
+# define Tcl_IncrRefCount(objPtr) \
+ ++(objPtr)->refCount
+ /*
+ * Use do/while0 idiom for optimum correctness without compiler warnings.
+ * http://c2.com/cgi/wiki?TrivialDoWhileLoop
+ */
+# undef Tcl_DecrRefCount
+# define Tcl_DecrRefCount(objPtr) \
+ do { \
+ Tcl_Obj *_objPtr = (objPtr); \
+ if ((_objPtr)->refCount-- <= 1) { \
+ TclFreeObj(_objPtr); \
+ } \
+ } while(0)
+# undef Tcl_IsShared
+# define Tcl_IsShared(objPtr) \
+ ((objPtr)->refCount > 1)
#endif
/*
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index 210a094..e525b26 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -136,7 +136,8 @@ EXTERN Tcl_Obj * Tcl_DbNewStringObj(const char *bytes, size_t length,
const char *file, int line);
/* 29 */
EXTERN Tcl_Obj * Tcl_DuplicateObj(Tcl_Obj *objPtr);
-/* Slot 30 is reserved */
+/* 30 */
+EXTERN void TclFreeObj(Tcl_Obj *objPtr);
/* 31 */
EXTERN int Tcl_GetBoolean(Tcl_Interp *interp, const char *src,
int *boolPtr);
@@ -1823,7 +1824,7 @@ typedef struct TclStubs {
Tcl_Obj * (*tcl_DbNewObj) (const char *file, int line); /* 27 */
Tcl_Obj * (*tcl_DbNewStringObj) (const char *bytes, size_t length, const char *file, int line); /* 28 */
Tcl_Obj * (*tcl_DuplicateObj) (Tcl_Obj *objPtr); /* 29 */
- void (*reserved30)(void);
+ void (*tclFreeObj) (Tcl_Obj *objPtr); /* 30 */
int (*tcl_GetBoolean) (Tcl_Interp *interp, const char *src, int *boolPtr); /* 31 */
int (*tcl_GetBooleanFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr); /* 32 */
unsigned char * (*tcl_GetByteArrayFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 33 */
@@ -2534,7 +2535,8 @@ extern const TclStubs *tclStubsPtr;
(tclStubsPtr->tcl_DbNewStringObj) /* 28 */
#define Tcl_DuplicateObj \
(tclStubsPtr->tcl_DuplicateObj) /* 29 */
-/* Slot 30 is reserved */
+#define TclFreeObj \
+ (tclStubsPtr->tclFreeObj) /* 30 */
#define Tcl_GetBoolean \
(tclStubsPtr->tcl_GetBoolean) /* 31 */
#define Tcl_GetBooleanFromObj \
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 0476a83..c75fd52 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -4045,7 +4045,6 @@ MODULE_SCOPE int TclObjCallVarTraces(Interp *iPtr, Var *arrayPtr,
*/
MODULE_SCOPE int TclCompareObjKeys(void *keyPtr, Tcl_HashEntry *hPtr);
-MODULE_SCOPE void TclFreeObj(Tcl_Obj *objPtr);
MODULE_SCOPE void TclFreeObjEntry(Tcl_HashEntry *hPtr);
MODULE_SCOPE TCL_HASH_TYPE TclHashObjKey(Tcl_HashTable *tablePtr, void *keyPtr);
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 5bdbb47..6c11147 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -739,7 +739,7 @@ const TclStubs tclStubs = {
Tcl_DbNewObj, /* 27 */
Tcl_DbNewStringObj, /* 28 */
Tcl_DuplicateObj, /* 29 */
- 0, /* 30 */
+ TclFreeObj, /* 30 */
Tcl_GetBoolean, /* 31 */
Tcl_GetBooleanFromObj, /* 32 */
Tcl_GetByteArrayFromObj, /* 33 */