Mercurial > cpython-lru_cache-weakref
view Python/dynload_shlib.c @ 44310:e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
Silence a warning about an unsed variable in debug builds
........
r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
Cleaner method naming convention
........
r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
Fixed warning in ssl module
........
r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
Add line spacing for readability
........
r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
Update method names for named tuples.
........
r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
Add a section about nested listcomps to the tutorial.
Thanks to Ian Bruntlett and Robert Lehmann.
........
r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
Faster and simpler _replace() method
........
r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
Add usage note
........
r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
Remove warning about URL
........
r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
Bump the version number, and make a few small edits
........
r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
Fixed bug #1628
The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
| author | Christian Heimes <christian@cheimes.de> |
|---|---|
| date | Sat, 15 Dec 2007 01:27:15 +0000 |
| parents | 6149483f7a3d |
| children | fd25030223b0 94f64f11fdd0 |
line wrap: on
line source
/* Support for dynamic loading of extension modules */ #include "Python.h" #include "importdl.h" #include <sys/types.h> #include <sys/stat.h> #if defined(__NetBSD__) #include <sys/param.h> #if (NetBSD < 199712) #include <nlist.h> #include <link.h> #define dlerror() "error in dynamic linking" #endif #endif /* NetBSD */ #ifdef HAVE_DLFCN_H #include <dlfcn.h> #else #if defined(PYOS_OS2) && defined(PYCC_GCC) #include "dlfcn.h" #endif #endif #if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__) #define LEAD_UNDERSCORE "_" #else #define LEAD_UNDERSCORE "" #endif const struct filedescr _PyImport_DynLoadFiletab[] = { #ifdef __CYGWIN__ {".dll", "rb", C_EXTENSION}, {"module.dll", "rb", C_EXTENSION}, #else #if defined(PYOS_OS2) && defined(PYCC_GCC) {".pyd", "rb", C_EXTENSION}, {".dll", "rb", C_EXTENSION}, #else #ifdef __VMS {".exe", "rb", C_EXTENSION}, {".EXE", "rb", C_EXTENSION}, {"module.exe", "rb", C_EXTENSION}, {"MODULE.EXE", "rb", C_EXTENSION}, #else {".so", "rb", C_EXTENSION}, {"module.so", "rb", C_EXTENSION}, #endif #endif #endif {0, 0} }; static struct { dev_t dev; #ifdef __VMS ino_t ino[3]; #else ino_t ino; #endif void *handle; } handles[128]; static int nhandles = 0; dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; void *handle; char funcname[258]; char pathbuf[260]; int dlopenflags=0; if (strchr(pathname, '/') == NULL) { /* Prefix bare filename with "./" */ PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname); pathname = pathbuf; } PyOS_snprintf(funcname, sizeof(funcname), LEAD_UNDERSCORE "init%.200s", shortname); if (fp != NULL) { int i; struct stat statb; fstat(fileno(fp), &statb); for (i = 0; i < nhandles; i++) { if (statb.st_dev == handles[i].dev && statb.st_ino == handles[i].ino) { p = (dl_funcptr) dlsym(handles[i].handle, funcname); return p; } } if (nhandles < 128) { handles[nhandles].dev = statb.st_dev; #ifdef __VMS handles[nhandles].ino[0] = statb.st_ino[0]; handles[nhandles].ino[1] = statb.st_ino[1]; handles[nhandles].ino[2] = statb.st_ino[2]; #else handles[nhandles].ino = statb.st_ino; #endif } } #if !(defined(PYOS_OS2) && defined(PYCC_GCC)) dlopenflags = PyThreadState_GET()->interp->dlopenflags; #endif if (Py_VerboseFlag) PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname, dlopenflags); #ifdef __VMS /* VMS currently don't allow a pathname, use a logical name instead */ /* Concatenate 'python_module_' and shortname */ /* so "import vms.bar" will use the logical python_module_bar */ /* As C module use only one name space this is probably not a */ /* important limitation */ PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s", shortname); pathname = pathbuf; #endif handle = dlopen(pathname, dlopenflags); if (handle == NULL) { const char *error = dlerror(); if (error == NULL) error = "unknown dlopen() error"; PyErr_SetString(PyExc_ImportError, error); return NULL; } if (fp != NULL && nhandles < 128) handles[nhandles++].handle = handle; p = (dl_funcptr) dlsym(handle, funcname); return p; }
