summaryrefslogtreecommitdiffstats
path: root/generic/tclStubLib.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-11-18 16:54:16 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-11-18 16:54:16 (GMT)
commit592d64c6569bf3d85d3797d35a18183d7ff9d098 (patch)
tree20a28653fdf0173a19fcd6b9cfda564cb6cbab77 /generic/tclStubLib.c
parent7655c307f652206c12c3b5b2b2dd4953c12c5384 (diff)
downloadtcl-592d64c6569bf3d85d3797d35a18183d7ff9d098.zip
tcl-592d64c6569bf3d85d3797d35a18183d7ff9d098.tar.gz
tcl-592d64c6569bf3d85d3797d35a18183d7ff9d098.tar.bz2
<i>On-hold at Don Porter's request.</i> on_hold_84
change stub library to detect - and generate a nice error-message - when a shared library compiled for Tcl 8.x is attempted to be loaded in Tcl 9.x: Tcl 9 will not have the iPtr->result field so we cannot use that any more.
Diffstat (limited to 'generic/tclStubLib.c')
-rw-r--r--generic/tclStubLib.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c
index 1ab7ff3..b204306 100644
--- a/generic/tclStubLib.c
+++ b/generic/tclStubLib.c
@@ -38,19 +38,40 @@ TclIntPlatStubs *tclIntPlatStubsPtr = NULL;
static TclStubs * HasStubSupport _ANSI_ARGS_((Tcl_Interp *interp));
+typedef Tcl_Obj *(NewStringObjProc) _ANSI_ARGS_((CONST char *bytes,
+ size_t length));
+
+
static TclStubs *
HasStubSupport (interp)
Tcl_Interp *interp;
{
Interp *iPtr = (Interp *) interp;
- if (iPtr->stubTable && (iPtr->stubTable->magic == TCL_STUB_MAGIC)) {
- return iPtr->stubTable;
+ if (!iPtr->stubTable) {
+ /* No stub table at all? Nothing we can do. */
+ return NULL;
}
- interp->result = "This interpreter does not support stubs-enabled extensions.";
- interp->freeProc = TCL_STATIC;
-
- return NULL;
+ if (iPtr->stubTable->magic != TCL_STUB_MAGIC) {
+ /*
+ * We cannot acces interp->result and interp->freeProc
+ * any more: They will be gone in Tcl 9. In stead,
+ * assume that the iPtr->stubTable entry from Tcl_Interp
+ * and the Tcl_NewStringObj() and Tcl_SetObjResult() entries
+ * in the stub table don't change in Tcl 9. Need to add
+ * a test-case in Tcl 9 to assure that.
+ *
+ * The signature of Tcl_NewStringObj will change: the length
+ * parameter will be of type size_t. But passing the value
+ * (size_t)-1 will work, whatever the signature will be.
+ */
+ NewStringObjProc *newStringObj = (NewStringObjProc *)
+ iPtr->stubTable->tcl_NewStringObj;
+ iPtr->stubTable->tcl_SetObjResult(interp, newStringObj(
+ "This extension is compiled for Tcl 8.x", (size_t)-1));
+ return NULL;
+ }
+ return iPtr->stubTable;
}
/*