summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2023-03-03 12:15:11 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2023-03-03 12:15:11 (GMT)
commitd3aa6839f45e33d533ae9525378612cb04ab0dd1 (patch)
treec559ab87f027d879c591ec84470bcf46a1a88cb0 /generic
parent4d674569535d565275d4a4d4a16a8c63ed7c41f9 (diff)
downloadtcl-d3aa6839f45e33d533ae9525378612cb04ab0dd1.zip
tcl-d3aa6839f45e33d533ae9525378612cb04ab0dd1.tar.gz
tcl-d3aa6839f45e33d533ae9525378612cb04ab0dd1.tar.bz2
Fix Valgrind "still reachable" report in TestcmdtokenCmd().
Diffstat (limited to 'generic')
-rw-r--r--generic/tclTest.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/generic/tclTest.c b/generic/tclTest.c
index f4450ff..fbd4774 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -1242,7 +1242,7 @@ TestcmdtokenCmd(
int argc, /* Number of arguments. */
const char **argv) /* Argument strings. */
{
- TestCommandTokenRef *refPtr;
+ TestCommandTokenRef *refPtr, *prevRefPtr;
char buf[30];
int id;
@@ -1261,9 +1261,7 @@ TestcmdtokenCmd(
firstCommandTokenRef = refPtr;
sprintf(buf, "%d", refPtr->id);
Tcl_AppendResult(interp, buf, NULL);
- } else if (strcmp(argv[1], "name") == 0) {
- Tcl_Obj *objPtr;
-
+ } else {
if (sscanf(argv[2], "%d", &id) != 1) {
Tcl_AppendResult(interp, "bad command token \"", argv[2],
"\"", NULL);
@@ -1283,18 +1281,36 @@ TestcmdtokenCmd(
return TCL_ERROR;
}
- objPtr = Tcl_NewObj();
- Tcl_GetCommandFullName(interp, refPtr->token, objPtr);
+ if (strcmp(argv[1], "name") == 0) {
+ Tcl_Obj *objPtr;
- Tcl_AppendElement(interp,
- Tcl_GetCommandName(interp, refPtr->token));
- Tcl_AppendElement(interp, Tcl_GetString(objPtr));
- Tcl_DecrRefCount(objPtr);
- } else {
- Tcl_AppendResult(interp, "bad option \"", argv[1],
- "\": must be create or name", NULL);
- return TCL_ERROR;
+ objPtr = Tcl_NewObj();
+ Tcl_GetCommandFullName(interp, refPtr->token, objPtr);
+
+ Tcl_AppendElement(interp,
+ 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);
+ return TCL_ERROR;
+ }
}
+
return TCL_OK;
}