diff options
-rw-r--r-- | jim-load.c | 26 | ||||
-rw-r--r-- | jim.c | 15 | ||||
-rw-r--r-- | jim.h | 3 |
3 files changed, 43 insertions, 1 deletions
@@ -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] */ @@ -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); @@ -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); |