summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2013-03-26 15:57:45 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2013-03-26 15:57:45 (GMT)
commit9ff27d9770c73b844da4165fe4512f16453e2b89 (patch)
tree600abdc9bc2814441b3186bdc57d9a80039fdfbe
parent555d9b42ae752e2209d03200ccfd44be8b394e42 (diff)
downloadtcl-9ff27d9770c73b844da4165fe4512f16453e2b89.zip
tcl-9ff27d9770c73b844da4165fe4512f16453e2b89.tar.gz
tcl-9ff27d9770c73b844da4165fe4512f16453e2b89.tar.bz2
Looks like TCL_INIT_CUSTOM (previously known as TCL_INIT_STUFF) is not a bad idea at all,
provided it has a Tcl_Interp* argument as well, so it can initialize the stub table. A typedef for the function is not necessary, as a variable-argument function doesn't do any type checking. It's for the experienced developer anyway.
-rw-r--r--doc/InitSubSyst.316
-rw-r--r--generic/tcl.h2
-rw-r--r--generic/tclEncoding.c10
3 files changed, 16 insertions, 12 deletions
diff --git a/doc/InitSubSyst.3 b/doc/InitSubSyst.3
index 4a3dc64..db3951e 100644
--- a/doc/InitSubSyst.3
+++ b/doc/InitSubSyst.3
@@ -19,7 +19,7 @@ Tcl_Interp *
.AS int flags
.AP int flags in
Any combination of flags which might modify the initialization sequence.
-At this moment, only 0, \fBTCL_INIT_PANIC\fR and \fBTCL_INIT_STUFF\fR
+At this moment, only 0, \fBTCL_INIT_PANIC\fR and \fBTCL_INIT_CUSTOM\fR
(or a combination) are supported.
The value 0 can be used if Tcl is used as utility library only.
.BE
@@ -75,13 +75,15 @@ could call \fBTcl_SetPanicProc\fR immediately after \fBTcl_InitSubsystems\fR,
but then panics which could be produced by the initialization
itself still use the default panic procedure.
.PP
-If you supply the flag \fBTCL_INIT_STUFF\fR to \fBTcl_InitSubsystems\fR,
+If you supply the flag \fBTCL_INIT_CUSTOM\fR to \fBTcl_InitSubsystems\fR,
the function expects two additional arguments: ClientData and a
-custom proc with has ClientData as its only argument. The given
-function will be executed just before the encodings are initialized.
+custom proc. The proc will be supplied two arguments, the (pseudo)
+Tcl interpreter and ClientData. The given function will be executed
+just before the encodings are initialized.
.PP
-The interpreter returned by Tcl_InitSubsystems(0) cannot be passed to
-any other function than Tcl_InitStubs(). Tcl functions with an "interp"
-argument can only be called if the function supports passing NULL.
+The interpreter returned by Tcl_InitSubsystems(0) or passed to the
+TCL_INIT_CUSTOM function cannot be passed to any other function than
+Tcl_InitStubs(). Tcl functions with an "interp" argument can only
+be called if the function supports passing NULL.
.SH KEYWORDS
binary, executable file
diff --git a/generic/tcl.h b/generic/tcl.h
index 9325bf2..522171e 100644
--- a/generic/tcl.h
+++ b/generic/tcl.h
@@ -2412,7 +2412,7 @@ const char * TclTomMathInitializeStubs(Tcl_Interp *interp,
/* Tcl_InitSubsystems, see TIP #414 */
#define TCL_INIT_PANIC (1) /* Set Panic proc */
-#define TCL_INIT_STUFF (2) /* Do any stuff before initializing the encoding */
+#define TCL_INIT_CUSTOM (2) /* Do any stuff before initializing the encoding */
EXTERN Tcl_Interp *Tcl_InitSubsystems(int flags, ...);
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index 753222f..9905eaa 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -1446,22 +1446,24 @@ Tcl_Interp *
Tcl_InitSubsystems(int flags, ...)
{
va_list argList;
+ Tcl_Interp *interp = (Tcl_Interp *) &dummyInterp;
va_start(argList, flags);
if (flags & TCL_INIT_PANIC) {
Tcl_SetPanicProc(va_arg(argList, Tcl_PanicProc *));
}
TclInitSubsystems();
- if (flags & TCL_INIT_STUFF) {
+ if (flags & TCL_INIT_CUSTOM) {
ClientData clientData = va_arg(argList, ClientData);
- void (*fn)() = va_arg(argList, void (*)(ClientData));
- fn(clientData);
+ void (*fn)(Tcl_Interp *, ClientData) = va_arg(argList,
+ void (*)(Tcl_Interp *, ClientData));
+ fn(interp, clientData);
}
va_end(argList);
TclpSetInitialEncodings();
TclpFindExecutable(NULL);
- return (Tcl_Interp *) &dummyInterp;
+ return interp;
}
void