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:
parent
6a90b5e4d0
commit
96a8fb7e99
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue