Mercurial > cpython-lru_cache-weakref
comparison Python/dynload_next.c @ 61467:f197407bdba2 3.1
Recorded merge of revisions 81032 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
r81032 | antoine.pitrou | 2010-05-09 17:52:27 +0200 (dim., 09 mai 2010) | 9 lines
Recorded merge of revisions 81029 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines
Untabify C files. Will watch buildbots.
........
................
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Sun, 09 May 2010 16:14:21 +0000 |
| parents | 94f64f11fdd0 |
| children | 0874698b1201 |
comparison
equal
deleted
inserted
replaced
| 61459:f8c19c5f5dd2 | 61467:f197407bdba2 |
|---|---|
| 7 #include "importdl.h" | 7 #include "importdl.h" |
| 8 | 8 |
| 9 #include <mach-o/dyld.h> | 9 #include <mach-o/dyld.h> |
| 10 | 10 |
| 11 const struct filedescr _PyImport_DynLoadFiletab[] = { | 11 const struct filedescr _PyImport_DynLoadFiletab[] = { |
| 12 {".so", "rb", C_EXTENSION}, | 12 {".so", "rb", C_EXTENSION}, |
| 13 {"module.so", "rb", C_EXTENSION}, | 13 {"module.so", "rb", C_EXTENSION}, |
| 14 {0, 0} | 14 {0, 0} |
| 15 }; | 15 }; |
| 16 | 16 |
| 17 /* | 17 /* |
| 18 ** Python modules are Mach-O MH_BUNDLE files. The best way to load these | 18 ** Python modules are Mach-O MH_BUNDLE files. The best way to load these |
| 19 ** is each in a private namespace, so you can load, say, a module bar and a | 19 ** is each in a private namespace, so you can load, say, a module bar and a |
| 27 | 27 |
| 28 #ifdef USE_DYLD_GLOBAL_NAMESPACE | 28 #ifdef USE_DYLD_GLOBAL_NAMESPACE |
| 29 #define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR | 29 #define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR |
| 30 #else | 30 #else |
| 31 #define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \ | 31 #define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \ |
| 32 NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE | 32 NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE |
| 33 #endif | 33 #endif |
| 34 dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, | 34 dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, |
| 35 const char *pathname, FILE *fp) | 35 const char *pathname, FILE *fp) |
| 36 { | 36 { |
| 37 dl_funcptr p = NULL; | 37 dl_funcptr p = NULL; |
| 38 char funcname[258]; | 38 char funcname[258]; |
| 39 NSObjectFileImageReturnCode rc; | 39 NSObjectFileImageReturnCode rc; |
| 40 NSObjectFileImage image; | 40 NSObjectFileImage image; |
| 41 NSModule newModule; | 41 NSModule newModule; |
| 42 NSSymbol theSym; | 42 NSSymbol theSym; |
| 43 const char *errString; | 43 const char *errString; |
| 44 char errBuf[512]; | 44 char errBuf[512]; |
| 45 | 45 |
| 46 PyOS_snprintf(funcname, sizeof(funcname), "_PyInit_%.200s", shortname); | 46 PyOS_snprintf(funcname, sizeof(funcname), "_PyInit_%.200s", shortname); |
| 47 | 47 |
| 48 #ifdef USE_DYLD_GLOBAL_NAMESPACE | 48 #ifdef USE_DYLD_GLOBAL_NAMESPACE |
| 49 if (NSIsSymbolNameDefined(funcname)) { | 49 if (NSIsSymbolNameDefined(funcname)) { |
| 50 theSym = NSLookupAndBindSymbol(funcname); | 50 theSym = NSLookupAndBindSymbol(funcname); |
| 51 p = (dl_funcptr)NSAddressOfSymbol(theSym); | 51 p = (dl_funcptr)NSAddressOfSymbol(theSym); |
| 52 return p; | 52 return p; |
| 53 } | 53 } |
| 54 #endif | 54 #endif |
| 55 rc = NSCreateObjectFileImageFromFile(pathname, &image); | 55 rc = NSCreateObjectFileImageFromFile(pathname, &image); |
| 56 switch(rc) { | 56 switch(rc) { |
| 57 default: | 57 default: |
| 58 case NSObjectFileImageFailure: | 58 case NSObjectFileImageFailure: |
| 59 case NSObjectFileImageFormat: | 59 case NSObjectFileImageFormat: |
| 60 /* for these a message is printed on stderr by dyld */ | 60 /* for these a message is printed on stderr by dyld */ |
| 61 errString = "Can't create object file image"; | 61 errString = "Can't create object file image"; |
| 62 break; | 62 break; |
| 63 case NSObjectFileImageSuccess: | 63 case NSObjectFileImageSuccess: |
| 64 errString = NULL; | 64 errString = NULL; |
| 65 break; | 65 break; |
| 66 case NSObjectFileImageInappropriateFile: | 66 case NSObjectFileImageInappropriateFile: |
| 67 errString = "Inappropriate file type for dynamic loading"; | 67 errString = "Inappropriate file type for dynamic loading"; |
| 68 break; | 68 break; |
| 69 case NSObjectFileImageArch: | 69 case NSObjectFileImageArch: |
| 70 errString = "Wrong CPU type in object file"; | 70 errString = "Wrong CPU type in object file"; |
| 71 break; | 71 break; |
| 72 case NSObjectFileImageAccess: | 72 case NSObjectFileImageAccess: |
| 73 errString = "Can't read object file (no access)"; | 73 errString = "Can't read object file (no access)"; |
| 74 break; | 74 break; |
| 75 } | 75 } |
| 76 if (errString == NULL) { | 76 if (errString == NULL) { |
| 77 newModule = NSLinkModule(image, pathname, LINKOPTIONS); | 77 newModule = NSLinkModule(image, pathname, LINKOPTIONS); |
| 78 if (newModule == NULL) { | 78 if (newModule == NULL) { |
| 79 int errNo; | 79 int errNo; |
| 80 const char *fileName, *moreErrorStr; | 80 const char *fileName, *moreErrorStr; |
| 81 NSLinkEditErrors c; | 81 NSLinkEditErrors c; |
| 82 NSLinkEditError( &c, &errNo, &fileName, &moreErrorStr ); | 82 NSLinkEditError( &c, &errNo, &fileName, &moreErrorStr ); |
| 83 PyOS_snprintf(errBuf, 512, "Failure linking new module: %s: %s", | 83 PyOS_snprintf(errBuf, 512, "Failure linking new module: %s: %s", |
| 84 fileName, moreErrorStr); | 84 fileName, moreErrorStr); |
| 85 errString = errBuf; | 85 errString = errBuf; |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 if (errString != NULL) { | 88 if (errString != NULL) { |
| 89 PyErr_SetString(PyExc_ImportError, errString); | 89 PyErr_SetString(PyExc_ImportError, errString); |
| 90 return NULL; | 90 return NULL; |
| 91 } | 91 } |
| 92 #ifdef USE_DYLD_GLOBAL_NAMESPACE | 92 #ifdef USE_DYLD_GLOBAL_NAMESPACE |
| 93 if (!NSIsSymbolNameDefined(funcname)) { | 93 if (!NSIsSymbolNameDefined(funcname)) { |
| 94 /* UnlinkModule() isn't implemented in current versions, but calling it does no harm */ | 94 /* UnlinkModule() isn't implemented in current versions, but calling it does no harm */ |
| 95 /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */ | 95 /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */ |
| 96 PyErr_Format(PyExc_ImportError, | 96 PyErr_Format(PyExc_ImportError, |
| 97 "Loaded module does not contain symbol %.200s", | 97 "Loaded module does not contain symbol %.200s", |
| 98 funcname); | 98 funcname); |
| 99 return NULL; | 99 return NULL; |
| 100 } | 100 } |
| 101 theSym = NSLookupAndBindSymbol(funcname); | 101 theSym = NSLookupAndBindSymbol(funcname); |
| 102 #else | 102 #else |
| 103 theSym = NSLookupSymbolInModule(newModule, funcname); | 103 theSym = NSLookupSymbolInModule(newModule, funcname); |
| 104 if ( theSym == NULL ) { | 104 if ( theSym == NULL ) { |
| 105 /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */ | 105 /* NSUnLinkModule(newModule, FALSE); removed: causes problems for ObjC code */ |
| 106 PyErr_Format(PyExc_ImportError, | 106 PyErr_Format(PyExc_ImportError, |
| 107 "Loaded module does not contain symbol %.200s", | 107 "Loaded module does not contain symbol %.200s", |
| 108 funcname); | 108 funcname); |
| 109 return NULL; | 109 return NULL; |
| 110 } | 110 } |
| 111 #endif | 111 #endif |
| 112 p = (dl_funcptr)NSAddressOfSymbol(theSym); | 112 p = (dl_funcptr)NSAddressOfSymbol(theSym); |
| 113 return p; | 113 return p; |
| 114 } | 114 } |
