chiark
/
gitweb
/
~ian
/
chiark-tcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
default resolvers
[chiark-tcl.git]
/
base
/
scriptinv.c
diff --git
a/base/scriptinv.c
b/base/scriptinv.c
index b27654e8b41827192966642af16480394a699346..cdaec8b3011af0f8610623b75a9b687932483df0 100644
(file)
--- a/
base/scriptinv.c
+++ b/
base/scriptinv.c
@@
-14,16
+14,23
@@
void scriptinv_cancel(ScriptToInvoke *si) {
}
}
}
}
-int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, Tcl_Obj *newscript) {
- int rc;
+int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip,
+ Tcl_Obj *newscript, Tcl_Obj *xargs) {
+ int rc, xlength;
scriptinv_cancel(si);
scriptinv_cancel(si);
- rc= Tcl_ListObjLength(ip, newscript, &si->llength);
- if (rc) return rc;
-
+ rc= Tcl_ListObjLength(ip, newscript, &si->llength); if (rc) return rc;
Tcl_IncrRefCount(newscript);
Tcl_IncrRefCount(newscript);
+
+ if (xargs) {
+ rc= Tcl_ListObjLength(ip, xargs, &xlength); if (rc) return rc;
+ Tcl_IncrRefCount(xargs);
+ si->llength += xlength;
+ }
+
si->obj= newscript;
si->obj= newscript;
+ si->xargs= xargs;
si->ip= ip;
return 0;
}
si->ip= ip;
return 0;
}
@@
-35,10
+42,16
@@
void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv) {
assert(si->obj);
for (i=0; i<argc; i++) Tcl_IncrRefCount(argv[i]);
assert(si->obj);
for (i=0; i<argc; i++) Tcl_IncrRefCount(argv[i]);
+
invoke= Tcl_DuplicateObj(si->obj);
Tcl_IncrRefCount(invoke);
invoke= Tcl_DuplicateObj(si->obj);
Tcl_IncrRefCount(invoke);
- rc= Tcl_ListObjReplace(si->ip,invoke,si->llength,0,argc,argv);
+ if (si->xargs) {
+ rc= Tcl_ListObjAppendList(si->ip, invoke, si->xargs);
+ if (rc) goto x_rc;
+ }
+
+ 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;
for (i=0; i<argc; i++) { Tcl_DecrRefCount(argv[i]); argv[i]= 0; }
if (rc) goto x_rc;