summaryrefslogtreecommitdiffstats
path: root/generic/tclTest.c
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2023-03-05 07:11:15 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2023-03-05 07:11:15 (GMT)
commit76edd58c3e121255d2dae1c5bc1b2fc86d1ab3fc (patch)
tree8d659f7516558b92675047bcfae6db36e4b379a0 /generic/tclTest.c
parentd3aa6839f45e33d533ae9525378612cb04ab0dd1 (diff)
downloadtcl-76edd58c3e121255d2dae1c5bc1b2fc86d1ab3fc.zip
tcl-76edd58c3e121255d2dae1c5bc1b2fc86d1ab3fc.tar.gz
tcl-76edd58c3e121255d2dae1c5bc1b2fc86d1ab3fc.tar.bz2
A better fix for Valgrind "still reachable" report in TestcmdtokenCmd().
Diffstat (limited to 'generic/tclTest.c')
-rw-r--r--generic/tclTest.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/generic/tclTest.c b/generic/tclTest.c
index fbd4774..5b57157 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -70,6 +70,7 @@ static Tcl_Interp *delInterp;
typedef struct TestCommandTokenRef {
int id; /* Identifier for this reference. */
Tcl_Command token; /* Tcl's token for the command. */
+ const char *value;
struct TestCommandTokenRef *nextPtr;
/* Next in list of references. */
} TestCommandTokenRef;
@@ -1179,6 +1180,18 @@ TestcmdinfoCmd(
}
static int
+CmdProc0(
+ void *clientData, /* String to return. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ TCL_UNUSED(int) /*argc*/,
+ TCL_UNUSED(const char **) /*argv*/)
+{
+ TestCommandTokenRef *refPtr = (TestCommandTokenRef *) clientData;
+ Tcl_AppendResult(interp, "CmdProc1 ", refPtr->value, NULL);
+ return TCL_OK;
+}
+
+static int
CmdProc1(
void *clientData, /* String to return. */
Tcl_Interp *interp, /* Current interpreter. */
@@ -1189,6 +1202,7 @@ CmdProc1(
return TCL_OK;
}
+
static int
CmdProc2(
void *clientData, /* String to return. */
@@ -1201,6 +1215,28 @@ CmdProc2(
}
static void
+CmdDelProc0(
+ void *clientData) /* String to save. */
+{
+ TestCommandTokenRef *thisRefPtr, *prevRefPtr = NULL;
+ TestCommandTokenRef *refPtr = (TestCommandTokenRef *) clientData;
+ int id = refPtr->id;
+ for (thisRefPtr = firstCommandTokenRef; refPtr != NULL;
+ thisRefPtr = thisRefPtr->nextPtr) {
+ if (thisRefPtr->id == id) {
+ if (prevRefPtr != NULL) {
+ prevRefPtr->nextPtr = thisRefPtr->nextPtr;
+ } else {
+ firstCommandTokenRef = thisRefPtr->nextPtr;
+ }
+ break;
+ }
+ prevRefPtr = thisRefPtr;
+ }
+ ckfree(refPtr);
+}
+
+static void
CmdDelProc1(
void *clientData) /* String to save. */
{
@@ -1242,7 +1278,7 @@ TestcmdtokenCmd(
int argc, /* Number of arguments. */
const char **argv) /* Argument strings. */
{
- TestCommandTokenRef *refPtr, *prevRefPtr;
+ TestCommandTokenRef *refPtr;
char buf[30];
int id;
@@ -1253,9 +1289,10 @@ TestcmdtokenCmd(
}
if (strcmp(argv[1], "create") == 0) {
refPtr = (TestCommandTokenRef *)Tcl_Alloc(sizeof(TestCommandTokenRef));
- refPtr->token = Tcl_CreateCommand(interp, argv[2], CmdProc1,
- (void *) "original", NULL);
+ refPtr->token = Tcl_CreateCommand(interp, argv[2], CmdProc0,
+ refPtr, CmdDelProc0);
refPtr->id = nextCommandTokenRefId;
+ refPtr->value = "original";
nextCommandTokenRefId++;
refPtr->nextPtr = firstCommandTokenRef;
firstCommandTokenRef = refPtr;
@@ -1291,19 +1328,6 @@ TestcmdtokenCmd(
Tcl_GetCommandName(interp, refPtr->token));
Tcl_AppendElement(interp, Tcl_GetString(objPtr));
Tcl_DecrRefCount(objPtr);
- } else if (strcmp(argv[1], "free") == 0) {
- prevRefPtr = NULL;
- for (refPtr = firstCommandTokenRef; refPtr != NULL;
- refPtr = refPtr->nextPtr) {
- if (refPtr->id == id) {
- if (prevRefPtr != NULL) {
- prevRefPtr->nextPtr = refPtr->nextPtr;
- }
- ckfree(refPtr);
- break;
- }
- prevRefPtr = refPtr;
- }
} else {
Tcl_AppendResult(interp, "bad option \"", argv[1],
"\": must be create, name, or free", NULL);