summaryrefslogtreecommitdiff
path: root/sys/src/cmd/python/Python/dynload_next.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
commit458120dd40db6b4df55a4e96b650e16798ef06a0 (patch)
tree8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Python/dynload_next.c
parent3a742c699f6806c1145aea5149bf15de15a0afd7 (diff)
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Python/dynload_next.c')
-rw-r--r--sys/src/cmd/python/Python/dynload_next.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Python/dynload_next.c b/sys/src/cmd/python/Python/dynload_next.c
new file mode 100644
index 000000000..27df35696
--- /dev/null
+++ b/sys/src/cmd/python/Python/dynload_next.c
@@ -0,0 +1,114 @@
+
+/* Support for dynamic loading of extension modules on Mac OS X
+** All references to "NeXT" are for historical reasons.
+*/
+
+#include "Python.h"
+#include "importdl.h"
+
+#include <mach-o/dyld.h>
+
+const struct filedescr _PyImport_DynLoadFiletab[] = {
+ {".so", "rb", C_EXTENSION},
+ {"module.so", "rb", C_EXTENSION},
+ {0, 0}
+};
+
+/*
+** Python modules are Mach-O MH_BUNDLE files. The best way to load these
+** is each in a private namespace, so you can load, say, a module bar and a
+** module foo.bar. If we load everything in the global namespace the two
+** initbar() symbols will conflict.
+** However, it seems some extension packages depend upon being able to access
+** each others' global symbols. There seems to be no way to eat our cake and
+** have it, so the USE_DYLD_GLOBAL_NAMESPACE define determines which behaviour
+** you get.
+*/
+
+#ifdef USE_DYLD_GLOBAL_NAMESPACE
+#define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR
+#else
+#define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \
+ NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE
+#endif
+dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
+ const char *pathname, FILE *fp)
+{
+ dl_funcptr p = NULL;
+ char funcname[258];
+ NSObjectFileImageReturnCode rc;
+ NSObjectFileImage image;
+ NSModule newModule;
+ NSSymbol theSym;
+ const char *errString;
+ char errBuf[512];
+
+ PyOS_snprintf(funcname, sizeof(funcname), "_init%.200s", shortname);
+
+#ifdef USE_DYLD_GLOBAL_NAMESPACE
+ if (NSIsSymbolNameDefined(funcname)) {
+ theSym = NSLookupAndBindSymbol(funcname);
+ p = (dl_funcptr)NSAddressOfSymbol(theSym);
+ return p;
+ }
+#endif
+ rc = NSCreateObjectFileImageFromFile(pathname, &image);
+ switch(rc) {
+ default:
+ case NSObjectFileImageFailure:
+ case NSObjectFileImageFormat:
+ /* for these a message is printed on stderr by dyld */
+ errString = "Can't create object file image";
+ break;
+ case NSObjectFileImageSuccess:
+ errString = NULL;
+ break;
+ case NSObjectFileImageInappropriateFile:
+ errString = "Inappropriate file type for dynamic loading";
+ break;
+ case NSObjectFileImageArch:
+ errString = "Wrong CPU type in object file";
+ break;
+ case NSObjectFileImageAccess:
+ errString = "Can't read object file (no access)";
+ break;
+ }
+ if (errString == NULL) {
+ newModule = NSLinkModule(image, pathname, LINKOPTIONS);
+ if (newModule == NULL) {
+ int errNo;
+ const char *fileName, *moreErrorStr;
+ NSLinkEditErrors c;
+ NSLinkEditError( &c, &errNo, &fileName, &moreErrorStr );
+ PyOS_snprintf(errBuf, 512, "Failure linking new module: %s: %s",
+ fileName, moreErrorStr);
+ errString = errBuf;
+ }
+ }
+ if (errString != NULL) {
+ PyErr_SetString(PyExc_ImportError, errString);
+ return NULL;
+ }
+#ifdef USE_DYLD_GLOBAL_NAMESPACE
+ if (!NSIsSymbolNameDefined(funcname)) {
+ /* UnlinkModule() isn't implemented in current versions, but calling it does no harm */
+ /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */
+ PyErr_Format(PyExc_ImportError,
+ "Loaded module does not contain symbol %.200s",
+ funcname);
+ return NULL;
+ }
+ theSym = NSLookupAndBindSymbol(funcname);
+#else
+ theSym = NSLookupSymbolInModule(newModule, funcname);
+ if ( theSym == NULL ) {
+ /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */
+ PyErr_Format(PyExc_ImportError,
+ "Loaded module does not contain symbol %.200s",
+ funcname);
+ return NULL;
+ }
+#endif
+ p = (dl_funcptr)NSAddressOfSymbol(theSym);
+ return p;
+}