summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/importdl.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 00a033e..882402c 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -43,6 +43,7 @@ extern int verbose; /* Defined in pythonrun.c */
NT -- NT style dynamic linking (using DLLs)
_DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
WITH_MAC_DL -- Mac dynamic linking (highly experimental)
+ USE_MAC_SHARED_LIBRARY -- Another mac dynamic linking method
SHORT_EXT -- short extension for dynamic module, e.g. ".so"
LONG_EXT -- long extension, e.g. "module.so"
hpux -- HP-UX Dynamic Linking - defined by the compiler
@@ -98,6 +99,15 @@ typedef FARPROC dl_funcptr;
#define DYNAMIC_LINK
#endif
+#ifdef USE_MAC_SHARED_LIBRARY
+#define DYNAMIC_LINK
+#define SHORT_EXT ".shlb"
+#define LONG_EXT "module.shlb"
+#ifndef _DL_FUNCPTR_DEFINED
+typedef void (*dl_funcptr)();
+#endif
+#endif
+
#if !defined(DYNAMIC_LINK) && defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
#define DYNAMIC_LINK
#define USE_SHLIB
@@ -138,6 +148,13 @@ typedef void (*dl_funcptr)();
#include "dynamic_load.h"
#endif
+#ifdef USE_MAC_SHARED_LIBRARY
+#include <CodeFragments.h>
+#include <Files.h>
+#include "macdefs.h"
+#include "macglue.h"
+#endif
+
#ifdef USE_RLD
#include <mach-o/rld.h>
#define FUNCNAME_PATTERN "_init%.200s"
@@ -163,9 +180,9 @@ extern char *getprogramname();
#endif /* DYNAMIC_LINK */
-/* Max length of module suffix searched for -- accommodates "module.so" */
+/* Max length of module suffix searched for -- accommodates "module.shlb" */
#ifndef MAXSUFFIXSIZE
-#define MAXSUFFIXSIZE 10
+#define MAXSUFFIXSIZE 12
#endif
/* Pass it on to import.c */
@@ -203,6 +220,28 @@ load_dynamic_module(name, pathname)
return NULL;
}
#else /* !WITH_MAC_DL */
+#ifdef USE_MAC_SHARED_LIBRARY
+ /* Another way to do dynloading on the mac, use CFM */
+ {
+ FSSpec libspec;
+ CFragConnectionID connID;
+ Ptr mainAddr;
+ Str255 errMessage;
+ OSErr err;
+
+ (void)FSMakeFSSpec(0, 0, Pstring(pathname), &libspec);
+ err = GetDiskFragment(&libspec, 0, 0, Pstring(name), kLoadCFrag, &connID, &mainAddr,
+ errMessage);
+ if ( err ) {
+ char buf[512];
+
+ sprintf(buf, "%#s: %s", errMessage, macstrerror(err));
+ err_setstr(ImportError, buf);
+ return NULL;
+ }
+ p = (dl_funcptr)mainAddr;
+ }
+#endif /* USE_MAC_SHARED_LIBRARY */
#ifdef USE_SHLIB
{
#ifdef RTLD_NOW