aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2014-01-11 19:06:06 +1000
committerSteve Bennett <steveb@workware.net.au>2014-01-15 11:23:30 +1000
commit87ea45c91e2e64d88e6faf1fb40882ac97f4ee9b (patch)
treef0f4405bc94e50fec2fda06f8d8254dce5881f89
parent2cc893faaa8532600fe98182f586842b0a0d6e4d (diff)
downloadjimtcl-87ea45c91e2e64d88e6faf1fb40882ac97f4ee9b.zip
jimtcl-87ea45c91e2e64d88e6faf1fb40882ac97f4ee9b.tar.gz
jimtcl-87ea45c91e2e64d88e6faf1fb40882ac97f4ee9b.tar.bz2
jim.c: Simplify calls to JimFreeCallFrame()
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c47
1 files changed, 13 insertions, 34 deletions
diff --git a/jim.c b/jim.c
index 517fd05..a6d9ac6 100644
--- a/jim.c
+++ b/jim.c
@@ -127,7 +127,7 @@ static char JimEmptyStringRep[] = "";
* Required prototypes of not exported functions
* ---------------------------------------------------------------------------*/
static void JimChangeCallFrameId(Jim_Interp *interp, Jim_CallFrame *cf);
-static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags);
+static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int action);
static int ListSetIndex(Jim_Interp *interp, Jim_Obj *listPtr, int listindex, Jim_Obj *newObjPtr,
int flags);
static int JimDeleteLocalProcs(Jim_Interp *interp, Jim_Stack *localCommands);
@@ -877,7 +877,7 @@ int Jim_DeleteHashEntry(Jim_HashTable *ht, const void *key)
return JIM_ERR; /* not found */
}
-/* Destroy an entire hash table */
+/* Destroy an entire hash table and leave it ready for reuse */
int Jim_FreeHashTable(Jim_HashTable *ht)
{
unsigned int i;
@@ -4942,16 +4942,18 @@ static int JimDeleteLocalProcs(Jim_Interp *interp, Jim_Stack *localCommands)
}
-#define JIM_FCF_NONE 0 /* no flags */
-#define JIM_FCF_NOHT 1 /* don't free the hash table */
-static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags)
-{
+#define JIM_FCF_FULL 0 /* Always free the vars hash table */
+#define JIM_FCF_REUSE 1 /* Reuse the vars hash table if possible */
+static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int action)
+ {
+ JimDeleteLocalProcs(interp, cf->localCommands);
+
if (cf->procArgsObjPtr)
Jim_DecrRefCount(interp, cf->procArgsObjPtr);
if (cf->procBodyObjPtr)
Jim_DecrRefCount(interp, cf->procBodyObjPtr);
Jim_DecrRefCount(interp, cf->nsObj);
- if (!(flags & JIM_FCF_NOHT))
+ if (action == JIM_FCF_FULL || cf->vars.size != JIM_HT_INITIAL_SIZE)
Jim_FreeHashTable(&cf->vars);
else {
int i;
@@ -4973,12 +4975,8 @@ static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags)
}
cf->vars.used = 0;
}
-
- JimDeleteLocalProcs(interp, cf->localCommands);
-
cf->next = interp->freeFramesList;
interp->freeFramesList = cf;
-
}
@@ -5464,7 +5462,8 @@ void Jim_FreeInterp(Jim_Interp *i)
/* Free the call frames list - must be done before i->commands is destroyed */
while (cf) {
prevcf = cf->parent;
- JimFreeCallFrame(i, cf, JIM_FCF_NONE);
+ JimFreeCallFrame(i, cf, JIM_FCF_FULL);
+ Jim_Free(cf);
cf = prevcf;
}
@@ -5525,15 +5524,6 @@ void Jim_FreeInterp(Jim_Interp *i)
Jim_Free(objPtr);
objPtr = nextObjPtr;
}
- /* Free cached CallFrame structures */
- cf = i->freeFramesList;
- while (cf) {
- nextcf = cf->next;
- if (cf->vars.table != NULL)
- Jim_Free(cf->vars.table);
- Jim_Free(cf);
- cf = nextcf;
- }
/* Free the interpreter structure. */
Jim_Free(i);
@@ -10801,12 +10791,7 @@ int Jim_EvalNamespace(Jim_Interp *interp, Jim_Obj *scriptObj, Jim_Obj *nsObj)
/* Destroy the callframe */
interp->framePtr = interp->framePtr->parent;
- if (callFramePtr->vars.size != JIM_HT_INITIAL_SIZE) {
- JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NONE);
- }
- else {
- JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NOHT);
- }
+ JimFreeCallFrame(interp, callFramePtr, JIM_FCF_REUSE);
return retcode;
}
@@ -10910,13 +10895,7 @@ badargset:
/* Free the callframe */
interp->framePtr = interp->framePtr->parent;
-
- if (callFramePtr->vars.size != JIM_HT_INITIAL_SIZE) {
- JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NONE);
- }
- else {
- JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NOHT);
- }
+ JimFreeCallFrame(interp, callFramePtr, JIM_FCF_REUSE);
if (interp->framePtr->tailcallObj) {
/* If a tailcall is already being executed, merge this tailcall with that one */