aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2023-06-29 14:15:07 +1000
committerSteve Bennett <steveb@workware.net.au>2025-07-16 09:34:08 +1000
commit4cea1cdea06a9ff18f485a54c65c804903da63b9 (patch)
tree8c0aeb060228d5068d52fd9d8fee824f17805e05
parente5faa1eb5d11ca5c26ee3f28f5377a1dbdaad23e (diff)
downloadjimtcl-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.c33
-rw-r--r--jim.c40
-rw-r--r--jim.h10
3 files changed, 33 insertions, 50 deletions
diff --git a/jim-load.c b/jim-load.c
index 480d677..f3f23d0 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -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)
{
diff --git a/jim.c b/jim.c
index 64b0c50..e50c20a 100644
--- a/jim.c
+++ b/jim.c
@@ -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);
diff --git a/jim.h b/jim.h
index 083cb0f..8a0ae1e 100644
--- a/jim.h
+++ b/jim.h
@@ -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,