Cleanup patches from Greg Stein:

* in import.c, #ifdef out references to dynamic loading based on
  HAVE_DYNAMIC_LOADING

* clean out the platform-specific crud from importdl.c.
  [ maybe fold this function into import.c and drop the importdl.c file? Greg.]

* change GetDynLoadFunc's "funcname" parameter to "shortname". change
  "name" to "fqname" for clarification.

* each GetDynLoadFunc now creates its own funcname value.

  WARNING: as I mentioned previously, we may run into an issue with a
  missing "_" on some platforms. Testing will show this pretty quickly,
  however.

* move pathname munging into dynload_shlib.c
This commit is contained in:
Guido van Rossum 1999-12-22 14:09:35 +00:00
parent 6a90b5e4d0
commit 96a8fb7e99
11 changed files with 64 additions and 75 deletions

View File

@ -202,7 +202,7 @@ aix_loaderror(pathname)
} }
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;

View File

@ -185,13 +185,14 @@ static void beos_add_dyn( char *name, image_id id )
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
image_id the_id; image_id the_id;
status_t retval; status_t retval;
char fullpath[PATH_MAX]; char fullpath[PATH_MAX];
char funcname[258];
if( Py_VerboseFlag ) { if( Py_VerboseFlag ) {
printf( "load_add_on( %s )\n", pathname ); printf( "load_add_on( %s )\n", pathname );
@ -236,6 +237,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname,
return NULL; return NULL;
} }
sprintf(funcname, "init%.200s", shortname);
if( Py_VerboseFlag ) { if( Py_VerboseFlag ) {
printf( "get_image_symbol( %s )\n", funcname ); printf( "get_image_symbol( %s )\n", funcname );
} }
@ -274,7 +276,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname,
/* Save the module name and image ID for later so we can clean up /* Save the module name and image ID for later so we can clean up
* gracefully. * gracefully.
*/ */
beos_add_dyn( name, the_id ); beos_add_dyn( fqname, the_id );
return p; return p;
} }

View File

@ -46,8 +46,11 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
char funcname[258];
sprintf(funcname, "init%.200s", shortname);
return dl_loadmod(Py_GetProgramName(), pathname, funcname); return dl_loadmod(Py_GetProgramName(), pathname, funcname);
} }

View File

@ -37,6 +37,11 @@ PERFORMANCE OF THIS SOFTWARE.
#include "Python.h" #include "Python.h"
#include "importdl.h" #include "importdl.h"
#if defined(__hp9000s300)
#define FUNCNAME_PATTERN "_init%.200s"
#else
#define FUNCNAME_PATTERN "init%.200s"
#endif
const struct filedescr _PyImport_DynLoadFiletab[] = { const struct filedescr _PyImport_DynLoadFiletab[] = {
{".sl", "rb", C_EXTENSION}, {".sl", "rb", C_EXTENSION},
@ -44,12 +49,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
{0, 0} {0, 0}
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
shl_t lib; shl_t lib;
int flags; int flags;
char funcname[258];
flags = BIND_FIRST | BIND_DEFERRED; flags = BIND_FIRST | BIND_DEFERRED;
if (Py_VerboseFlag) { if (Py_VerboseFlag) {
@ -67,6 +73,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname,
PyErr_SetString(PyExc_ImportError, buf); PyErr_SetString(PyExc_ImportError, buf);
return NULL; return NULL;
} }
sprintf(funcname, FUNCNAME_PATTERN, shortname);
if (Py_VerboseFlag) if (Py_VerboseFlag)
printf("shl_findsym %s\n", funcname); printf("shl_findsym %s\n", funcname);
shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p); shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);

View File

