chiark / gitweb /
scriptinv is correct about not leaking xargs. do not pointlessly trash the args...
authorian <ian>
Sun, 19 Dec 2004 20:34:52 +0000 (20:34 +0000)
committerian <ian>
Sun, 19 Dec 2004 20:34:52 +0000 (20:34 +0000)
base/chiark-tcl.h
base/scriptinv.c
hbytes/hbytes.h

index 875b23911402d6e6e72edf8b50b83190764971d2..1bf433bb77e89bf1ef8744498cede5eb0a4242e4 100644 (file)
@@ -212,7 +212,7 @@ int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
 void scriptinv_cancel(ScriptToInvoke *si); /* then don't invoke */
   /* no separate free function - just cancel */
 
-void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv);
+void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv);
 
 /* from idtable.c */
 
index cdaec8b3011af0f8610623b75a9b687932483df0..482f4877e6f2683651aa2fadc665ab8938ed16e9 100644 (file)
@@ -5,13 +5,12 @@
 
 void scriptinv_init(ScriptToInvoke *si) {
   si->obj= 0;
+  si->xargs= 0;
 }
 
 void scriptinv_cancel(ScriptToInvoke *si) {
-  if (si->obj) {
-    Tcl_DecrRefCount(si->obj);
-    si->obj= 0;
-  }
+  if (si->obj) { Tcl_DecrRefCount(si->obj); si->obj= 0; }
+  if (si->xargs) { Tcl_DecrRefCount(si->xargs); si->xargs= 0; }
 }
 
 int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
@@ -35,12 +34,11 @@ int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
   return 0;
 }  
   
-void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
+void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv) {
   Tcl_Obj *invoke=0;
   int i, rc;
 
   assert(si->obj);
-
   for (i=0; i<argc; i++) Tcl_IncrRefCount(argv[i]);
 
   invoke= Tcl_DuplicateObj(si->obj);
@@ -52,7 +50,6 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
   }
 
   rc= Tcl_ListObjReplace(si->ip, invoke,si->llength,0, argc,argv);
-  for (i=0; i<argc; i++) { Tcl_DecrRefCount(argv[i]); argv[i]= 0; }
   if (rc) goto x_rc;
 
   rc= Tcl_EvalObjEx(si->ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
@@ -61,6 +58,7 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
   rc= 0;
   
 x_rc:
+  for (i=0; i<argc; i++) Tcl_DecrRefCount(argv[i]);
   if (invoke) Tcl_DecrRefCount(invoke);
   if (rc) Tcl_BackgroundError(si->ip);
 }
index 875b23911402d6e6e72edf8b50b83190764971d2..1bf433bb77e89bf1ef8744498cede5eb0a4242e4 100644 (file)
@@ -212,7 +212,7 @@ int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
 void scriptinv_cancel(ScriptToInvoke *si); /* then don't invoke */
   /* no separate free function - just cancel */
 
-void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv);
+void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv);
 
 /* from idtable.c */