aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jim-load.c26
-rw-r--r--jim.c15
-rw-r--r--jim.h3
3 files changed, 43 insertions, 1 deletions
diff --git a/jim-load.c b/jim-load.c
index 8877260..bb14260 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -63,7 +63,15 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
"No %s symbol found in extension %s", initsym, pathName);
}
else if (onload(interp) != JIM_ERR) {
+ /* Add this handle to the stack of handles to be freed */
+ if (!interp->loadHandles) {
+ interp->loadHandles = Jim_Alloc(sizeof(*interp->loadHandles));
+ Jim_InitStack(interp->loadHandles);
+ }
+ Jim_StackPush(interp->loadHandles, handle);
+
Jim_SetEmptyResult(interp);
+
return JIM_OK;
}
}
@@ -72,6 +80,20 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
}
return JIM_ERR;
}
+
+static void JimFreeOneLoadHandle(void *handle)
+{
+ dlclose(handle);
+}
+
+void Jim_FreeLoadHandles(Jim_Interp *interp)
+{
+ if (interp->loadHandles) {
+ Jim_FreeStackElements(interp->loadHandles, JimFreeOneLoadHandle);
+ Jim_Free(interp->loadHandles);
+ }
+}
+
#else /* JIM_DYNLIB */
int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
{
@@ -81,6 +103,10 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
Jim_SetResultString(interp, "the Jim binary has no support for [load]", -1);
return JIM_ERR;
}
+
+void Jim_FreeLoadHandles(Jim_Interp *interp)
+{
+}
#endif /* JIM_DYNLIB */
/* [load] */
diff --git a/jim.c b/jim.c
index b7f8714..5421e62 100644
--- a/jim.c
+++ b/jim.c
@@ -1054,6 +1054,14 @@ void *Jim_StackPeek(Jim_Stack *stack)
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]);
+}
+
/* -----------------------------------------------------------------------------
* Parser
* ---------------------------------------------------------------------------*/
@@ -4817,6 +4825,7 @@ Jim_Interp *Jim_CreateInterp(void)
i->signal_level = 0;
i->signal_set_result = NULL;
i->localProcs = NULL;
+ i->loadHandles = NULL;
/* Note that we can create objects only after the
* interpreter liveList and freeList pointers are
@@ -4880,9 +4889,9 @@ void Jim_FreeInterp(Jim_Interp *i)
#ifdef JIM_REFERENCES
Jim_FreeHashTable(&i->references);
#endif
- Jim_FreeHashTable(&i->assocData);
Jim_FreeHashTable(&i->packages);
Jim_Free(i->prngState);
+ Jim_FreeHashTable(&i->assocData);
JimDeleteLocalProcs(i);
/* Free the call frames list */
@@ -4929,6 +4938,10 @@ void Jim_FreeInterp(Jim_Interp *i)
Jim_Free(cf);
cf = nextcf;
}
+#ifdef jim_ext_load
+ Jim_FreeLoadHandles(i);
+#endif
+
/* Free the sharedString hash table. Make sure to free it
* after every other Jim_Object was freed. */
Jim_FreeHashTable(&i->sharedStrings);
diff --git a/jim.h b/jim.h
index 4106f96..4d4a892 100644
--- a/jim.h
+++ b/jim.h
@@ -554,6 +554,7 @@ typedef struct Jim_Interp {
Jim_PrngState *prngState; /* per interpreter Random Number Gen. state. */
struct Jim_HashTable packages; /* Provided packages hash table */
Jim_Stack *localProcs; /* procs to be destroyed on end of evaluation */
+ Jim_Stack *loadHandles; /* handles of loaded modules [load] */
} Jim_Interp;
/* Currently provided as macro that performs the increment.
@@ -647,6 +648,7 @@ JIM_EXPORT int Jim_StackLen(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));
/* hash table */
JIM_EXPORT int Jim_InitHashTable (Jim_HashTable *ht,
@@ -880,6 +882,7 @@ JIM_EXPORT int Jim_StringToWide(const char *str, jim_wide *widePtr, int base);
/* jim-load.c */
JIM_EXPORT int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName);
+JIM_EXPORT void Jim_FreeLoadHandles(Jim_Interp *interp);
/* jim-aio.c */
JIM_EXPORT FILE *Jim_AioFilehandle(Jim_Interp *interp, Jim_Obj *command);