diff options
author | Steve Bennett <steveb@workware.net.au> | 2014-01-27 12:43:11 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2014-01-27 12:43:11 +1000 |
commit | cc40852e8730ec995d9bb12980e6242831fa1f49 (patch) | |
tree | d3f3b53d6d76de91e26953787c346ebd92b406c2 /jim.c | |
parent | cbd44b0c4e94000763307c8ec50ae30f89d35173 (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.c | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -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); } |