summaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2014-01-27 12:43:11 +1000
committerSteve Bennett <steveb@workware.net.au>2014-01-27 12:43:11 +1000
commitcc40852e8730ec995d9bb12980e6242831fa1f49 (patch)
treed3f3b53d6d76de91e26953787c346ebd92b406c2 /jim.c
parentcbd44b0c4e94000763307c8ec50ae30f89d35173 (diff)
jim.c: properly free cached callframes
Commit 87ea45c91e removed the code to free cached callframes when the interpreter is freed. Restore that code. Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/jim.c b/jim.c
index 3790d47..590cc7c 100644
--- a/jim.c
+++ b/jim.c
@@ -5439,15 +5439,14 @@ Jim_Interp *Jim_CreateInterp(void)
void Jim_FreeInterp(Jim_Interp *i)
{
- Jim_CallFrame *cf = i->framePtr, *prevcf;
+ Jim_CallFrame *cf, *cfx;
+
Jim_Obj *objPtr, *nextObjPtr;
- /* Free the call frames list - must be done before i->commands is destroyed */
- while (cf) {
- prevcf = cf->parent;
+ /* Free the active call frames list - must be done before i->commands is destroyed */
+ for (cf = i->framePtr; cf; cf = cfx) {
+ cfx = cf->parent;
JimFreeCallFrame(i, cf, JIM_FCF_FULL);
- Jim_Free(cf);
- cf = prevcf;
}
Jim_DecrRefCount(i, i->emptyObj);
@@ -5507,6 +5506,14 @@ void Jim_FreeInterp(Jim_Interp *i)
objPtr = nextObjPtr;
}
+ /* Free the free call frames list */
+ for (cf = i->freeFramesList; cf; cf = cfx) {
+ cfx = cf->next;
+ if (cf->vars.table)
+ Jim_FreeHashTable(&cf->vars);
+ Jim_Free(cf);
+ }
+
/* Free the interpreter structure. */
Jim_Free(i);
}