Mercurial > cpython-lru_cache-weakref
diff Python/importdl.c @ 9033:9962833d49fd legacy-trunk
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.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 24 Aug 1998 14:15:44 +0000 |
| parents | bd47ee068b83 |
| children | 2088f80253db |
line wrap: on
line diff
--- a/Python/importdl.c Mon Aug 24 13:48:36 1998 +0000 +++ b/Python/importdl.c Mon Aug 24 14:15:44 1998 +0000 @@ -120,6 +120,18 @@ #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 @@ 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;
