diff options
author | Steve Bennett <steveb@workware.net.au> | 2023-06-29 14:15:07 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2025-07-16 09:34:08 +1000 |
commit | 4cea1cdea06a9ff18f485a54c65c804903da63b9 (patch) | |
tree | 8c0aeb060228d5068d52fd9d8fee824f17805e05 | |
parent | e5faa1eb5d11ca5c26ee3f28f5377a1dbdaad23e (diff) | |
download | jimtcl-4cea1cdea06a9ff18f485a54c65c804903da63b9.zip jimtcl-4cea1cdea06a9ff18f485a54c65c804903da63b9.tar.gz jimtcl-4cea1cdea06a9ff18f485a54c65c804903da63b9.tar.bz2 |
core: improve the Jim_Stack API
Now the optional free element function is passed on init
and is automatically used to free elements on free.
Naming is also now consistent as Jim_Stack*
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-load.c | 33 | ||||
-rw-r--r-- | jim.c | 40 | ||||
-rw-r--r-- | jim.h | 10 |
3 files changed, 33 insertions, 50 deletions
@@ -21,7 +21,20 @@ #define RTLD_LOCAL 0 #endif -static void JimFreeLoadHandles(Jim_Interp *interp, void *data); +static void JimFreeOneLoadHandle(void *handle) +{ + dlclose(handle); +} + +static void JimFreeLoadHandles(Jim_Interp *interp, void *data) +{ + Jim_Stack *handles = data; + + if (handles) { + Jim_StackFree(handles); + Jim_Free(handles); + } +} /** * Note that Jim_LoadLibrary() requires a path to an existing file. @@ -72,7 +85,7 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) Jim_Stack *loadHandles = Jim_GetAssocData(interp, "load::handles"); if (loadHandles == NULL) { loadHandles = Jim_Alloc(sizeof(*loadHandles)); - Jim_InitStack(loadHandles); + Jim_StackInit(loadHandles, JimFreeOneLoadHandle); Jim_SetAssocData(interp, "load::handles", JimFreeLoadHandles, loadHandles); } Jim_StackPush(loadHandles, handle); @@ -88,22 +101,6 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) return JIM_ERR; } -static void JimFreeOneLoadHandle(void *handle) -{ - dlclose(handle); -} - -static void JimFreeLoadHandles(Jim_Interp *interp, void *data) -{ - Jim_Stack *handles = data; - - if (handles) { - Jim_FreeStackElements(handles, JimFreeOneLoadHandle); - Jim_FreeStack(handles); - Jim_Free(handles); - } -} - #else /* JIM_DYNLIB */ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) { @@ -1167,21 +1167,24 @@ static const Jim_HashTableType JimAssocDataHashTableType = { * Stack - This is a simple generic stack implementation. It is used for * example in the 'expr' expression compiler. * ---------------------------------------------------------------------------*/ -void Jim_InitStack(Jim_Stack *stack) +void Jim_StackInit(Jim_Stack *stack, void (*freefunc) (void *ptr)) { stack->len = 0; stack->maxlen = 0; stack->vector = NULL; + stack->freefunc = freefunc; } -void Jim_FreeStack(Jim_Stack *stack) +void Jim_StackFree(Jim_Stack *stack) { - Jim_Free(stack->vector); -} + int i; -int Jim_StackLen(Jim_Stack *stack) -{ - return stack->len; + if (stack->freefunc) { + for (i = 0; i < stack->len; i++) { + stack->freefunc(stack->vector[i]); + } + } + Jim_Free(stack->vector); } void Jim_StackPush(Jim_Stack *stack, void *element) @@ -1204,21 +1207,6 @@ void *Jim_StackPop(Jim_Stack *stack) return stack->vector[stack->len]; } -void *Jim_StackPeek(Jim_Stack *stack) -{ - if (stack->len == 0) - return NULL; - return stack->vector[stack->len - 1]; -} - -void Jim_FreeStackElements(Jim_Stack *stack, void (*freeFunc) (void *ptr)) -{ - int i; - - for (i = 0; i < stack->len; i++) - freeFunc(stack->vector[i]); -} - /* ----------------------------------------------------------------------------- * Tcl Parser * ---------------------------------------------------------------------------*/ @@ -5221,7 +5209,7 @@ static int JimDeleteLocalProcs(Jim_Interp *interp, Jim_Stack *localCommands) } Jim_DecrRefCount(interp, cmdNameObj); } - Jim_FreeStack(localCommands); + Jim_StackFree(localCommands); Jim_Free(localCommands); } return JIM_OK; @@ -9756,7 +9744,7 @@ static struct ExprTree *ExprTreeCreateTree(Jim_Interp *interp, const ParseTokenL builder.nodes = Jim_Alloc(sizeof(struct JimExprNode) * (tokenlist->count - 1)); memset(builder.nodes, 0, sizeof(struct JimExprNode) * (tokenlist->count - 1)); builder.next = builder.nodes; - Jim_InitStack(&builder.stack); + Jim_StackInit(&builder.stack, NULL); rc = ExprTreeBuildTree(interp, &builder, 0, 0, 1); @@ -9770,7 +9758,7 @@ static struct ExprTree *ExprTreeCreateTree(Jim_Interp *interp, const ParseTokenL } /* Free the stack used for the compilation. */ - Jim_FreeStack(&builder.stack); + Jim_StackFree(&builder.stack); if (rc != JIM_OK) { ExprTreeFreeNodes(interp, builder.nodes, builder.next - builder.nodes); @@ -14190,7 +14178,7 @@ static int Jim_LocalCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar } if (interp->framePtr->localCommands == NULL) { interp->framePtr->localCommands = Jim_Alloc(sizeof(*interp->framePtr->localCommands)); - Jim_InitStack(interp->framePtr->localCommands); + Jim_StackInit(interp->framePtr->localCommands, NULL); } Jim_IncrRefCount(cmdNameObj); Jim_StackPush(interp->framePtr->localCommands, cmdNameObj); @@ -183,6 +183,7 @@ typedef struct Jim_Stack { int len; int maxlen; void **vector; + void (*freefunc) (void *ptr); } Jim_Stack; /* ----------------------------------------------------------------------------- @@ -703,13 +704,10 @@ JIM_EXPORT void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, /* stack */ -JIM_EXPORT void Jim_InitStack(Jim_Stack *stack); -JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack); -JIM_EXPORT int Jim_StackLen(Jim_Stack *stack); +JIM_EXPORT void Jim_StackInit(Jim_Stack *stack, void (*freefunc) (void *ptr)); +JIM_EXPORT void Jim_StackFree(Jim_Stack *stack); JIM_EXPORT void Jim_StackPush(Jim_Stack *stack, void *element); -JIM_EXPORT void * Jim_StackPop(Jim_Stack *stack); -JIM_EXPORT void * Jim_StackPeek(Jim_Stack *stack); -JIM_EXPORT void Jim_FreeStackElements(Jim_Stack *stack, void (*freeFunc)(void *ptr)); +JIM_EXPORT void *Jim_StackPop(Jim_Stack *stack); /* hash table */ JIM_EXPORT int Jim_InitHashTable (Jim_HashTable *ht, |