summaryrefslogtreecommitdiff
path: root/Python/importdl.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-08-24 14:15:44 +0000
committerGuido van Rossum <guido@python.org>1998-08-24 14:15:44 +0000
commit3edeb81b83de934f573d08bd400a4b750baa4ac0 (patch)
tree63f8978493e41d0eb803c66e4b8c8fcd9121e03e /Python/importdl.c
parent74c763f20d537e1eb2399a6a631e18ffd540f984 (diff)
downloadcpython-3edeb81b83de934f573d08bd400a4b750baa4ac0.tar.gz
Ted Horst writes in psa-members@python.org:
This is a patch that Bill Bummgarner did for 1.4 that hasn't made its way into the distribution yet. This is important if you want to use the ObjC module.
Diffstat (limited to 'Python/importdl.c')
-rw-r--r--Python/importdl.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 2947d1586f..ef015ad2ec 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -120,6 +120,18 @@ typedef FARPROC dl_funcptr;
#ifdef NeXT
#define DYNAMIC_LINK
#define USE_RLD
+/* Define this to 1 if you want be able to load ObjC modules as well:
+ it switches between two different way of loading modules on the NeXT,
+ one that directly interfaces with the dynamic loader (rld_load(), which
+ does not correctly load ObjC object files), and another that uses the
+ ObjC runtime (objc_loadModules()) to do the job.
+ You'll have to add ``-ObjC'' to the compiler flags if you set this to 1.
+*/
+#define HANDLE_OBJC_MODULES 1
+#if HANDLE_OBJC_MODULES
+#include <objc/Object.h>
+#include <objc/objc-load.h>
+#endif
#define SHORT_EXT ".so"
#define LONG_EXT "module.so"
#endif
@@ -584,9 +596,38 @@ _PyImport_LoadDynamicModule(name, pathname, fp)
errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
filenames[0] = pathname;
filenames[1] = NULL;
+
+#if HANDLE_OBJC_MODULES
+
+/* The following very bogus line of code ensures that
+ objc_msgSend, etc are linked into the binary. Without
+ it, dynamic loading of a module that includes objective-c
+ method calls will fail with "undefined symbol _objc_msgSend()".
+ This remains true even in the presence of the -ObjC flag
+ to the compiler
+*/
+
+ [Object name];
+
+/* objc_loadModules() dynamically loads the object files
+ indicated by the paths in filenames. If there are any
+ errors generated during loading -- typically due to the
+ inability to find particular symbols -- an error message
+ will be written to errorStream.
+ It returns 0 if the module is successfully loaded, 1
+ otherwise.
+*/
+
+ ret = !objc_loadModules(filenames, errorStream,
+ NULL, &new_header, NULL);
+
+#else /* !HANDLE_OBJC_MODULES */
+
ret = rld_load(errorStream, &new_header,
filenames, NULL);
+#endif /* HANDLE_OBJC_MODULES */
+
/* extract the error messages for the exception */
if(!ret) {
char *streamBuf;