@ -59,10 +59,11 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
char funcname[258];
/* /*
** Dynamic loading of CFM shared libraries on the Mac. The ** Dynamic loading of CFM shared libraries on the Mac. The
@ -121,6 +122,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname,
return NULL; return NULL;
} }
/* Locate the address of the correct init function */ /* Locate the address of the correct init function */
sprintf(funcname, "init%.200s", shortname);
err = FindSymbol(connID, Pstring(funcname), &symAddr, &class); err = FindSymbol(connID, Pstring(funcname), &symAddr, &class);
if ( err ) { if ( err ) {
sprintf(buf, "%s: %.200s", sprintf(buf, "%s: %.200s",

View File

@ -68,10 +68,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
{0, 0} {0, 0}
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p = NULL; dl_funcptr p = NULL;
char funcname[258];
sprintf(funcname, "_init%.200s", shortname);
#ifdef USE_RLD #ifdef USE_RLD
{ {

View File

@ -45,13 +45,14 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
{0, 0} {0, 0}
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
APIRET rc; APIRET rc;
HMODULE hDLL; HMODULE hDLL;
char failreason[256]; char failreason[256];
char funcname[258];
rc = DosLoadModule(failreason, rc = DosLoadModule(failreason,
sizeof(failreason), sizeof(failreason),
@ -67,6 +68,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname,
return NULL; return NULL;
} }
sprintf(funcname, "init%.200s", shortname);
rc = DosQueryProcAddr(hDLL, 0L, funcname, &p); rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
if (rc != NO_ERROR) if (rc != NO_ERROR)
p = NULL; /* Signify Failure to Acquire Entrypoint */ p = NULL; /* Signify Failure to Acquire Entrypoint */

View File

@ -65,11 +65,22 @@ static struct {
static int nhandles = 0; static int nhandles = 0;
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
void *handle; void *handle;
char funcname[258];
char pathbuf[260];
if (strchr(pathname, '/') == NULL) {
/* Prefix bare filename with "./" */
sprintf(pathbuf, "./%-.255s", pathname);
pathname = pathbuf;
}
/* ### should there be a leading underscore for some platforms? */
sprintf(funcname, "init%.200s", shortname);
if (fp != NULL) { if (fp != NULL) {
int i; int i;

View File

@ -49,10 +49,13 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
}; };
dl_funcptr _PyImport_GetDynLoadFunc(const char *name, const char *funcname, dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp) const char *pathname, FILE *fp)
{ {
dl_funcptr p; dl_funcptr p;
char funcname[258];
sprintf(funcname, "init%.200s", shortname);
#ifdef MS_WIN32 #ifdef MS_WIN32
{ {

View File

@ -1234,9 +1234,11 @@ load_module(name, fp, buf, type)
m = load_compiled_module(name, buf, fp); m = load_compiled_module(name, buf, fp);
break; break;
#ifdef HAVE_DYNAMIC_LOADING
case C_EXTENSION: case C_EXTENSION:
m = _PyImport_LoadDynamicModule(name, buf, fp); m = _PyImport_LoadDynamicModule(name, buf, fp);
break; break;
#endif
#ifdef macintosh #ifdef macintosh
case PY_RESOURCE: case PY_RESOURCE:
@ -2158,6 +2160,8 @@ imp_load_compiled(self, args)
return m; return m;
} }
#ifdef HAVE_DYNAMIC_LOADING
static PyObject * static PyObject *
imp_load_dynamic(self, args) imp_load_dynamic(self, args)
PyObject *self; PyObject *self;
@ -2180,6 +2184,8 @@ imp_load_dynamic(self, args)
return m; return m;
} }
#endif /* HAVE_DYNAMIC_LOADING */
static PyObject * static PyObject *
imp_load_source(self, args) imp_load_source(self, args)
PyObject *self; PyObject *self;
@ -2330,7 +2336,9 @@ static PyMethodDef imp_methods[] = {
{"is_builtin", imp_is_builtin, 1}, {"is_builtin", imp_is_builtin, 1},
{"is_frozen", imp_is_frozen, 1}, {"is_frozen", imp_is_frozen, 1},
{"load_compiled", imp_load_compiled, 1}, {"load_compiled", imp_load_compiled, 1},
#ifdef HAVE_DYNAMIC_LOADING
{"load_dynamic", imp_load_dynamic, 1}, {"load_dynamic", imp_load_dynamic, 1},
#endif
{"load_package", imp_load_package, 1}, {"load_package", imp_load_package, 1},
#ifdef macintosh #ifdef macintosh
{"load_resource", imp_load_resource, 1}, {"load_resource", imp_load_resource, 1},

View File

@ -30,59 +30,22 @@ PERFORMANCE OF THIS SOFTWARE.
******************************************************************/ ******************************************************************/
/* Support for dynamic loading of extension modules */ /* Support for dynamic loading of extension modules */
/* If no dynamic linking is supported, this file still generates some code! */
#include "Python.h" #include "Python.h"
#include "importdl.h"
/* Explanation of some of the the various #defines used by dynamic linking... /* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
supported on this platform. configure will then compile and link in one
symbol -- defined for: of the dynload_*.c files, as appropriate. We will call a function in
those modules to get a function pointer to the module's init function.
HAVE_DYNAMIC_LOADING -- any kind of dynamic linking (from ./configure)
USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
_AIX -- AIX style dynamic linking
__NetBSD__ -- NetBSD shared libraries
(assuming dlerror() was introduced between 1.2 and 1.3)
__BEOS__ -- BeOS shared libraries - defined by the compiler
*/ */
/* Configure dynamic linking */
#ifdef HAVE_DYNAMIC_LOADING #ifdef HAVE_DYNAMIC_LOADING
#include "importdl.h"
extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name, extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
const char *funcname, const char *shortname,
const char *pathname, FILE *fp); const char *pathname, FILE *fp);
/* ### given NeXT, is WITH_DYLD not necessary? */
#if defined(__hp9000s300) || (defined(__NetBSD__) || defined(__FreeBSD__)) && !defined(__ELF__) || defined(__OpenBSD__) || defined(__BORLANDC__) || defined(NeXT) || defined(WITH_DYLD)
#define FUNCNAME_PATTERN "_init%.200s"
#else
#define FUNCNAME_PATTERN "init%.200s"
#endif
/* ### temporary, for setting USE_SHLIB */
#if defined(__NetBSD__) && (NetBSD < 199712)
#define USE_SHLIB
#else
#if defined(HAVE_DLOPEN) || defined(M_UNIX)
#define USE_SHLIB
#endif
#endif
#ifdef _AIX
#undef USE_SHLIB
#endif
#ifdef __BEOS__
#undef USE_SHLIB
#endif
#endif /* HAVE_DYNAMIC_LOADING */
#ifdef NO_DYNAMIC_LINK
#undef HAVE_DYNAMIC_LOADING
#endif
PyObject * PyObject *
@ -91,24 +54,9 @@ _PyImport_LoadDynamicModule(name, pathname, fp)
char *pathname; char *pathname;
FILE *fp; FILE *fp;
{ {
#ifndef HAVE_DYNAMIC_LOADING
PyErr_SetString(PyExc_ImportError,
"dynamically linked modules not supported");
return NULL;
#else
PyObject *m, *d, *s; PyObject *m, *d, *s;
char funcname[258];
char *lastdot, *shortname, *packagecontext; char *lastdot, *shortname, *packagecontext;
dl_funcptr p = NULL; dl_funcptr p;
#ifdef USE_SHLIB
char pathbuf[260];
if (strchr(pathname, '/') == NULL) {
/* Prefix bare filename with "./" */
sprintf(pathbuf, "./%-.255s", pathname);
pathname = pathbuf;
}
#endif /* USE_SHLIB */
if ((m = _PyImport_FindExtension(name, pathname)) != NULL) { if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
Py_INCREF(m); Py_INCREF(m);
@ -123,15 +71,14 @@ _PyImport_LoadDynamicModule(name, pathname, fp)
packagecontext = name; packagecontext = name;
shortname = lastdot+1; shortname = lastdot+1;
} }
sprintf(funcname, FUNCNAME_PATTERN, shortname);
p = _PyImport_GetDynLoadFunc(name, funcname, pathname, fp); p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
if (PyErr_Occurred()) if (PyErr_Occurred())
return NULL; return NULL;
if (p == NULL) { if (p == NULL) {
PyErr_Format(PyExc_ImportError, PyErr_Format(PyExc_ImportError,
"dynamic module does not define init function (%.200s)", "dynamic module does not define init function (init%.200s)",
funcname); shortname);
return NULL; return NULL;
} }
_Py_PackageContext = packagecontext; _Py_PackageContext = packagecontext;
@ -160,5 +107,6 @@ _PyImport_LoadDynamicModule(name, pathname, fp)
name, pathname); name, pathname);
Py_INCREF(m); Py_INCREF(m);
return m; return m;
#endif /* HAVE_DYNAMIC_LOADING */
} }
#endif /* HAVE_DYNAMIC_LOADING */