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 }