diff options
Diffstat (limited to 'generic/tclStubLib.c')
| -rw-r--r-- | generic/tclStubLib.c | 46 | 
1 files changed, 12 insertions, 34 deletions
| diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c index f569820..859cbf9 100644 --- a/generic/tclStubLib.c +++ b/generic/tclStubLib.c @@ -11,15 +11,6 @@   * this file, and for a DISCLAIMER OF ALL WARRANTIES.   */ -/* - * We need to ensure that we use the stub macros so that this file contains no - * references to any of the stub functions. This will make it possible to - * build an extension that references Tcl_InitStubs but doesn't end up - * including the rest of the stub functions. - */ - -#define USE_TCL_STUBS -  #include "tclInt.h"  MODULE_SCOPE const TclStubs *tclStubsPtr; @@ -32,24 +23,8 @@ const TclPlatStubs *tclPlatStubsPtr = NULL;  const TclIntStubs *tclIntStubsPtr = NULL;  const TclIntPlatStubs *tclIntPlatStubsPtr = NULL; -static const TclStubs * -HasStubSupport( -    Tcl_Interp *interp) -{ -    Interp *iPtr = (Interp *) interp; - -    if (iPtr->stubTable && (iPtr->stubTable->magic == TCL_STUB_MAGIC)) { -	return iPtr->stubTable; -    } - -    iPtr->result = -	    (char *)"This interpreter does not support stubs-enabled extensions."; -    iPtr->freeProc = TCL_STATIC; -    return NULL; -} -  /* - * Use our own isdigit to avoid linking to libc on windows + * Use our own isDigit to avoid linking to libc on windows   */  static int isDigit(const int c) @@ -74,15 +49,17 @@ static int isDigit(const int c)   *   *----------------------------------------------------------------------   */ - +#undef Tcl_InitStubs  MODULE_SCOPE const char *  Tcl_InitStubs(      Tcl_Interp *interp,      const char *version,      int exact)  { +    Interp *iPtr = (Interp *) interp;      const char *actualVersion = NULL;      ClientData pkgData = NULL; +    const TclStubs *stubsPtr = iPtr->stubTable;      /*       * We can't optimize this check by caching tclStubsPtr because that @@ -90,12 +67,13 @@ Tcl_InitStubs(       * times. [Bug 615304]       */ -    tclStubsPtr = HasStubSupport(interp); -    if (!tclStubsPtr) { +    if (!stubsPtr || (stubsPtr->magic != TCL_STUB_MAGIC)) { +	iPtr->result = "interpreter uses an incompatible stubs mechanism"; +	iPtr->freeProc = TCL_STATIC;  	return NULL;      } -    actualVersion = Tcl_PkgRequireEx(interp, "Tcl", version, 0, &pkgData); +    actualVersion = stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 0, &pkgData);      if (actualVersion == NULL) {  	return NULL;      } @@ -113,19 +91,19 @@ Tcl_InitStubs(  	    while (*p && (*p == *q)) {  		p++; q++;  	    } -	    if (*p) { +	    if (*p || isDigit(*q)) {  		/* Construct error message */ -		Tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL); +		stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL);  		return NULL;  	    }  	} else { -	    actualVersion = Tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL); +	    actualVersion = stubsPtr->tcl_PkgRequireEx(interp, "Tcl", version, 1, NULL);  	    if (actualVersion == NULL) {  		return NULL;  	    }  	}      } -    tclStubsPtr = (TclStubs *) pkgData; +    tclStubsPtr = (TclStubs *)pkgData;      if (tclStubsPtr->hooks) {  	tclPlatStubsPtr = tclStubsPtr->hooks->tclPlatStubs; | 
