diff options
author | pooryorick <com.digitalsmarties@pooryorick.com> | 2023-03-03 12:15:11 (GMT) |
---|---|---|
committer | pooryorick <com.digitalsmarties@pooryorick.com> | 2023-03-03 12:15:11 (GMT) |
commit | d3aa6839f45e33d533ae9525378612cb04ab0dd1 (patch) | |
tree | c559ab87f027d879c591ec84470bcf46a1a88cb0 /generic | |
parent | 4d674569535d565275d4a4d4a16a8c63ed7c41f9 (diff) | |
download | tcl-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.c | 44 |
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; } |