| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 1 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 2 | /* Module definition and import implementation */ | 
 | 3 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 4 | #include "Python.h" | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 5 |  | 
| Jeremy Hylton | 3e0055f | 2005-10-20 19:59:25 +0000 | [diff] [blame] | 6 | #include "Python-ast.h" | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 7 | #undef Yield /* undefine macro conflicting with winbase.h */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 8 | #include "errcode.h" | 
| Guido van Rossum | c405b7b | 1991-06-04 19:39:42 +0000 | [diff] [blame] | 9 | #include "marshal.h" | 
| Jeremy Hylton | 3e0055f | 2005-10-20 19:59:25 +0000 | [diff] [blame] | 10 | #include "code.h" | 
| Guido van Rossum | d8bac6d | 1992-02-26 15:19:13 +0000 | [diff] [blame] | 11 | #include "osdefs.h" | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 12 | #include "importdl.h" | 
| Guido van Rossum | c405b7b | 1991-06-04 19:39:42 +0000 | [diff] [blame] | 13 |  | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 14 | #ifdef HAVE_FCNTL_H | 
 | 15 | #include <fcntl.h> | 
 | 16 | #endif | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 17 | #ifdef __cplusplus | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 18 | extern "C" { | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 19 | #endif | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 20 |  | 
| Christian Heimes | d3eb5a15 | 2008-02-24 00:38:49 +0000 | [diff] [blame] | 21 | #ifdef MS_WINDOWS | 
 | 22 | /* for stat.st_mode */ | 
 | 23 | typedef unsigned short mode_t; | 
| Daniel Stutzbach | c793779 | 2010-09-09 21:18:04 +0000 | [diff] [blame] | 24 | /* for _mkdir */ | 
 | 25 | #include <direct.h> | 
| Christian Heimes | d3eb5a15 | 2008-02-24 00:38:49 +0000 | [diff] [blame] | 26 | #endif | 
 | 27 |  | 
| Guido van Rossum | 21d335e | 1993-10-15 13:01:11 +0000 | [diff] [blame] | 28 |  | 
| Jeremy Hylton | d4ceb31 | 2004-04-01 02:45:22 +0000 | [diff] [blame] | 29 | /* Magic word to reject .pyc files generated by other Python versions. | 
 | 30 |    It should change for each incompatible change to the bytecode. | 
 | 31 |  | 
 | 32 |    The value of CR and LF is incorporated so if you ever read or write | 
| Guido van Rossum | 7faeab3 | 1995-07-07 22:50:36 +0000 | [diff] [blame] | 33 |    a .pyc file in text mode the magic number will be wrong; also, the | 
| Tim Peters | 36515e2 | 2001-11-18 04:06:29 +0000 | [diff] [blame] | 34 |    Apple MPW compiler swaps their values, botching string constants. | 
| Marc-André Lemburg | bd3be8f | 2002-02-07 11:33:49 +0000 | [diff] [blame] | 35 |  | 
| Guido van Rossum | 45aecf4 | 2006-03-15 04:58:47 +0000 | [diff] [blame] | 36 |    The magic numbers must be spaced apart at least 2 values, as the | 
| Martin v. Löwis | ef82d2f | 2004-06-27 16:51:46 +0000 | [diff] [blame] | 37 |    -U interpeter flag will cause MAGIC+1 being used. They have been | 
 | 38 |    odd numbers for some time now. | 
| Marc-André Lemburg | bd3be8f | 2002-02-07 11:33:49 +0000 | [diff] [blame] | 39 |  | 
| Jeremy Hylton | d4ceb31 | 2004-04-01 02:45:22 +0000 | [diff] [blame] | 40 |    There were a variety of old schemes for setting the magic number. | 
 | 41 |    The current working scheme is to increment the previous value by | 
 | 42 |    10. | 
| Guido van Rossum | f689492 | 2002-08-31 15:16:14 +0000 | [diff] [blame] | 43 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 44 |    Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic | 
 | 45 |    number also includes a new "magic tag", i.e. a human readable string used | 
 | 46 |    to represent the magic number in __pycache__ directories.  When you change | 
 | 47 |    the magic number, you must also set a new unique magic tag.  Generally this | 
 | 48 |    can be named after the Python major version of the magic number bump, but | 
 | 49 |    it can really be anything, as long as it's different than anything else | 
 | 50 |    that's come before.  The tags are included in the following table, starting | 
 | 51 |    with Python 3.2a0. | 
 | 52 |  | 
| Marc-André Lemburg | bd3be8f | 2002-02-07 11:33:49 +0000 | [diff] [blame] | 53 |    Known values: | 
 | 54 |        Python 1.5:   20121 | 
 | 55 |        Python 1.5.1: 20121 | 
 | 56 |        Python 1.5.2: 20121 | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 57 |        Python 1.6:   50428 | 
| Marc-André Lemburg | bd3be8f | 2002-02-07 11:33:49 +0000 | [diff] [blame] | 58 |        Python 2.0:   50823 | 
 | 59 |        Python 2.0.1: 50823 | 
 | 60 |        Python 2.1:   60202 | 
 | 61 |        Python 2.1.1: 60202 | 
 | 62 |        Python 2.1.2: 60202 | 
 | 63 |        Python 2.2:   60717 | 
| Neal Norwitz | 7fdcb41 | 2002-06-14 01:07:39 +0000 | [diff] [blame] | 64 |        Python 2.3a0: 62011 | 
| Michael W. Hudson | dd32a91 | 2002-08-15 14:59:02 +0000 | [diff] [blame] | 65 |        Python 2.3a0: 62021 | 
| Guido van Rossum | f689492 | 2002-08-31 15:16:14 +0000 | [diff] [blame] | 66 |        Python 2.3a0: 62011 (!) | 
| Martin v. Löwis | ef82d2f | 2004-06-27 16:51:46 +0000 | [diff] [blame] | 67 |        Python 2.4a0: 62041 | 
| Raymond Hettinger | fd2d1f7 | 2004-08-23 23:37:48 +0000 | [diff] [blame] | 68 |        Python 2.4a3: 62051 | 
| Raymond Hettinger | 2c31a05 | 2004-09-22 18:44:21 +0000 | [diff] [blame] | 69 |        Python 2.4b1: 62061 | 
| Michael W. Hudson | df88846 | 2005-06-03 14:41:55 +0000 | [diff] [blame] | 70 |        Python 2.5a0: 62071 | 
| Michael W. Hudson | aee2e28 | 2005-10-21 11:32:20 +0000 | [diff] [blame] | 71 |        Python 2.5a0: 62081 (ast-branch) | 
| Guido van Rossum | c2e2074 | 2006-02-27 22:32:47 +0000 | [diff] [blame] | 72 |        Python 2.5a0: 62091 (with) | 
| Guido van Rossum | f669436 | 2006-03-10 02:28:35 +0000 | [diff] [blame] | 73 |        Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 74 |        Python 2.5b3: 62101 (fix wrong code: for x, in ...) | 
 | 75 |        Python 2.5b3: 62111 (fix wrong code: x += yield) | 
 | 76 |        Python 2.5c1: 62121 (fix wrong lnotab with for loops and | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 77 |                             storing constants that should have been removed) | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 78 |        Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) | 
| Christian Heimes | 99170a5 | 2007-12-19 02:07:34 +0000 | [diff] [blame] | 79 |        Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 80 |        Python 2.6a1: 62161 (WITH_CLEANUP optimization) | 
| Guido van Rossum | 45aecf4 | 2006-03-15 04:58:47 +0000 | [diff] [blame] | 81 |        Python 3000:   3000 | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 82 |                       3010 (removed UNARY_CONVERT) | 
 | 83 |                       3020 (added BUILD_SET) | 
 | 84 |                       3030 (added keyword-only parameters) | 
 | 85 |                       3040 (added signature annotations) | 
 | 86 |                       3050 (print becomes a function) | 
 | 87 |                       3060 (PEP 3115 metaclass syntax) | 
 | 88 |                       3061 (string literals become unicode) | 
 | 89 |                       3071 (PEP 3109 raise changes) | 
 | 90 |                       3081 (PEP 3137 make __file__ and __name__ unicode) | 
 | 91 |                       3091 (kill str8 interning) | 
 | 92 |                       3101 (merge from 2.6a0, see 62151) | 
 | 93 |                       3103 (__file__ points to source file) | 
| Benjamin Peterson | 0f6cae0 | 2009-12-10 02:09:08 +0000 | [diff] [blame] | 94 |        Python 3.0a4: 3111 (WITH_CLEANUP optimization). | 
 | 95 |        Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT) | 
 | 96 |        Python 3.1a0: 3141 (optimize list, set and dict comprehensions: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 97 |                change LIST_APPEND and SET_ADD, add MAP_ADD) | 
| Benjamin Peterson | 0f6cae0 | 2009-12-10 02:09:08 +0000 | [diff] [blame] | 98 |        Python 3.1a0: 3151 (optimize conditional branches: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 99 |                introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) | 
| Benjamin Peterson | 876b2f2 | 2009-06-28 03:18:59 +0000 | [diff] [blame] | 100 |        Python 3.2a0: 3160 (add SETUP_WITH) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 101 |                      tag: cpython-32 | 
| Antoine Pitrou | 74a69fa | 2010-09-04 18:43:52 +0000 | [diff] [blame] | 102 |        Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR) | 
 | 103 |                      tag: cpython-32 | 
| Benjamin Peterson | 6246d6d | 2010-09-10 21:51:44 +0000 | [diff] [blame] | 104 |        Python 3.2a2  3180 (add DELETE_DEREF) | 
| Tim Peters | 36515e2 | 2001-11-18 04:06:29 +0000 | [diff] [blame] | 105 | */ | 
| Guido van Rossum | 3ddee71 | 1991-12-16 13:06:34 +0000 | [diff] [blame] | 106 |  | 
| Nick Coghlan | cd419ab | 2010-09-11 00:39:25 +0000 | [diff] [blame] | 107 | /* MAGIC must change whenever the bytecode emitted by the compiler may no | 
 | 108 |    longer be understood by older implementations of the eval loop (usually | 
 | 109 |    due to the addition of new opcodes) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 110 |    TAG and PYC_TAG_UNICODE must change for each major Python release. The magic | 
 | 111 |    number will take care of any bytecode changes that occur during development. | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 112 | */ | 
| Benjamin Peterson | 6246d6d | 2010-09-10 21:51:44 +0000 | [diff] [blame] | 113 | #define MAGIC (3180 | ((long)'\r'<<16) | ((long)'\n'<<24)) | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 114 | #define TAG "cpython-32" | 
 | 115 | #define CACHEDIR "__pycache__" | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 116 | static const Py_UNICODE CACHEDIR_UNICODE[] = { | 
 | 117 |     '_', '_', 'p', 'y', 'c', 'a', 'c', 'h', 'e', '_', '_', '\0'}; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 118 | /* Current magic word and string tag as globals. */ | 
| Guido van Rossum | 96774c1 | 2000-05-01 20:19:08 +0000 | [diff] [blame] | 119 | static long pyc_magic = MAGIC; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 120 | static const char *pyc_tag = TAG; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 121 | static const Py_UNICODE PYC_TAG_UNICODE[] = { | 
 | 122 |     'c', 'p', 'y', 't', 'h', 'o', 'n', '-', '3', '2', '\0'}; | 
| Guido van Rossum | 96774c1 | 2000-05-01 20:19:08 +0000 | [diff] [blame] | 123 |  | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 124 | /* See _PyImport_FixupExtensionObject() below */ | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 125 | static PyObject *extensions = NULL; | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 126 |  | 
| Guido van Rossum | 771c6c8 | 1997-10-31 18:37:24 +0000 | [diff] [blame] | 127 | /* This table is defined in config.c: */ | 
 | 128 | extern struct _inittab _PyImport_Inittab[]; | 
 | 129 |  | 
| Guido van Rossum | ce3a72a | 2007-10-19 23:16:50 +0000 | [diff] [blame] | 130 | /* Method from Parser/tokenizer.c */ | 
| Guido van Rossum | 40d20bc | 2007-10-22 00:09:51 +0000 | [diff] [blame] | 131 | extern char * PyTokenizer_FindEncoding(int); | 
| Guido van Rossum | ce3a72a | 2007-10-19 23:16:50 +0000 | [diff] [blame] | 132 |  | 
| Guido van Rossum | 771c6c8 | 1997-10-31 18:37:24 +0000 | [diff] [blame] | 133 | struct _inittab *PyImport_Inittab = _PyImport_Inittab; | 
| Guido van Rossum | 66f1fa8 | 1991-04-03 19:03:52 +0000 | [diff] [blame] | 134 |  | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 135 | /* these tables define the module suffixes that Python recognizes */ | 
 | 136 | struct filedescr * _PyImport_Filetab = NULL; | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 137 |  | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 138 | static const struct filedescr _PyImport_StandardFiletab[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 139 |     {".py", "U", PY_SOURCE}, | 
| Martin v. Löwis | 6238d2b | 2002-06-30 15:26:10 +0000 | [diff] [blame] | 140 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 141 |     {".pyw", "U", PY_SOURCE}, | 
| Tim Peters | 36515e2 | 2001-11-18 04:06:29 +0000 | [diff] [blame] | 142 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 143 |     {".pyc", "rb", PY_COMPILED}, | 
 | 144 |     {0, 0} | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 145 | }; | 
 | 146 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 147 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 148 | /* Initialize things */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 149 |  | 
 | 150 | void | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 151 | _PyImport_Init(void) | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 152 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 153 |     const struct filedescr *scan; | 
 | 154 |     struct filedescr *filetab; | 
 | 155 |     int countD = 0; | 
 | 156 |     int countS = 0; | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 157 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 158 |     /* prepare _PyImport_Filetab: copy entries from | 
 | 159 |        _PyImport_DynLoadFiletab and _PyImport_StandardFiletab. | 
 | 160 |      */ | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 161 | #ifdef HAVE_DYNAMIC_LOADING | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 162 |     for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan) | 
 | 163 |         ++countD; | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 164 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 165 |     for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan) | 
 | 166 |         ++countS; | 
 | 167 |     filetab = PyMem_NEW(struct filedescr, countD + countS + 1); | 
 | 168 |     if (filetab == NULL) | 
 | 169 |         Py_FatalError("Can't initialize import file table."); | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 170 | #ifdef HAVE_DYNAMIC_LOADING | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 171 |     memcpy(filetab, _PyImport_DynLoadFiletab, | 
 | 172 |            countD * sizeof(struct filedescr)); | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 173 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 174 |     memcpy(filetab + countD, _PyImport_StandardFiletab, | 
 | 175 |            countS * sizeof(struct filedescr)); | 
 | 176 |     filetab[countD + countS].suffix = NULL; | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 177 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 178 |     _PyImport_Filetab = filetab; | 
| Guido van Rossum | ed1170e | 1999-12-20 21:23:41 +0000 | [diff] [blame] | 179 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 180 |     if (Py_OptimizeFlag) { | 
 | 181 |         /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */ | 
 | 182 |         for (; filetab->suffix != NULL; filetab++) { | 
 | 183 |             if (strcmp(filetab->suffix, ".pyc") == 0) | 
 | 184 |                 filetab->suffix = ".pyo"; | 
 | 185 |         } | 
 | 186 |     } | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 187 | } | 
 | 188 |  | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 189 | void | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 190 | _PyImportHooks_Init(void) | 
 | 191 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 192 |     PyObject *v, *path_hooks = NULL, *zimpimport; | 
 | 193 |     int err = 0; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 194 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 195 |     /* adding sys.path_hooks and sys.path_importer_cache, setting up | 
 | 196 |        zipimport */ | 
 | 197 |     if (PyType_Ready(&PyNullImporter_Type) < 0) | 
 | 198 |         goto error; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 199 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 200 |     if (Py_VerboseFlag) | 
 | 201 |         PySys_WriteStderr("# installing zipimport hook\n"); | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 202 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 203 |     v = PyList_New(0); | 
 | 204 |     if (v == NULL) | 
 | 205 |         goto error; | 
 | 206 |     err = PySys_SetObject("meta_path", v); | 
 | 207 |     Py_DECREF(v); | 
 | 208 |     if (err) | 
 | 209 |         goto error; | 
 | 210 |     v = PyDict_New(); | 
 | 211 |     if (v == NULL) | 
 | 212 |         goto error; | 
 | 213 |     err = PySys_SetObject("path_importer_cache", v); | 
 | 214 |     Py_DECREF(v); | 
 | 215 |     if (err) | 
 | 216 |         goto error; | 
 | 217 |     path_hooks = PyList_New(0); | 
 | 218 |     if (path_hooks == NULL) | 
 | 219 |         goto error; | 
 | 220 |     err = PySys_SetObject("path_hooks", path_hooks); | 
 | 221 |     if (err) { | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 222 |   error: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 223 |         PyErr_Print(); | 
 | 224 |         Py_FatalError("initializing sys.meta_path, sys.path_hooks, " | 
 | 225 |                       "path_importer_cache, or NullImporter failed" | 
 | 226 |                       ); | 
 | 227 |     } | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 228 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 229 |     zimpimport = PyImport_ImportModule("zipimport"); | 
 | 230 |     if (zimpimport == NULL) { | 
 | 231 |         PyErr_Clear(); /* No zip import module -- okay */ | 
 | 232 |         if (Py_VerboseFlag) | 
 | 233 |             PySys_WriteStderr("# can't import zipimport\n"); | 
 | 234 |     } | 
 | 235 |     else { | 
 | 236 |         PyObject *zipimporter = PyObject_GetAttrString(zimpimport, | 
 | 237 |                                                        "zipimporter"); | 
 | 238 |         Py_DECREF(zimpimport); | 
 | 239 |         if (zipimporter == NULL) { | 
 | 240 |             PyErr_Clear(); /* No zipimporter object -- okay */ | 
 | 241 |             if (Py_VerboseFlag) | 
 | 242 |                 PySys_WriteStderr( | 
 | 243 |                     "# can't import zipimport.zipimporter\n"); | 
 | 244 |         } | 
 | 245 |         else { | 
 | 246 |             /* sys.path_hooks.append(zipimporter) */ | 
 | 247 |             err = PyList_Append(path_hooks, zipimporter); | 
 | 248 |             Py_DECREF(zipimporter); | 
 | 249 |             if (err) | 
 | 250 |                 goto error; | 
 | 251 |             if (Py_VerboseFlag) | 
 | 252 |                 PySys_WriteStderr( | 
 | 253 |                     "# installed zipimport hook\n"); | 
 | 254 |         } | 
 | 255 |     } | 
 | 256 |     Py_DECREF(path_hooks); | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 257 | } | 
 | 258 |  | 
 | 259 | void | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 260 | _PyImport_Fini(void) | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 261 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 262 |     Py_XDECREF(extensions); | 
 | 263 |     extensions = NULL; | 
 | 264 |     PyMem_DEL(_PyImport_Filetab); | 
 | 265 |     _PyImport_Filetab = NULL; | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 266 | } | 
 | 267 |  | 
 | 268 |  | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 269 | /* Locking primitives to prevent parallel imports of the same module | 
 | 270 |    in different threads to return with a partially loaded module. | 
 | 271 |    These calls are serialized by the global interpreter lock. */ | 
 | 272 |  | 
 | 273 | #ifdef WITH_THREAD | 
 | 274 |  | 
| Guido van Rossum | 49b5606 | 1998-10-01 20:42:43 +0000 | [diff] [blame] | 275 | #include "pythread.h" | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 276 |  | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 277 | static PyThread_type_lock import_lock = 0; | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 278 | static long import_lock_thread = -1; | 
 | 279 | static int import_lock_level = 0; | 
 | 280 |  | 
| Benjamin Peterson | 0df35a9 | 2009-10-04 20:32:25 +0000 | [diff] [blame] | 281 | void | 
 | 282 | _PyImport_AcquireLock(void) | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 283 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 284 |     long me = PyThread_get_thread_ident(); | 
 | 285 |     if (me == -1) | 
 | 286 |         return; /* Too bad */ | 
 | 287 |     if (import_lock == NULL) { | 
 | 288 |         import_lock = PyThread_allocate_lock(); | 
 | 289 |         if (import_lock == NULL) | 
 | 290 |             return;  /* Nothing much we can do. */ | 
 | 291 |     } | 
 | 292 |     if (import_lock_thread == me) { | 
 | 293 |         import_lock_level++; | 
 | 294 |         return; | 
 | 295 |     } | 
 | 296 |     if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) | 
 | 297 |     { | 
 | 298 |         PyThreadState *tstate = PyEval_SaveThread(); | 
 | 299 |         PyThread_acquire_lock(import_lock, 1); | 
 | 300 |         PyEval_RestoreThread(tstate); | 
 | 301 |     } | 
 | 302 |     import_lock_thread = me; | 
 | 303 |     import_lock_level = 1; | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 304 | } | 
 | 305 |  | 
| Benjamin Peterson | 0df35a9 | 2009-10-04 20:32:25 +0000 | [diff] [blame] | 306 | int | 
 | 307 | _PyImport_ReleaseLock(void) | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 308 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 309 |     long me = PyThread_get_thread_ident(); | 
 | 310 |     if (me == -1 || import_lock == NULL) | 
 | 311 |         return 0; /* Too bad */ | 
 | 312 |     if (import_lock_thread != me) | 
 | 313 |         return -1; | 
 | 314 |     import_lock_level--; | 
 | 315 |     if (import_lock_level == 0) { | 
 | 316 |         import_lock_thread = -1; | 
 | 317 |         PyThread_release_lock(import_lock); | 
 | 318 |     } | 
 | 319 |     return 1; | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 320 | } | 
 | 321 |  | 
| Gregory P. Smith | 24cec9f | 2010-03-01 06:18:41 +0000 | [diff] [blame] | 322 | /* This function is called from PyOS_AfterFork to ensure that newly | 
 | 323 |    created child processes do not share locks with the parent. | 
 | 324 |    We now acquire the import lock around fork() calls but on some platforms | 
 | 325 |    (Solaris 9 and earlier? see isue7242) that still left us with problems. */ | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 326 |  | 
 | 327 | void | 
 | 328 | _PyImport_ReInitLock(void) | 
 | 329 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 330 |     if (import_lock != NULL) | 
 | 331 |         import_lock = PyThread_allocate_lock(); | 
| Nick Coghlan | b2ddf79 | 2010-12-02 04:11:46 +0000 | [diff] [blame] | 332 |     if (import_lock_level > 1) { | 
 | 333 |         /* Forked as a side effect of import */ | 
 | 334 |         long me = PyThread_get_thread_ident(); | 
 | 335 |         PyThread_acquire_lock(import_lock, 0); | 
| Victor Stinner | 942003c | 2011-03-07 16:57:48 +0100 | [diff] [blame] | 336 |         /* XXX: can the previous line fail? */ | 
| Nick Coghlan | b2ddf79 | 2010-12-02 04:11:46 +0000 | [diff] [blame] | 337 |         import_lock_thread = me; | 
 | 338 |         import_lock_level--; | 
 | 339 |     } else { | 
 | 340 |         import_lock_thread = -1; | 
 | 341 |         import_lock_level = 0; | 
 | 342 |     } | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 343 | } | 
 | 344 |  | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 345 | #endif | 
 | 346 |  | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 347 | static PyObject * | 
| Neal Norwitz | 08ea61a | 2003-02-17 18:18:00 +0000 | [diff] [blame] | 348 | imp_lock_held(PyObject *self, PyObject *noargs) | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 349 | { | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 350 | #ifdef WITH_THREAD | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 351 |     return PyBool_FromLong(import_lock_thread != -1); | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 352 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 353 |     return PyBool_FromLong(0); | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 354 | #endif | 
 | 355 | } | 
 | 356 |  | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 357 | static PyObject * | 
| Neal Norwitz | 08ea61a | 2003-02-17 18:18:00 +0000 | [diff] [blame] | 358 | imp_acquire_lock(PyObject *self, PyObject *noargs) | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 359 | { | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 360 | #ifdef WITH_THREAD | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 361 |     _PyImport_AcquireLock(); | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 362 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 363 |     Py_INCREF(Py_None); | 
 | 364 |     return Py_None; | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 365 | } | 
 | 366 |  | 
 | 367 | static PyObject * | 
| Neal Norwitz | 08ea61a | 2003-02-17 18:18:00 +0000 | [diff] [blame] | 368 | imp_release_lock(PyObject *self, PyObject *noargs) | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 369 | { | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 370 | #ifdef WITH_THREAD | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 371 |     if (_PyImport_ReleaseLock() < 0) { | 
 | 372 |         PyErr_SetString(PyExc_RuntimeError, | 
 | 373 |                         "not holding the import lock"); | 
 | 374 |         return NULL; | 
 | 375 |     } | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 376 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 377 |     Py_INCREF(Py_None); | 
 | 378 |     return Py_None; | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 379 | } | 
 | 380 |  | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 381 | static void | 
 | 382 | imp_modules_reloading_clear(void) | 
 | 383 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 384 |     PyInterpreterState *interp = PyThreadState_Get()->interp; | 
 | 385 |     if (interp->modules_reloading != NULL) | 
 | 386 |         PyDict_Clear(interp->modules_reloading); | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 387 | } | 
 | 388 |  | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 389 | /* Helper for sys */ | 
 | 390 |  | 
 | 391 | PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 392 | PyImport_GetModuleDict(void) | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 393 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 394 |     PyInterpreterState *interp = PyThreadState_GET()->interp; | 
 | 395 |     if (interp->modules == NULL) | 
 | 396 |         Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); | 
 | 397 |     return interp->modules; | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 398 | } | 
 | 399 |  | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 400 |  | 
| Guido van Rossum | a0fec2b | 1998-02-06 17:16:02 +0000 | [diff] [blame] | 401 | /* List of names to clear in sys */ | 
 | 402 | static char* sys_deletes[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 403 |     "path", "argv", "ps1", "ps2", | 
 | 404 |     "last_type", "last_value", "last_traceback", | 
 | 405 |     "path_hooks", "path_importer_cache", "meta_path", | 
 | 406 |     /* misc stuff */ | 
 | 407 |     "flags", "float_info", | 
 | 408 |     NULL | 
| Guido van Rossum | a0fec2b | 1998-02-06 17:16:02 +0000 | [diff] [blame] | 409 | }; | 
 | 410 |  | 
| Guido van Rossum | 05f9dce | 1998-02-19 20:58:44 +0000 | [diff] [blame] | 411 | static char* sys_files[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 412 |     "stdin", "__stdin__", | 
 | 413 |     "stdout", "__stdout__", | 
 | 414 |     "stderr", "__stderr__", | 
 | 415 |     NULL | 
| Guido van Rossum | 05f9dce | 1998-02-19 20:58:44 +0000 | [diff] [blame] | 416 | }; | 
 | 417 |  | 
| Guido van Rossum | a0fec2b | 1998-02-06 17:16:02 +0000 | [diff] [blame] | 418 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 419 | /* Un-initialize things, as good as we can */ | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 420 |  | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 421 | void | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 422 | PyImport_Cleanup(void) | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 423 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 424 |     Py_ssize_t pos, ndone; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 425 |     PyObject *key, *value, *dict; | 
 | 426 |     PyInterpreterState *interp = PyThreadState_GET()->interp; | 
 | 427 |     PyObject *modules = interp->modules; | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 428 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 429 |     if (modules == NULL) | 
 | 430 |         return; /* Already done */ | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 431 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 432 |     /* Delete some special variables first.  These are common | 
 | 433 |        places where user values hide and people complain when their | 
 | 434 |        destructors fail.  Since the modules containing them are | 
 | 435 |        deleted *last* of all, they would come too late in the normal | 
 | 436 |        destruction order.  Sigh. */ | 
| Guido van Rossum | a0fec2b | 1998-02-06 17:16:02 +0000 | [diff] [blame] | 437 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 438 |     value = PyDict_GetItemString(modules, "builtins"); | 
 | 439 |     if (value != NULL && PyModule_Check(value)) { | 
 | 440 |         dict = PyModule_GetDict(value); | 
 | 441 |         if (Py_VerboseFlag) | 
 | 442 |             PySys_WriteStderr("# clear builtins._\n"); | 
 | 443 |         PyDict_SetItemString(dict, "_", Py_None); | 
 | 444 |     } | 
 | 445 |     value = PyDict_GetItemString(modules, "sys"); | 
 | 446 |     if (value != NULL && PyModule_Check(value)) { | 
 | 447 |         char **p; | 
 | 448 |         PyObject *v; | 
 | 449 |         dict = PyModule_GetDict(value); | 
 | 450 |         for (p = sys_deletes; *p != NULL; p++) { | 
 | 451 |             if (Py_VerboseFlag) | 
 | 452 |                 PySys_WriteStderr("# clear sys.%s\n", *p); | 
 | 453 |             PyDict_SetItemString(dict, *p, Py_None); | 
 | 454 |         } | 
 | 455 |         for (p = sys_files; *p != NULL; p+=2) { | 
 | 456 |             if (Py_VerboseFlag) | 
 | 457 |                 PySys_WriteStderr("# restore sys.%s\n", *p); | 
 | 458 |             v = PyDict_GetItemString(dict, *(p+1)); | 
 | 459 |             if (v == NULL) | 
 | 460 |                 v = Py_None; | 
 | 461 |             PyDict_SetItemString(dict, *p, v); | 
 | 462 |         } | 
 | 463 |     } | 
| Guido van Rossum | 05f9dce | 1998-02-19 20:58:44 +0000 | [diff] [blame] | 464 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 465 |     /* First, delete __main__ */ | 
 | 466 |     value = PyDict_GetItemString(modules, "__main__"); | 
 | 467 |     if (value != NULL && PyModule_Check(value)) { | 
 | 468 |         if (Py_VerboseFlag) | 
 | 469 |             PySys_WriteStderr("# cleanup __main__\n"); | 
 | 470 |         _PyModule_Clear(value); | 
 | 471 |         PyDict_SetItemString(modules, "__main__", Py_None); | 
 | 472 |     } | 
| Guido van Rossum | a0fec2b | 1998-02-06 17:16:02 +0000 | [diff] [blame] | 473 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 474 |     /* The special treatment of "builtins" here is because even | 
 | 475 |        when it's not referenced as a module, its dictionary is | 
 | 476 |        referenced by almost every module's __builtins__.  Since | 
 | 477 |        deleting a module clears its dictionary (even if there are | 
 | 478 |        references left to it), we need to delete the "builtins" | 
 | 479 |        module last.  Likewise, we don't delete sys until the very | 
 | 480 |        end because it is implicitly referenced (e.g. by print). | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 481 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 482 |        Also note that we 'delete' modules by replacing their entry | 
 | 483 |        in the modules dict with None, rather than really deleting | 
 | 484 |        them; this avoids a rehash of the modules dictionary and | 
 | 485 |        also marks them as "non existent" so they won't be | 
 | 486 |        re-imported. */ | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 487 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 488 |     /* Next, repeatedly delete modules with a reference count of | 
 | 489 |        one (skipping builtins and sys) and delete them */ | 
 | 490 |     do { | 
 | 491 |         ndone = 0; | 
 | 492 |         pos = 0; | 
 | 493 |         while (PyDict_Next(modules, &pos, &key, &value)) { | 
 | 494 |             if (value->ob_refcnt != 1) | 
 | 495 |                 continue; | 
 | 496 |             if (PyUnicode_Check(key) && PyModule_Check(value)) { | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 497 |                 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 498 |                     continue; | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 499 |                 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 500 |                     continue; | 
 | 501 |                 if (Py_VerboseFlag) | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 502 |                     PySys_FormatStderr( | 
 | 503 |                         "# cleanup[1] %U\n", key); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 504 |                 _PyModule_Clear(value); | 
 | 505 |                 PyDict_SetItem(modules, key, Py_None); | 
 | 506 |                 ndone++; | 
 | 507 |             } | 
 | 508 |         } | 
 | 509 |     } while (ndone > 0); | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 510 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 511 |     /* Next, delete all modules (still skipping builtins and sys) */ | 
 | 512 |     pos = 0; | 
 | 513 |     while (PyDict_Next(modules, &pos, &key, &value)) { | 
 | 514 |         if (PyUnicode_Check(key) && PyModule_Check(value)) { | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 515 |             if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 516 |                 continue; | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 517 |             if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 518 |                 continue; | 
 | 519 |             if (Py_VerboseFlag) | 
| Victor Stinner | 9464d61 | 2011-03-07 17:08:21 +0100 | [diff] [blame] | 520 |                 PySys_FormatStderr("# cleanup[2] %U\n", key); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 521 |             _PyModule_Clear(value); | 
 | 522 |             PyDict_SetItem(modules, key, Py_None); | 
 | 523 |         } | 
 | 524 |     } | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 525 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 526 |     /* Next, delete sys and builtins (in that order) */ | 
 | 527 |     value = PyDict_GetItemString(modules, "sys"); | 
 | 528 |     if (value != NULL && PyModule_Check(value)) { | 
 | 529 |         if (Py_VerboseFlag) | 
 | 530 |             PySys_WriteStderr("# cleanup sys\n"); | 
 | 531 |         _PyModule_Clear(value); | 
 | 532 |         PyDict_SetItemString(modules, "sys", Py_None); | 
 | 533 |     } | 
 | 534 |     value = PyDict_GetItemString(modules, "builtins"); | 
 | 535 |     if (value != NULL && PyModule_Check(value)) { | 
 | 536 |         if (Py_VerboseFlag) | 
 | 537 |             PySys_WriteStderr("# cleanup builtins\n"); | 
 | 538 |         _PyModule_Clear(value); | 
 | 539 |         PyDict_SetItemString(modules, "builtins", Py_None); | 
 | 540 |     } | 
| Guido van Rossum | 758eec0 | 1998-01-19 21:58:26 +0000 | [diff] [blame] | 541 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 542 |     /* Finally, clear and delete the modules directory */ | 
 | 543 |     PyDict_Clear(modules); | 
 | 544 |     interp->modules = NULL; | 
 | 545 |     Py_DECREF(modules); | 
 | 546 |     Py_CLEAR(interp->modules_reloading); | 
| Guido van Rossum | 8d15b5d | 1990-10-26 14:58:58 +0000 | [diff] [blame] | 547 | } | 
| Guido van Rossum | 7f133ed | 1991-02-19 12:23:57 +0000 | [diff] [blame] | 548 |  | 
 | 549 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 550 | /* Helper for pythonrun.c -- return magic number and tag. */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 551 |  | 
 | 552 | long | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 553 | PyImport_GetMagicNumber(void) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 554 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 555 |     return pyc_magic; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 556 | } | 
 | 557 |  | 
 | 558 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 559 | const char * | 
 | 560 | PyImport_GetMagicTag(void) | 
 | 561 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 562 |     return pyc_tag; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 563 | } | 
 | 564 |  | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 565 | /* Magic for extension modules (built-in as well as dynamically | 
 | 566 |    loaded).  To prevent initializing an extension module more than | 
 | 567 |    once, we keep a static dictionary 'extensions' keyed by module name | 
 | 568 |    (for built-in modules) or by filename (for dynamically loaded | 
| Barry Warsaw | 9288338 | 2001-08-13 23:05:44 +0000 | [diff] [blame] | 569 |    modules), containing these modules.  A copy of the module's | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 570 |    dictionary is stored by calling _PyImport_FixupExtensionObject() | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 571 |    immediately after the module initialization function succeeds.  A | 
 | 572 |    copy can be retrieved from there by calling | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 573 |    _PyImport_FindExtensionObject(). | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 574 |  | 
| Barry Warsaw | 7c9627b | 2010-06-17 18:38:20 +0000 | [diff] [blame] | 575 |    Modules which do support multiple initialization set their m_size | 
 | 576 |    field to a non-negative number (indicating the size of the | 
 | 577 |    module-specific state). They are still recorded in the extensions | 
 | 578 |    dictionary, to avoid loading shared libraries twice. | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 579 | */ | 
 | 580 |  | 
 | 581 | int | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 582 | _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, | 
 | 583 |                                PyObject *filename) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 584 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 585 |     PyObject *modules, *dict; | 
 | 586 |     struct PyModuleDef *def; | 
 | 587 |     if (extensions == NULL) { | 
 | 588 |         extensions = PyDict_New(); | 
 | 589 |         if (extensions == NULL) | 
 | 590 |             return -1; | 
 | 591 |     } | 
 | 592 |     if (mod == NULL || !PyModule_Check(mod)) { | 
 | 593 |         PyErr_BadInternalCall(); | 
 | 594 |         return -1; | 
 | 595 |     } | 
 | 596 |     def = PyModule_GetDef(mod); | 
 | 597 |     if (!def) { | 
 | 598 |         PyErr_BadInternalCall(); | 
 | 599 |         return -1; | 
 | 600 |     } | 
 | 601 |     modules = PyImport_GetModuleDict(); | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 602 |     if (PyDict_SetItem(modules, name, mod) < 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 603 |         return -1; | 
 | 604 |     if (_PyState_AddModule(mod, def) < 0) { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 605 |         PyDict_DelItem(modules, name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 606 |         return -1; | 
 | 607 |     } | 
 | 608 |     if (def->m_size == -1) { | 
 | 609 |         if (def->m_base.m_copy) { | 
 | 610 |             /* Somebody already imported the module, | 
 | 611 |                likely under a different name. | 
 | 612 |                XXX this should really not happen. */ | 
 | 613 |             Py_DECREF(def->m_base.m_copy); | 
 | 614 |             def->m_base.m_copy = NULL; | 
 | 615 |         } | 
 | 616 |         dict = PyModule_GetDict(mod); | 
 | 617 |         if (dict == NULL) | 
 | 618 |             return -1; | 
 | 619 |         def->m_base.m_copy = PyDict_Copy(dict); | 
 | 620 |         if (def->m_base.m_copy == NULL) | 
 | 621 |             return -1; | 
 | 622 |     } | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 623 |     PyDict_SetItem(extensions, filename, (PyObject*)def); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 624 |     return 0; | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 625 | } | 
 | 626 |  | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 627 | int | 
 | 628 | _PyImport_FixupBuiltin(PyObject *mod, char *name) | 
 | 629 | { | 
 | 630 |     int res; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 631 |     PyObject *nameobj; | 
| Victor Stinner | 21fcd0c | 2011-03-07 18:28:15 +0100 | [diff] [blame] | 632 |     nameobj = PyUnicode_InternFromString(name); | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 633 |     if (nameobj == NULL) | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 634 |         return -1; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 635 |     res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj); | 
 | 636 |     Py_DECREF(nameobj); | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 637 |     return res; | 
 | 638 | } | 
 | 639 |  | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 640 | PyObject * | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 641 | _PyImport_FindExtensionObject(PyObject *name, PyObject *filename) | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 642 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 643 |     PyObject *mod, *mdict; | 
 | 644 |     PyModuleDef* def; | 
 | 645 |     if (extensions == NULL) | 
 | 646 |         return NULL; | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 647 |     def = (PyModuleDef*)PyDict_GetItem(extensions, filename); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 648 |     if (def == NULL) | 
 | 649 |         return NULL; | 
 | 650 |     if (def->m_size == -1) { | 
 | 651 |         /* Module does not support repeated initialization */ | 
 | 652 |         if (def->m_base.m_copy == NULL) | 
 | 653 |             return NULL; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 654 |         mod = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 655 |         if (mod == NULL) | 
 | 656 |             return NULL; | 
 | 657 |         mdict = PyModule_GetDict(mod); | 
 | 658 |         if (mdict == NULL) | 
 | 659 |             return NULL; | 
 | 660 |         if (PyDict_Update(mdict, def->m_base.m_copy)) | 
 | 661 |             return NULL; | 
 | 662 |     } | 
 | 663 |     else { | 
 | 664 |         if (def->m_base.m_init == NULL) | 
 | 665 |             return NULL; | 
 | 666 |         mod = def->m_base.m_init(); | 
 | 667 |         if (mod == NULL) | 
 | 668 |             return NULL; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 669 |         PyDict_SetItem(PyImport_GetModuleDict(), name, mod); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 670 |         Py_DECREF(mod); | 
 | 671 |     } | 
 | 672 |     if (_PyState_AddModule(mod, def) < 0) { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 673 |         PyDict_DelItem(PyImport_GetModuleDict(), name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 674 |         Py_DECREF(mod); | 
 | 675 |         return NULL; | 
 | 676 |     } | 
 | 677 |     if (Py_VerboseFlag) | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 678 |         PySys_FormatStderr("import %U # previously loaded (%R)\n", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 679 |                           name, filename); | 
 | 680 |     return mod; | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 681 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 682 | } | 
 | 683 |  | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 684 | PyObject * | 
| Victor Stinner | 501c09a | 2011-02-23 00:02:00 +0000 | [diff] [blame] | 685 | _PyImport_FindBuiltin(const char *name) | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 686 | { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 687 |     PyObject *res, *nameobj; | 
| Victor Stinner | 21fcd0c | 2011-03-07 18:28:15 +0100 | [diff] [blame] | 688 |     nameobj = PyUnicode_InternFromString(name); | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 689 |     if (nameobj == NULL) | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 690 |         return NULL; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 691 |     res = _PyImport_FindExtensionObject(nameobj, nameobj); | 
 | 692 |     Py_DECREF(nameobj); | 
| Victor Stinner | 49d3f25 | 2010-10-17 01:24:53 +0000 | [diff] [blame] | 693 |     return res; | 
 | 694 | } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 695 |  | 
 | 696 | /* Get the module object corresponding to a module name. | 
 | 697 |    First check the modules dictionary if there's one there, | 
| Walter Dörwald | f0dfc7a | 2003-10-20 14:01:56 +0000 | [diff] [blame] | 698 |    if not, create a new one and insert it in the modules dictionary. | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 699 |    Because the former action is most common, THIS DOES NOT RETURN A | 
 | 700 |    'NEW' REFERENCE! */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 701 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 702 | PyObject * | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 703 | PyImport_AddModuleObject(PyObject *name) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 704 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 705 |     PyObject *modules = PyImport_GetModuleDict(); | 
 | 706 |     PyObject *m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 707 |  | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 708 |     if ((m = PyDict_GetItem(modules, name)) != NULL && | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 709 |         PyModule_Check(m)) | 
 | 710 |         return m; | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 711 |     m = PyModule_NewObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 712 |     if (m == NULL) | 
 | 713 |         return NULL; | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 714 |     if (PyDict_SetItem(modules, name, m) != 0) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 715 |         Py_DECREF(m); | 
 | 716 |         return NULL; | 
 | 717 |     } | 
 | 718 |     Py_DECREF(m); /* Yes, it still exists, in modules! */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 719 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 720 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 721 | } | 
 | 722 |  | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 723 | PyObject * | 
 | 724 | PyImport_AddModule(const char *name) | 
 | 725 | { | 
 | 726 |     PyObject *nameobj, *module; | 
 | 727 |     nameobj = PyUnicode_FromString(name); | 
 | 728 |     if (nameobj == NULL) | 
 | 729 |         return NULL; | 
 | 730 |     module = PyImport_AddModuleObject(nameobj); | 
 | 731 |     Py_DECREF(nameobj); | 
 | 732 |     return module; | 
 | 733 | } | 
 | 734 |  | 
 | 735 |  | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 736 | /* Remove name from sys.modules, if it's there. */ | 
 | 737 | static void | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 738 | remove_module(PyObject *name) | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 739 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 740 |     PyObject *modules = PyImport_GetModuleDict(); | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 741 |     if (PyDict_GetItem(modules, name) == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 742 |         return; | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 743 |     if (PyDict_DelItem(modules, name) < 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 744 |         Py_FatalError("import:  deleting existing key in" | 
 | 745 |                       "sys.modules failed"); | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 746 | } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 747 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 748 | static PyObject * get_sourcefile(PyObject *filename); | 
 | 749 | static PyObject *make_source_pathname(PyObject *pathname); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 750 | static PyObject* make_compiled_pathname(Py_UNICODE *pathname, int debug); | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 751 |  | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 752 | /* Execute a code object in a module and return the module object | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 753 |  * WITH INCREMENTED REFERENCE COUNT.  If an error occurs, name is | 
 | 754 |  * removed from sys.modules, to avoid leaving damaged module objects | 
 | 755 |  * in sys.modules.  The caller may wish to restore the original | 
 | 756 |  * module object (if any) in this case; PyImport_ReloadModule is an | 
 | 757 |  * example. | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 758 |  * | 
 | 759 |  * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer | 
 | 760 |  * interface.  The other two exist primarily for backward compatibility. | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 761 |  */ | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 762 | PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 763 | PyImport_ExecCodeModule(char *name, PyObject *co) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 764 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 765 |     return PyImport_ExecCodeModuleWithPathnames( | 
 | 766 |         name, co, (char *)NULL, (char *)NULL); | 
| Guido van Rossum | e32bf6e | 1998-02-11 05:53:02 +0000 | [diff] [blame] | 767 | } | 
 | 768 |  | 
 | 769 | PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 770 | PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname) | 
| Guido van Rossum | e32bf6e | 1998-02-11 05:53:02 +0000 | [diff] [blame] | 771 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 772 |     return PyImport_ExecCodeModuleWithPathnames( | 
 | 773 |         name, co, pathname, (char *)NULL); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 774 | } | 
 | 775 |  | 
 | 776 | PyObject * | 
 | 777 | PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 778 |                                      char *cpathname) | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 779 | { | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 780 |     PyObject *m = NULL; | 
 | 781 |     PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; | 
 | 782 |  | 
 | 783 |     nameobj = PyUnicode_FromString(name); | 
 | 784 |     if (nameobj == NULL) | 
 | 785 |         return NULL; | 
 | 786 |  | 
 | 787 |     if (pathname != NULL) { | 
 | 788 |         pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 789 |         if (pathobj == NULL) | 
 | 790 |             goto error; | 
 | 791 |     } else | 
 | 792 |         pathobj = NULL; | 
 | 793 |     if (cpathname != NULL) { | 
 | 794 |         cpathobj = PyUnicode_DecodeFSDefault(cpathname); | 
 | 795 |         if (cpathobj == NULL) | 
 | 796 |             goto error; | 
 | 797 |     } else | 
 | 798 |         cpathobj = NULL; | 
 | 799 |     m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj); | 
 | 800 | error: | 
 | 801 |     Py_DECREF(nameobj); | 
 | 802 |     Py_XDECREF(pathobj); | 
 | 803 |     Py_XDECREF(cpathobj); | 
 | 804 |     return m; | 
 | 805 | } | 
 | 806 |  | 
 | 807 | PyObject* | 
 | 808 | PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, | 
 | 809 |                               PyObject *cpathname) | 
 | 810 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 811 |     PyObject *modules = PyImport_GetModuleDict(); | 
 | 812 |     PyObject *m, *d, *v; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 813 |  | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 814 |     m = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 815 |     if (m == NULL) | 
 | 816 |         return NULL; | 
 | 817 |     /* If the module is being reloaded, we get the old module back | 
 | 818 |        and re-use its dict to exec the new code. */ | 
 | 819 |     d = PyModule_GetDict(m); | 
 | 820 |     if (PyDict_GetItemString(d, "__builtins__") == NULL) { | 
 | 821 |         if (PyDict_SetItemString(d, "__builtins__", | 
 | 822 |                                  PyEval_GetBuiltins()) != 0) | 
 | 823 |             goto error; | 
 | 824 |     } | 
 | 825 |     /* Remember the filename as the __file__ attribute */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 826 |     if (pathname != NULL) { | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 827 |         v = get_sourcefile(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 828 |         if (v == NULL) | 
 | 829 |             PyErr_Clear(); | 
 | 830 |     } | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 831 |     else | 
 | 832 |         v = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 833 |     if (v == NULL) { | 
 | 834 |         v = ((PyCodeObject *)co)->co_filename; | 
 | 835 |         Py_INCREF(v); | 
 | 836 |     } | 
 | 837 |     if (PyDict_SetItemString(d, "__file__", v) != 0) | 
 | 838 |         PyErr_Clear(); /* Not important enough to report */ | 
 | 839 |     Py_DECREF(v); | 
| Guido van Rossum | e32bf6e | 1998-02-11 05:53:02 +0000 | [diff] [blame] | 840 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 841 |     /* Remember the pyc path name as the __cached__ attribute. */ | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 842 |     if (cpathname != NULL) | 
 | 843 |         v = cpathname; | 
 | 844 |     else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 845 |         v = Py_None; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 846 |     if (PyDict_SetItemString(d, "__cached__", v) != 0) | 
 | 847 |         PyErr_Clear(); /* Not important enough to report */ | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 848 |  | 
| Martin v. Löwis | 4d0d471 | 2010-12-03 20:14:31 +0000 | [diff] [blame] | 849 |     v = PyEval_EvalCode(co, d, d); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 850 |     if (v == NULL) | 
 | 851 |         goto error; | 
 | 852 |     Py_DECREF(v); | 
| Guido van Rossum | b65e85c | 1997-07-10 18:00:45 +0000 | [diff] [blame] | 853 |  | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 854 |     if ((m = PyDict_GetItem(modules, name)) == NULL) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 855 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 27ee089 | 2011-03-04 12:57:09 +0000 | [diff] [blame] | 856 |                      "Loaded module %R not found in sys.modules", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 857 |                      name); | 
 | 858 |         return NULL; | 
 | 859 |     } | 
| Guido van Rossum | b65e85c | 1997-07-10 18:00:45 +0000 | [diff] [blame] | 860 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 861 |     Py_INCREF(m); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 862 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 863 |     return m; | 
| Tim Peters | 1cd7017 | 2004-08-02 03:52:12 +0000 | [diff] [blame] | 864 |  | 
 | 865 |   error: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 866 |     remove_module(name); | 
 | 867 |     return NULL; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 868 | } | 
 | 869 |  | 
 | 870 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 871 | /* Like strrchr(string, '/') but searches for the rightmost of either SEP | 
 | 872 |    or ALTSEP, if the latter is defined. | 
 | 873 | */ | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 874 | static Py_UNICODE* | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 875 | rightmost_sep(Py_UNICODE *s) | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 876 | { | 
 | 877 |     Py_UNICODE *found, c; | 
 | 878 |     for (found = NULL; (c = *s); s++) { | 
 | 879 |         if (c == SEP | 
 | 880 | #ifdef ALTSEP | 
 | 881 |             || c == ALTSEP | 
 | 882 | #endif | 
 | 883 |             ) | 
 | 884 |         { | 
 | 885 |             found = s; | 
 | 886 |         } | 
 | 887 |     } | 
 | 888 |     return found; | 
 | 889 | } | 
 | 890 |  | 
 | 891 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 892 | /* Given a pathname for a Python source file, fill a buffer with the | 
 | 893 |    pathname for the corresponding compiled file.  Return the pathname | 
 | 894 |    for the compiled file, or NULL if there's no space in the buffer. | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 895 |    Doesn't set an exception. | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 896 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 897 |    foo.py -> __pycache__/foo.<tag>.pyc */ | 
 | 898 |  | 
 | 899 | static PyObject* | 
 | 900 | make_compiled_pathname(Py_UNICODE *pathname, int debug) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 901 | { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 902 |     Py_UNICODE buf[MAXPATHLEN]; | 
 | 903 |     size_t buflen = (size_t)MAXPATHLEN; | 
 | 904 |     size_t len = Py_UNICODE_strlen(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 905 |     size_t i, save; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 906 |     Py_UNICODE *pos; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 907 |     int sep = SEP; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 908 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 909 |     /* Sanity check that the buffer has roughly enough space to hold what | 
 | 910 |        will eventually be the full path to the compiled file.  The 5 extra | 
 | 911 |        bytes include the slash afer __pycache__, the two extra dots, the | 
 | 912 |        extra trailing character ('c' or 'o') and null.  This isn't exact | 
 | 913 |        because the contents of the buffer can affect how many actual | 
 | 914 |        characters of the string get into the buffer.  We'll do a final | 
 | 915 |        sanity check before writing the extension to ensure we do not | 
 | 916 |        overflow the buffer. | 
 | 917 |     */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 918 |     if (len + Py_UNICODE_strlen(CACHEDIR_UNICODE) + Py_UNICODE_strlen(PYC_TAG_UNICODE) + 5 > buflen) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 919 |         return NULL; | 
| Tim Peters | c173137 | 2001-08-04 08:12:36 +0000 | [diff] [blame] | 920 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 921 |     /* Find the last path separator and copy everything from the start of | 
 | 922 |        the source string up to and including the separator. | 
 | 923 |     */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 924 |     pos = rightmost_sep(pathname); | 
 | 925 |     if (pos == NULL) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 926 |         i = 0; | 
 | 927 |     } | 
 | 928 |     else { | 
 | 929 |         sep = *pos; | 
 | 930 |         i = pos - pathname + 1; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 931 |         Py_UNICODE_strncpy(buf, pathname, i); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 932 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 933 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 934 |     save = i; | 
 | 935 |     buf[i++] = '\0'; | 
 | 936 |     /* Add __pycache__/ */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 937 |     Py_UNICODE_strcat(buf, CACHEDIR_UNICODE); | 
 | 938 |     i += Py_UNICODE_strlen(CACHEDIR_UNICODE) - 1; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 939 |     buf[i++] = sep; | 
 | 940 |     buf[i++] = '\0'; | 
 | 941 |     /* Add the base filename, but remove the .py or .pyw extension, since | 
 | 942 |        the tag name must go before the extension. | 
 | 943 |     */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 944 |     Py_UNICODE_strcat(buf, pathname + save); | 
 | 945 |     pos = Py_UNICODE_strrchr(buf, '.'); | 
 | 946 |     if (pos != NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 947 |         *++pos = '\0'; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 948 |     Py_UNICODE_strcat(buf, PYC_TAG_UNICODE); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 949 |     /* The length test above assumes that we're only adding one character | 
 | 950 |        to the end of what would normally be the extension.  What if there | 
 | 951 |        is no extension, or the string ends in '.' or '.p', and otherwise | 
 | 952 |        fills the buffer?  By appending 4 more characters onto the string | 
 | 953 |        here, we could overrun the buffer. | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 954 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 955 |        As a simple example, let's say buflen=32 and the input string is | 
 | 956 |        'xxx.py'.  strlen() would be 6 and the test above would yield: | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 957 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 958 |        (6 + 11 + 10 + 5 == 32) > 32 | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 959 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 960 |        which is false and so the name mangling would continue.  This would | 
 | 961 |        be fine because we'd end up with this string in buf: | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 962 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 963 |        __pycache__/xxx.cpython-32.pyc\0 | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 964 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 965 |        strlen(of that) == 30 + the nul fits inside a 32 character buffer. | 
 | 966 |        We can even handle an input string of say 'xxxxx' above because | 
 | 967 |        that's (5 + 11 + 10 + 5 == 31) > 32 which is also false.  Name | 
 | 968 |        mangling that yields: | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 969 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 970 |        __pycache__/xxxxxcpython-32.pyc\0 | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 971 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 972 |        which is 32 characters including the nul, and thus fits in the | 
 | 973 |        buffer. However, an input string of 'xxxxxx' would yield a result | 
 | 974 |        string of: | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 975 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 976 |        __pycache__/xxxxxxcpython-32.pyc\0 | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 977 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 978 |        which is 33 characters long (including the nul), thus overflowing | 
 | 979 |        the buffer, even though the first test would fail, i.e.: the input | 
 | 980 |        string is also 6 characters long, so 32 > 32 is false. | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 981 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 982 |        The reason the first test fails but we still overflow the buffer is | 
 | 983 |        that the test above only expects to add one extra character to be | 
 | 984 |        added to the extension, and here we're adding three (pyc).  We | 
 | 985 |        don't add the first dot, so that reclaims one of expected | 
 | 986 |        positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed | 
 | 987 |        dot - 1 expected extra == 1 overflowed). | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 988 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 989 |        The best we can do is ensure that we still have enough room in the | 
 | 990 |        target buffer before we write the extension.  Because it's always | 
 | 991 |        only the extension that can cause the overflow, and never the other | 
 | 992 |        path bytes we've written, it's sufficient to just do one more test | 
 | 993 |        here.  Still, the assertion that follows can't hurt. | 
 | 994 |     */ | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 995 | #if 0 | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 996 |     printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 997 | #endif | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 998 |     len = Py_UNICODE_strlen(buf); | 
 | 999 |     if (len + 5 > buflen) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1000 |         return NULL; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1001 |     buf[len] = '.'; len++; | 
 | 1002 |     buf[len] = 'p'; len++; | 
 | 1003 |     buf[len] = 'y'; len++; | 
 | 1004 |     buf[len] = debug ? 'c' : 'o'; len++; | 
 | 1005 |     assert(len <= buflen); | 
 | 1006 |     return PyUnicode_FromUnicode(buf, len); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1007 | } | 
 | 1008 |  | 
 | 1009 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1010 | /* Given a pathname to a Python byte compiled file, return the path to the | 
 | 1011 |    source file, if the path matches the PEP 3147 format.  This does not check | 
 | 1012 |    for any file existence, however, if the pyc file name does not match PEP | 
 | 1013 |    3147 style, NULL is returned.  buf must be at least as big as pathname; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1014 |    the resulting path will always be shorter. | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1015 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1016 |    (...)/__pycache__/foo.<tag>.pyc -> (...)/foo.py */ | 
 | 1017 |  | 
 | 1018 | static PyObject* | 
 | 1019 | make_source_pathname(PyObject *pathobj) | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1020 | { | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1021 |     Py_UNICODE buf[MAXPATHLEN]; | 
 | 1022 |     Py_UNICODE *pathname; | 
 | 1023 |     Py_UNICODE *left, *right, *dot0, *dot1, sep; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1024 |     size_t i, j; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1025 |  | 
 | 1026 |     if (PyUnicode_GET_SIZE(pathobj) > MAXPATHLEN) | 
 | 1027 |         return NULL; | 
 | 1028 |     pathname = PyUnicode_AS_UNICODE(pathobj); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1029 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1030 |     /* Look back two slashes from the end.  In between these two slashes | 
 | 1031 |        must be the string __pycache__ or this is not a PEP 3147 style | 
 | 1032 |        path.  It's possible for there to be only one slash. | 
 | 1033 |     */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1034 |     right = rightmost_sep(pathname); | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1035 |     if (right == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1036 |         return NULL; | 
 | 1037 |     sep = *right; | 
 | 1038 |     *right = '\0'; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1039 |     left = rightmost_sep(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1040 |     *right = sep; | 
 | 1041 |     if (left == NULL) | 
 | 1042 |         left = pathname; | 
 | 1043 |     else | 
 | 1044 |         left++; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1045 |     if (right-left != Py_UNICODE_strlen(CACHEDIR_UNICODE) || | 
 | 1046 |         Py_UNICODE_strncmp(left, CACHEDIR_UNICODE, right-left) != 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1047 |         return NULL; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1048 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1049 |     /* Now verify that the path component to the right of the last slash | 
 | 1050 |        has two dots in it. | 
 | 1051 |     */ | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1052 |     if ((dot0 = Py_UNICODE_strchr(right + 1, '.')) == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1053 |         return NULL; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1054 |     if ((dot1 = Py_UNICODE_strchr(dot0 + 1, '.')) == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1055 |         return NULL; | 
 | 1056 |     /* Too many dots? */ | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1057 |     if (Py_UNICODE_strchr(dot1 + 1, '.') != NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1058 |         return NULL; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1059 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1060 |     /* This is a PEP 3147 path.  Start by copying everything from the | 
 | 1061 |        start of pathname up to and including the leftmost slash.  Then | 
 | 1062 |        copy the file's basename, removing the magic tag and adding a .py | 
 | 1063 |        suffix. | 
 | 1064 |     */ | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1065 |     Py_UNICODE_strncpy(buf, pathname, (i=left-pathname)); | 
 | 1066 |     Py_UNICODE_strncpy(buf+i, right+1, (j=dot0-right)); | 
 | 1067 |     buf[i+j] = 'p'; | 
 | 1068 |     buf[i+j+1] = 'y'; | 
 | 1069 |     return PyUnicode_FromUnicode(buf, i+j+2); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1070 | } | 
 | 1071 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1072 | /* Given a pathname for a Python source file, its time of last | 
 | 1073 |    modification, and a pathname for a compiled file, check whether the | 
 | 1074 |    compiled file represents the same version of the source.  If so, | 
 | 1075 |    return a FILE pointer for the compiled file, positioned just after | 
 | 1076 |    the header; if not, return NULL. | 
 | 1077 |    Doesn't set an exception. */ | 
 | 1078 |  | 
 | 1079 | static FILE * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1080 | check_compiled_module(PyObject *pathname, time_t mtime, PyObject *cpathname) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1081 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1082 |     FILE *fp; | 
 | 1083 |     long magic; | 
 | 1084 |     long pyc_mtime; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1085 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1086 |     fp = _Py_fopen(cpathname, "rb"); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1087 |     if (fp == NULL) | 
 | 1088 |         return NULL; | 
 | 1089 |     magic = PyMarshal_ReadLongFromFile(fp); | 
 | 1090 |     if (magic != pyc_magic) { | 
 | 1091 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1092 |             PySys_FormatStderr("# %R has bad magic\n", cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1093 |         fclose(fp); | 
 | 1094 |         return NULL; | 
 | 1095 |     } | 
 | 1096 |     pyc_mtime = PyMarshal_ReadLongFromFile(fp); | 
 | 1097 |     if (pyc_mtime != mtime) { | 
 | 1098 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1099 |             PySys_FormatStderr("# %R has bad mtime\n", cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1100 |         fclose(fp); | 
 | 1101 |         return NULL; | 
 | 1102 |     } | 
 | 1103 |     if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1104 |         PySys_FormatStderr("# %R matches %R\n", cpathname, pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1105 |     return fp; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1106 | } | 
 | 1107 |  | 
 | 1108 |  | 
 | 1109 | /* Read a code object from a file and check it for validity */ | 
 | 1110 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 1111 | static PyCodeObject * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1112 | read_compiled_module(PyObject *cpathname, FILE *fp) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1113 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1114 |     PyObject *co; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1115 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1116 |     co = PyMarshal_ReadLastObjectFromFile(fp); | 
 | 1117 |     if (co == NULL) | 
 | 1118 |         return NULL; | 
 | 1119 |     if (!PyCode_Check(co)) { | 
 | 1120 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1121 |                      "Non-code object in %R", cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1122 |         Py_DECREF(co); | 
 | 1123 |         return NULL; | 
 | 1124 |     } | 
 | 1125 |     return (PyCodeObject *)co; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1126 | } | 
 | 1127 |  | 
 | 1128 |  | 
 | 1129 | /* Load a module from a compiled file, execute it, and return its | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 1130 |    module object WITH INCREMENTED REFERENCE COUNT */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1131 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 1132 | static PyObject * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1133 | load_compiled_module(PyObject *name, PyObject *cpathname, FILE *fp) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1134 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1135 |     long magic; | 
 | 1136 |     PyCodeObject *co; | 
 | 1137 |     PyObject *m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1138 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1139 |     magic = PyMarshal_ReadLongFromFile(fp); | 
 | 1140 |     if (magic != pyc_magic) { | 
 | 1141 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1142 |                      "Bad magic number in %R", cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1143 |         return NULL; | 
 | 1144 |     } | 
 | 1145 |     (void) PyMarshal_ReadLongFromFile(fp); | 
 | 1146 |     co = read_compiled_module(cpathname, fp); | 
 | 1147 |     if (co == NULL) | 
 | 1148 |         return NULL; | 
 | 1149 |     if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1150 |         PySys_FormatStderr("import %U # precompiled from %R\n", | 
 | 1151 |                            name, cpathname); | 
 | 1152 |     m = PyImport_ExecCodeModuleObject(name, (PyObject *)co, | 
 | 1153 |                                       cpathname, cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1154 |     Py_DECREF(co); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1155 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1156 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1157 | } | 
 | 1158 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1159 | /* Parse a source file and return the corresponding code object */ | 
 | 1160 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 1161 | static PyCodeObject * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1162 | parse_source_module(PyObject *pathname, FILE *fp) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1163 | { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1164 |     PyCodeObject *co; | 
 | 1165 |     PyObject *pathbytes; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1166 |     mod_ty mod; | 
 | 1167 |     PyCompilerFlags flags; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1168 |     PyArena *arena; | 
 | 1169 |  | 
 | 1170 |     pathbytes = PyUnicode_EncodeFSDefault(pathname); | 
 | 1171 |     if (pathbytes == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1172 |         return NULL; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1173 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1174 |     arena = PyArena_New(); | 
 | 1175 |     if (arena == NULL) { | 
 | 1176 |         Py_DECREF(pathbytes); | 
 | 1177 |         return NULL; | 
 | 1178 |     } | 
 | 1179 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1180 |     flags.cf_flags = 0; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1181 |     mod = PyParser_ASTFromFile(fp, PyBytes_AS_STRING(pathbytes), NULL, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1182 |                                Py_file_input, 0, 0, &flags, | 
 | 1183 |                                NULL, arena); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1184 |     if (mod != NULL) | 
 | 1185 |         co = PyAST_Compile(mod, PyBytes_AS_STRING(pathbytes), NULL, arena); | 
 | 1186 |     else | 
 | 1187 |         co = NULL; | 
 | 1188 |     Py_DECREF(pathbytes); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1189 |     PyArena_Free(arena); | 
 | 1190 |     return co; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1191 | } | 
 | 1192 |  | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 1193 | /* Helper to open a bytecode file for writing in exclusive mode */ | 
 | 1194 |  | 
 | 1195 | static FILE * | 
| Christian Heimes | 05e8be1 | 2008-02-23 18:30:17 +0000 | [diff] [blame] | 1196 | open_exclusive(char *filename, mode_t mode) | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 1197 | { | 
 | 1198 | #if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1199 |     /* Use O_EXCL to avoid a race condition when another process tries to | 
 | 1200 |        write the same file.  When that happens, our open() call fails, | 
 | 1201 |        which is just fine (since it's only a cache). | 
 | 1202 |        XXX If the file exists and is writable but the directory is not | 
 | 1203 |        writable, the file will never be written.  Oh well. | 
 | 1204 |     */ | 
 | 1205 |     int fd; | 
 | 1206 |     (void) unlink(filename); | 
 | 1207 |     fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC | 
| Tim Peters | 42c83af | 2000-09-29 04:03:10 +0000 | [diff] [blame] | 1208 | #ifdef O_BINARY | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1209 |                             |O_BINARY   /* necessary for Windows */ | 
| Tim Peters | 42c83af | 2000-09-29 04:03:10 +0000 | [diff] [blame] | 1210 | #endif | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1211 | #ifdef __VMS | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1212 |             , mode, "ctxt=bin", "shr=nil" | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1213 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1214 |             , mode | 
| Martin v. Löwis | 79acb9e | 2002-12-06 12:48:53 +0000 | [diff] [blame] | 1215 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1216 |           ); | 
 | 1217 |     if (fd < 0) | 
 | 1218 |         return NULL; | 
 | 1219 |     return fdopen(fd, "wb"); | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 1220 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1221 |     /* Best we can do -- on Windows this can't happen anyway */ | 
 | 1222 |     return fopen(filename, "wb"); | 
| Guido van Rossum | 55a8338 | 2000-09-20 20:31:38 +0000 | [diff] [blame] | 1223 | #endif | 
 | 1224 | } | 
 | 1225 |  | 
 | 1226 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1227 | /* Write a compiled module to a file, placing the time of last | 
 | 1228 |    modification of its source into the header. | 
 | 1229 |    Errors are ignored, if a write error occurs an attempt is made to | 
 | 1230 |    remove the file. */ | 
 | 1231 |  | 
 | 1232 | static void | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1233 | write_compiled_module(PyCodeObject *co, PyObject *cpathname, | 
 | 1234 |                       struct stat *srcstat) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1235 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1236 |     FILE *fp; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1237 |     time_t mtime = srcstat->st_mtime; | 
| Alexandre Vassalotti | 9d58e3e | 2009-07-17 10:55:50 +0000 | [diff] [blame] | 1238 | #ifdef MS_WINDOWS   /* since Windows uses different permissions  */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1239 |     mode_t mode = srcstat->st_mode & ~S_IEXEC; | 
| Alexandre Vassalotti | 9d58e3e | 2009-07-17 10:55:50 +0000 | [diff] [blame] | 1240 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1241 |     mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; | 
 | 1242 |     mode_t dirmode = (srcstat->st_mode | | 
 | 1243 |                       S_IXUSR | S_IXGRP | S_IXOTH | | 
 | 1244 |                       S_IWUSR | S_IWGRP | S_IWOTH); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1245 |     PyObject *dirbytes; | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 1246 | #endif | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1247 |     PyObject *cpathbytes, *dirname; | 
 | 1248 |     Py_UNICODE *dirsep; | 
 | 1249 |     int res, ok; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1250 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1251 |     /* Ensure that the __pycache__ directory exists. */ | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1252 |     dirsep = rightmost_sep(PyUnicode_AS_UNICODE(cpathname)); | 
 | 1253 |     if (dirsep == NULL) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1254 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1255 |             PySys_FormatStderr("# no %s path found %R\n", CACHEDIR, cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1256 |         return; | 
 | 1257 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1258 |     dirname = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(cpathname), | 
 | 1259 |                                     dirsep - PyUnicode_AS_UNICODE(cpathname)); | 
 | 1260 |     if (dirname == NULL) { | 
 | 1261 |         PyErr_Clear(); | 
 | 1262 |         return; | 
 | 1263 |     } | 
| Daniel Stutzbach | c793779 | 2010-09-09 21:18:04 +0000 | [diff] [blame] | 1264 |  | 
 | 1265 | #ifdef MS_WINDOWS | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1266 |     res = CreateDirectoryW(PyUnicode_AS_UNICODE(dirname), NULL); | 
 | 1267 |     ok = (res != 0); | 
 | 1268 |     if (!ok && GetLastError() == ERROR_ALREADY_EXISTS) | 
 | 1269 |         ok = 1; | 
| Daniel Stutzbach | c793779 | 2010-09-09 21:18:04 +0000 | [diff] [blame] | 1270 | #else | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1271 |     dirbytes = PyUnicode_EncodeFSDefault(dirname); | 
 | 1272 |     if (dirbytes == NULL) { | 
 | 1273 |         PyErr_Clear(); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1274 |         return; | 
 | 1275 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1276 |     res = mkdir(PyBytes_AS_STRING(dirbytes), dirmode); | 
 | 1277 |     Py_DECREF(dirbytes); | 
 | 1278 |     if (0 <= res) | 
 | 1279 |         ok = 1; | 
 | 1280 |     else | 
 | 1281 |         ok = (errno == EEXIST); | 
 | 1282 | #endif | 
 | 1283 |     if (!ok) { | 
 | 1284 |         if (Py_VerboseFlag) | 
 | 1285 |             PySys_FormatStderr("# cannot create cache dir %R\n", dirname); | 
 | 1286 |         Py_DECREF(dirname); | 
 | 1287 |         return; | 
 | 1288 |     } | 
 | 1289 |     Py_DECREF(dirname); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1290 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1291 |     cpathbytes = PyUnicode_EncodeFSDefault(cpathname); | 
 | 1292 |     if (cpathbytes == NULL) { | 
 | 1293 |         PyErr_Clear(); | 
 | 1294 |         return; | 
 | 1295 |     } | 
 | 1296 |  | 
 | 1297 |     fp = open_exclusive(PyBytes_AS_STRING(cpathbytes), mode); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1298 |     if (fp == NULL) { | 
 | 1299 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1300 |             PySys_FormatStderr( | 
 | 1301 |                 "# can't create %R\n", cpathname); | 
 | 1302 |         Py_DECREF(cpathbytes); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1303 |         return; | 
 | 1304 |     } | 
 | 1305 |     PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION); | 
 | 1306 |     /* First write a 0 for mtime */ | 
 | 1307 |     PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); | 
 | 1308 |     PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); | 
 | 1309 |     if (fflush(fp) != 0 || ferror(fp)) { | 
 | 1310 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1311 |             PySys_FormatStderr("# can't write %R\n", cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1312 |         /* Don't keep partial file */ | 
 | 1313 |         fclose(fp); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1314 | #ifdef MS_WINDOWS | 
 | 1315 |         (void)DeleteFileW(PyUnicode_AS_UNICODE(cpathname)); | 
 | 1316 | #else | 
 | 1317 |         (void) unlink(PyBytes_AS_STRING(cpathbytes)); | 
 | 1318 | #endif | 
 | 1319 |         Py_DECREF(cpathbytes); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1320 |         return; | 
 | 1321 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1322 |     Py_DECREF(cpathbytes); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1323 |     /* Now write the true mtime */ | 
 | 1324 |     fseek(fp, 4L, 0); | 
 | 1325 |     assert(mtime < LONG_MAX); | 
 | 1326 |     PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); | 
 | 1327 |     fflush(fp); | 
 | 1328 |     fclose(fp); | 
 | 1329 |     if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1330 |         PySys_FormatStderr("# wrote %R\n", cpathname); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1331 | } | 
 | 1332 |  | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1333 | static void | 
 | 1334 | update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname) | 
 | 1335 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1336 |     PyObject *constants, *tmp; | 
 | 1337 |     Py_ssize_t i, n; | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1338 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1339 |     if (PyUnicode_Compare(co->co_filename, oldname)) | 
 | 1340 |         return; | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1341 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1342 |     tmp = co->co_filename; | 
 | 1343 |     co->co_filename = newname; | 
 | 1344 |     Py_INCREF(co->co_filename); | 
 | 1345 |     Py_DECREF(tmp); | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1346 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1347 |     constants = co->co_consts; | 
 | 1348 |     n = PyTuple_GET_SIZE(constants); | 
 | 1349 |     for (i = 0; i < n; i++) { | 
 | 1350 |         tmp = PyTuple_GET_ITEM(constants, i); | 
 | 1351 |         if (PyCode_Check(tmp)) | 
 | 1352 |             update_code_filenames((PyCodeObject *)tmp, | 
 | 1353 |                                   oldname, newname); | 
 | 1354 |     } | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1355 | } | 
 | 1356 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1357 | static void | 
 | 1358 | update_compiled_module(PyCodeObject *co, PyObject *newname) | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1359 | { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1360 |     PyObject *oldname; | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1361 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1362 |     if (PyUnicode_Compare(co->co_filename, newname) == 0) | 
 | 1363 |         return; | 
| Hirokazu Yamamoto | 4f447fb | 2009-03-04 01:52:10 +0000 | [diff] [blame] | 1364 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1365 |     oldname = co->co_filename; | 
 | 1366 |     Py_INCREF(oldname); | 
 | 1367 |     update_code_filenames(co, oldname, newname); | 
 | 1368 |     Py_DECREF(oldname); | 
| Antoine Pitrou | d35cbf6 | 2009-01-06 19:02:24 +0000 | [diff] [blame] | 1369 | } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1370 |  | 
 | 1371 | /* Load a source module from a given file and return its module | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 1372 |    object WITH INCREMENTED REFERENCE COUNT.  If there's a matching | 
 | 1373 |    byte-compiled file, use that instead. */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1374 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 1375 | static PyObject * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1376 | load_source_module(PyObject *name, PyObject *pathname, FILE *fp) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1377 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1378 |     struct stat st; | 
 | 1379 |     FILE *fpc; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1380 |     PyObject *cpathname = NULL, *cpathbytes = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1381 |     PyCodeObject *co; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1382 |     PyObject *m = NULL; | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 1383 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1384 |     if (fstat(fileno(fp), &st) != 0) { | 
 | 1385 |         PyErr_Format(PyExc_RuntimeError, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1386 |                      "unable to get file status from %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1387 |                      pathname); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1388 |         goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1389 |     } | 
| Fred Drake | 4c82b23 | 2000-06-30 16:18:57 +0000 | [diff] [blame] | 1390 | #if SIZEOF_TIME_T > 4 | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1391 |     /* Python's .pyc timestamp handling presumes that the timestamp fits | 
 | 1392 |        in 4 bytes. This will be fine until sometime in the year 2038, | 
 | 1393 |        when a 4-byte signed time_t will overflow. | 
 | 1394 |      */ | 
 | 1395 |     if (st.st_mtime >> 32) { | 
 | 1396 |         PyErr_SetString(PyExc_OverflowError, | 
 | 1397 |             "modification time overflows a 4 byte field"); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1398 |         goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1399 |     } | 
| Fred Drake | 4c82b23 | 2000-06-30 16:18:57 +0000 | [diff] [blame] | 1400 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1401 |     cpathname = make_compiled_pathname( | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1402 |         PyUnicode_AS_UNICODE(pathname), | 
 | 1403 |         !Py_OptimizeFlag); | 
 | 1404 |  | 
 | 1405 |     if (cpathname != NULL) | 
 | 1406 |         fpc = check_compiled_module(pathname, st.st_mtime, cpathname); | 
 | 1407 |     else | 
 | 1408 |         fpc = NULL; | 
 | 1409 |  | 
 | 1410 |     if (fpc) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1411 |         co = read_compiled_module(cpathname, fpc); | 
 | 1412 |         fclose(fpc); | 
 | 1413 |         if (co == NULL) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1414 |             goto error; | 
 | 1415 |         update_compiled_module(co, pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1416 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1417 |             PySys_FormatStderr("import %U # precompiled from %R\n", | 
 | 1418 |                                name, cpathname); | 
 | 1419 |         m = PyImport_ExecCodeModuleObject(name, (PyObject *)co, | 
 | 1420 |                                           cpathname, cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1421 |     } | 
 | 1422 |     else { | 
 | 1423 |         co = parse_source_module(pathname, fp); | 
 | 1424 |         if (co == NULL) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1425 |             goto error; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1426 |         if (Py_VerboseFlag) | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1427 |             PySys_FormatStderr("import %U # from %R\n", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1428 |                 name, pathname); | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1429 |         if (cpathname != NULL) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1430 |             PyObject *ro = PySys_GetObject("dont_write_bytecode"); | 
 | 1431 |             if (ro == NULL || !PyObject_IsTrue(ro)) | 
 | 1432 |                 write_compiled_module(co, cpathname, &st); | 
 | 1433 |         } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1434 |         m = PyImport_ExecCodeModuleObject(name, (PyObject *)co, | 
 | 1435 |                                           pathname, cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1436 |     } | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1437 |     Py_DECREF(co); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1438 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 1439 | error: | 
 | 1440 |     Py_XDECREF(cpathbytes); | 
 | 1441 |     Py_XDECREF(cpathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1442 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1443 | } | 
 | 1444 |  | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1445 | /* Get source file -> unicode or None | 
 | 1446 |  * Returns the path to the py file if available, else the given path | 
 | 1447 |  */ | 
 | 1448 | static PyObject * | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1449 | get_sourcefile(PyObject *filename) | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1450 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1451 |     Py_ssize_t len; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1452 |     Py_UNICODE *fileuni; | 
 | 1453 |     PyObject *py; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1454 |     struct stat statbuf; | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1455 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1456 |     len = PyUnicode_GET_SIZE(filename); | 
 | 1457 |     if (len == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1458 |         Py_RETURN_NONE; | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1459 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1460 |     /* don't match *.pyc or *.pyo? */ | 
 | 1461 |     fileuni = PyUnicode_AS_UNICODE(filename); | 
 | 1462 |     if (len < 5 | 
 | 1463 |         || fileuni[len-4] != '.' | 
 | 1464 |         || (fileuni[len-3] != 'p' && fileuni[len-3] != 'P') | 
 | 1465 |         || (fileuni[len-2] != 'y' && fileuni[len-2] != 'Y')) | 
 | 1466 |         goto unchanged; | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1467 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1468 |     /* Start by trying to turn PEP 3147 path into source path.  If that | 
 | 1469 |      * fails, just chop off the trailing character, i.e. legacy pyc path | 
 | 1470 |      * to py. | 
 | 1471 |      */ | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1472 |     py = make_source_pathname(filename); | 
 | 1473 |     if (py == NULL) { | 
 | 1474 |         PyErr_Clear(); | 
 | 1475 |         py = PyUnicode_FromUnicode(fileuni, len - 1); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1476 |     } | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1477 |     if (py == NULL) | 
 | 1478 |         goto error; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 1479 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1480 |     if (_Py_stat(py, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) | 
 | 1481 |         return py; | 
 | 1482 |     Py_DECREF(py); | 
 | 1483 |     goto unchanged; | 
 | 1484 |  | 
 | 1485 | error: | 
 | 1486 |     PyErr_Clear(); | 
 | 1487 | unchanged: | 
 | 1488 |     Py_INCREF(filename); | 
 | 1489 |     return filename; | 
| Christian Heimes | 3b06e53 | 2008-01-07 20:12:44 +0000 | [diff] [blame] | 1490 | } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1491 |  | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1492 | /* Forward */ | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1493 | static PyObject *load_module(char *, FILE *, char *, int, PyObject *); | 
| Victor Stinner | c696316 | 2011-03-12 09:26:54 -0500 | [diff] [blame] | 1494 | static struct filedescr *find_module(char *, const char *, PyObject *, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1495 |                                      char *, size_t, FILE **, PyObject **); | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 1496 | static struct _frozen * find_frozen(PyObject *); | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1497 |  | 
 | 1498 | /* Load a package and return its module object WITH INCREMENTED | 
 | 1499 |    REFERENCE COUNT */ | 
 | 1500 |  | 
 | 1501 | static PyObject * | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1502 | load_package(PyObject *name, PyObject *pathname) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1503 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1504 |     PyObject *m, *d; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1505 |     PyObject *file = NULL, *path_list = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1506 |     int err; | 
 | 1507 |     char buf[MAXPATHLEN+1]; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1508 |     FILE *fp = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1509 |     struct filedescr *fdp; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1510 |     char *namestr; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1511 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1512 |     m = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1513 |     if (m == NULL) | 
 | 1514 |         return NULL; | 
 | 1515 |     if (Py_VerboseFlag) | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1516 |         PySys_FormatStderr("import %U # directory %U\n", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1517 |             name, pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1518 |     file = get_sourcefile(pathname); | 
 | 1519 |     if (file == NULL) | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1520 |         return NULL; | 
 | 1521 |     path_list = Py_BuildValue("[O]", file); | 
 | 1522 |     if (path_list == NULL) { | 
 | 1523 |         Py_DECREF(file); | 
 | 1524 |         return NULL; | 
 | 1525 |     } | 
 | 1526 |     d = PyModule_GetDict(m); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1527 |     err = PyDict_SetItemString(d, "__file__", file); | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1528 |     Py_DECREF(file); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1529 |     if (err == 0) | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1530 |         err = PyDict_SetItemString(d, "__path__", path_list); | 
 | 1531 |     if (err != 0) { | 
 | 1532 |         Py_DECREF(path_list); | 
 | 1533 |         return NULL; | 
 | 1534 |     } | 
 | 1535 |     namestr = _PyUnicode_AsString(name); | 
 | 1536 |     if (namestr == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1537 |         goto error; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1538 |     fdp = find_module(namestr, "__init__", path_list, buf, sizeof(buf), &fp, NULL); | 
 | 1539 |     Py_DECREF(path_list); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1540 |     if (fdp == NULL) { | 
 | 1541 |         if (PyErr_ExceptionMatches(PyExc_ImportError)) { | 
 | 1542 |             PyErr_Clear(); | 
 | 1543 |             Py_INCREF(m); | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1544 |             return m; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1545 |         } | 
 | 1546 |         else | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1547 |             return NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1548 |     } | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 1549 |     m = load_module(namestr, fp, buf, fdp->type, NULL); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1550 |     if (fp != NULL) | 
 | 1551 |         fclose(fp); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1552 |     return m; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1553 | } | 
 | 1554 |  | 
 | 1555 |  | 
 | 1556 | /* Helper to test for built-in module */ | 
 | 1557 |  | 
 | 1558 | static int | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 1559 | is_builtin(PyObject *name) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1560 | { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 1561 |     int i, cmp; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1562 |     for (i = 0; PyImport_Inittab[i].name != NULL; i++) { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 1563 |         cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name); | 
 | 1564 |         if (cmp == 0) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1565 |             if (PyImport_Inittab[i].initfunc == NULL) | 
 | 1566 |                 return -1; | 
 | 1567 |             else | 
 | 1568 |                 return 1; | 
 | 1569 |         } | 
 | 1570 |     } | 
 | 1571 |     return 0; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1572 | } | 
 | 1573 |  | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1574 |  | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1575 | /* Return an importer object for a sys.path/pkg.__path__ item 'p', | 
 | 1576 |    possibly by fetching it from the path_importer_cache dict. If it | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 1577 |    wasn't yet cached, traverse path_hooks until a hook is found | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1578 |    that can handle the path item. Return None if no hook could; | 
 | 1579 |    this tells our caller it should fall back to the builtin | 
 | 1580 |    import mechanism. Cache the result in path_importer_cache. | 
 | 1581 |    Returns a borrowed reference. */ | 
 | 1582 |  | 
 | 1583 | static PyObject * | 
 | 1584 | get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1585 |                   PyObject *p) | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1586 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1587 |     PyObject *importer; | 
 | 1588 |     Py_ssize_t j, nhooks; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1589 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1590 |     /* These conditions are the caller's responsibility: */ | 
 | 1591 |     assert(PyList_Check(path_hooks)); | 
 | 1592 |     assert(PyDict_Check(path_importer_cache)); | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1593 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1594 |     nhooks = PyList_Size(path_hooks); | 
 | 1595 |     if (nhooks < 0) | 
 | 1596 |         return NULL; /* Shouldn't happen */ | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1597 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1598 |     importer = PyDict_GetItem(path_importer_cache, p); | 
 | 1599 |     if (importer != NULL) | 
 | 1600 |         return importer; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1601 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1602 |     /* set path_importer_cache[p] to None to avoid recursion */ | 
 | 1603 |     if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0) | 
 | 1604 |         return NULL; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1605 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1606 |     for (j = 0; j < nhooks; j++) { | 
 | 1607 |         PyObject *hook = PyList_GetItem(path_hooks, j); | 
 | 1608 |         if (hook == NULL) | 
 | 1609 |             return NULL; | 
 | 1610 |         importer = PyObject_CallFunctionObjArgs(hook, p, NULL); | 
 | 1611 |         if (importer != NULL) | 
 | 1612 |             break; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1613 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1614 |         if (!PyErr_ExceptionMatches(PyExc_ImportError)) { | 
 | 1615 |             return NULL; | 
 | 1616 |         } | 
 | 1617 |         PyErr_Clear(); | 
 | 1618 |     } | 
 | 1619 |     if (importer == NULL) { | 
 | 1620 |         importer = PyObject_CallFunctionObjArgs( | 
 | 1621 |             (PyObject *)&PyNullImporter_Type, p, NULL | 
 | 1622 |         ); | 
 | 1623 |         if (importer == NULL) { | 
 | 1624 |             if (PyErr_ExceptionMatches(PyExc_ImportError)) { | 
 | 1625 |                 PyErr_Clear(); | 
 | 1626 |                 return Py_None; | 
 | 1627 |             } | 
 | 1628 |         } | 
 | 1629 |     } | 
 | 1630 |     if (importer != NULL) { | 
 | 1631 |         int err = PyDict_SetItem(path_importer_cache, p, importer); | 
 | 1632 |         Py_DECREF(importer); | 
 | 1633 |         if (err != 0) | 
 | 1634 |             return NULL; | 
 | 1635 |     } | 
 | 1636 |     return importer; | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1637 | } | 
 | 1638 |  | 
| Christian Heimes | 9cd1775 | 2007-11-18 19:35:23 +0000 | [diff] [blame] | 1639 | PyAPI_FUNC(PyObject *) | 
 | 1640 | PyImport_GetImporter(PyObject *path) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1641 |     PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; | 
| Christian Heimes | 9cd1775 | 2007-11-18 19:35:23 +0000 | [diff] [blame] | 1642 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1643 |     if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { | 
 | 1644 |         if ((path_hooks = PySys_GetObject("path_hooks"))) { | 
 | 1645 |             importer = get_path_importer(path_importer_cache, | 
 | 1646 |                                          path_hooks, path); | 
 | 1647 |         } | 
 | 1648 |     } | 
 | 1649 |     Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ | 
 | 1650 |     return importer; | 
| Christian Heimes | 9cd1775 | 2007-11-18 19:35:23 +0000 | [diff] [blame] | 1651 | } | 
 | 1652 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1653 | /* Search the path (default sys.path) for a module.  Return the | 
 | 1654 |    corresponding filedescr struct, and (via return arguments) the | 
 | 1655 |    pathname and an open file.  Return NULL if the module is not found. */ | 
 | 1656 |  | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1657 | #ifdef MS_COREDLL | 
| Victor Stinner | 4d6c1c4 | 2011-03-08 23:49:04 +0100 | [diff] [blame] | 1658 | extern FILE *_PyWin_FindRegisteredModule(PyObject *, struct filedescr **, | 
 | 1659 |                                          PyObject **p_path); | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 1660 | #endif | 
 | 1661 |  | 
| Victor Stinner | c696316 | 2011-03-12 09:26:54 -0500 | [diff] [blame] | 1662 | static int case_ok(char *, Py_ssize_t, Py_ssize_t, const char *); | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 1663 | static int find_init_module(char *); /* Forward */ | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 1664 | static struct filedescr importhookdescr = {"", "", IMP_HOOK}; | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 1665 |  | 
| Victor Stinner | d68c2cf | 2011-03-12 16:02:28 -0500 | [diff] [blame] | 1666 | /* Get the path of a module: get its importer and call importer.find_module() | 
 | 1667 |    hook, or check if the module if a package (if path/__init__.py exists). | 
 | 1668 |  | 
 | 1669 |     -1: error: a Python error occurred | 
 | 1670 |      0: ignore: an error occurred because of invalid data, but the error is not | 
 | 1671 |         important enough to be reported. | 
 | 1672 |      1: get path: module not found, but *buf contains its path | 
 | 1673 |      2: found: *p_fd is the file descriptor (IMP_HOOK or PKG_DIRECTORY) | 
 | 1674 |         and *buf is the path */ | 
 | 1675 |  | 
 | 1676 | static int | 
 | 1677 | find_module_path(char *fullname, const char *name, PyObject *path, | 
 | 1678 |                  PyObject *path_hooks, PyObject *path_importer_cache, | 
 | 1679 |                  char *buf, size_t buflen, | 
 | 1680 |                  PyObject **p_loader, struct filedescr **p_fd) | 
 | 1681 | { | 
 | 1682 |     PyObject *path_bytes; | 
 | 1683 |     const char *base; | 
 | 1684 |     Py_ssize_t len; | 
 | 1685 |     size_t namelen; | 
 | 1686 |     struct stat statbuf; | 
 | 1687 |     static struct filedescr fd_package = {"", "", PKG_DIRECTORY}; | 
 | 1688 |  | 
 | 1689 |     if (PyUnicode_Check(path)) { | 
 | 1690 |         path_bytes = PyUnicode_EncodeFSDefault(path); | 
 | 1691 |         if (path_bytes == NULL) | 
 | 1692 |             return -1; | 
 | 1693 |     } | 
 | 1694 |     else if (PyBytes_Check(path)) { | 
 | 1695 |         Py_INCREF(path); | 
 | 1696 |         path_bytes = path; | 
 | 1697 |     } | 
 | 1698 |     else | 
 | 1699 |         return 0; | 
 | 1700 |  | 
 | 1701 |     namelen = strlen(name); | 
 | 1702 |     base = PyBytes_AS_STRING(path_bytes); | 
 | 1703 |     len = PyBytes_GET_SIZE(path_bytes); | 
 | 1704 |     if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { | 
 | 1705 |         Py_DECREF(path_bytes); | 
 | 1706 |         return 0; /* Too long */ | 
 | 1707 |     } | 
 | 1708 |     strcpy(buf, base); | 
 | 1709 |     Py_DECREF(path_bytes); | 
 | 1710 |  | 
 | 1711 |     if (strlen(buf) != len) { | 
 | 1712 |         return 0; /* path_bytes contains '\0' */ | 
 | 1713 |     } | 
 | 1714 |  | 
 | 1715 |     /* sys.path_hooks import hook */ | 
 | 1716 |     if (p_loader != NULL) { | 
 | 1717 |         PyObject *importer; | 
 | 1718 |  | 
 | 1719 |         importer = get_path_importer(path_importer_cache, | 
 | 1720 |                                      path_hooks, path); | 
 | 1721 |         if (importer == NULL) { | 
 | 1722 |             return -1; | 
 | 1723 |         } | 
 | 1724 |         /* Note: importer is a borrowed reference */ | 
 | 1725 |         if (importer != Py_None) { | 
 | 1726 |             PyObject *loader; | 
 | 1727 |             loader = PyObject_CallMethod(importer, | 
 | 1728 |                                          "find_module", | 
 | 1729 |                                          "s", fullname); | 
 | 1730 |             if (loader == NULL) | 
 | 1731 |                 return -1;  /* error */ | 
 | 1732 |             if (loader != Py_None) { | 
 | 1733 |                 /* a loader was found */ | 
 | 1734 |                 *p_loader = loader; | 
 | 1735 |                 *p_fd = &importhookdescr; | 
 | 1736 |                 return 2; | 
 | 1737 |             } | 
 | 1738 |             Py_DECREF(loader); | 
 | 1739 |             return 0; | 
 | 1740 |         } | 
 | 1741 |     } | 
 | 1742 |     /* no hook was found, use builtin import */ | 
 | 1743 |  | 
 | 1744 |     if (len > 0 && buf[len-1] != SEP | 
 | 1745 | #ifdef ALTSEP | 
 | 1746 |         && buf[len-1] != ALTSEP | 
 | 1747 | #endif | 
 | 1748 |         ) | 
 | 1749 |         buf[len++] = SEP; | 
 | 1750 |     strcpy(buf+len, name); | 
 | 1751 |     len += namelen; | 
 | 1752 |  | 
 | 1753 |     /* Check for package import (buf holds a directory name, | 
 | 1754 |        and there's an __init__ module in that directory */ | 
 | 1755 | #ifdef HAVE_STAT | 
 | 1756 |     if (stat(buf, &statbuf) == 0 &&         /* it exists */ | 
 | 1757 |         S_ISDIR(statbuf.st_mode) &&         /* it's a directory */ | 
 | 1758 |         case_ok(buf, len, namelen, name)) { /* case matches */ | 
 | 1759 |         if (find_init_module(buf)) { /* and has __init__.py */ | 
 | 1760 |             *p_fd = &fd_package; | 
 | 1761 |             return 2; | 
 | 1762 |         } | 
 | 1763 |         else { | 
 | 1764 |             int err; | 
 | 1765 |             PyObject *unicode = PyUnicode_DecodeFSDefault(buf); | 
 | 1766 |             if (unicode == NULL) | 
 | 1767 |                 return -1; | 
 | 1768 |             err = PyErr_WarnFormat(PyExc_ImportWarning, 1, | 
 | 1769 |                 "Not importing directory '%U': missing __init__.py", | 
 | 1770 |                 unicode); | 
 | 1771 |             Py_DECREF(unicode); | 
 | 1772 |             if (err) | 
 | 1773 |                 return -1; | 
 | 1774 |         } | 
 | 1775 |     } | 
 | 1776 | #endif | 
 | 1777 |     return 1; | 
 | 1778 | } | 
 | 1779 |  | 
 | 1780 | /* Find a module in search_path_list. For each path, try | 
 | 1781 |    find_module_filename() or try each _PyImport_Filetab suffix. | 
 | 1782 |  | 
 | 1783 |    If the module is found, return a file descriptor, write the path in | 
 | 1784 |    *p_filename, write the pointer to the file object into *p_fp, and (if | 
 | 1785 |    p_loader is not NULL) the loader into *p_loader. | 
 | 1786 |  | 
 | 1787 |    Otherwise, raise an exception and return NULL. */ | 
 | 1788 |  | 
| Victor Stinner | 3758028 | 2011-03-20 01:34:43 +0100 | [diff] [blame] | 1789 | static struct filedescr* | 
 | 1790 | find_module_path_list(char *fullname, const char *name, | 
 | 1791 |                       PyObject *search_path_list, PyObject *path_hooks, | 
 | 1792 |                       PyObject *path_importer_cache, | 
 | 1793 |                       char *buf, size_t buflen, | 
 | 1794 |                       FILE **p_fp, PyObject **p_loader) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1795 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1796 |     Py_ssize_t i, npath; | 
 | 1797 |     size_t len, namelen; | 
 | 1798 |     struct filedescr *fdp = NULL; | 
 | 1799 |     char *filemode; | 
 | 1800 |     FILE *fp = NULL; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1801 | #if defined(PYOS_OS2) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1802 |     size_t saved_len; | 
 | 1803 |     size_t saved_namelen; | 
 | 1804 |     char *saved_buf = NULL; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1805 | #endif | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 1806 |  | 
| Victor Stinner | 3758028 | 2011-03-20 01:34:43 +0100 | [diff] [blame] | 1807 |     npath = PyList_Size(search_path_list); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1808 |     namelen = strlen(name); | 
 | 1809 |     for (i = 0; i < npath; i++) { | 
| Victor Stinner | d68c2cf | 2011-03-12 16:02:28 -0500 | [diff] [blame] | 1810 |         PyObject *path; | 
 | 1811 |         int ok; | 
 | 1812 |  | 
 | 1813 |         path = PyList_GetItem(search_path_list, i); | 
 | 1814 |         if (path == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1815 |             return NULL; | 
| Victor Stinner | d68c2cf | 2011-03-12 16:02:28 -0500 | [diff] [blame] | 1816 |  | 
 | 1817 |         ok = find_module_path(fullname, name, path, | 
 | 1818 |                               path_hooks, path_importer_cache, | 
 | 1819 |                               buf, buflen, | 
 | 1820 |                               p_loader, &fdp); | 
 | 1821 |         if (ok < 0) | 
 | 1822 |             return NULL; | 
 | 1823 |         if (ok == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1824 |             continue; | 
| Victor Stinner | d68c2cf | 2011-03-12 16:02:28 -0500 | [diff] [blame] | 1825 |         if (ok == 2) | 
 | 1826 |             return fdp; | 
| Amaury Forgeot d'Arc | f1ca0b1 | 2008-06-11 17:40:47 +0000 | [diff] [blame] | 1827 |  | 
| Victor Stinner | d68c2cf | 2011-03-12 16:02:28 -0500 | [diff] [blame] | 1828 |         len = strlen(buf); | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1829 | #if defined(PYOS_OS2) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1830 |         /* take a snapshot of the module spec for restoration | 
 | 1831 |          * after the 8 character DLL hackery | 
 | 1832 |          */ | 
 | 1833 |         saved_buf = strdup(buf); | 
 | 1834 |         saved_len = len; | 
 | 1835 |         saved_namelen = namelen; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1836 | #endif /* PYOS_OS2 */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1837 |         for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 1838 | #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1839 |             /* OS/2 limits DLLs to 8 character names (w/o | 
 | 1840 |                extension) | 
 | 1841 |              * so if the name is longer than that and its a | 
 | 1842 |              * dynamically loaded module we're going to try, | 
 | 1843 |              * truncate the name before trying | 
 | 1844 |              */ | 
| Victor Stinner | c696316 | 2011-03-12 09:26:54 -0500 | [diff] [blame] | 1845 |             if (strlen(name) > 8) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1846 |                 /* is this an attempt to load a C extension? */ | 
 | 1847 |                 const struct filedescr *scan; | 
 | 1848 |                 scan = _PyImport_DynLoadFiletab; | 
 | 1849 |                 while (scan->suffix != NULL) { | 
 | 1850 |                     if (!strcmp(scan->suffix, fdp->suffix)) | 
 | 1851 |                         break; | 
 | 1852 |                     else | 
 | 1853 |                         scan++; | 
 | 1854 |                 } | 
 | 1855 |                 if (scan->suffix != NULL) { | 
 | 1856 |                     /* yes, so truncate the name */ | 
 | 1857 |                     namelen = 8; | 
| Victor Stinner | c696316 | 2011-03-12 09:26:54 -0500 | [diff] [blame] | 1858 |                     len -= strlen(name) - namelen; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1859 |                     buf[len] = '\0'; | 
 | 1860 |                 } | 
 | 1861 |             } | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1862 | #endif /* PYOS_OS2 */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1863 |             strcpy(buf+len, fdp->suffix); | 
 | 1864 |             if (Py_VerboseFlag > 1) | 
 | 1865 |                 PySys_WriteStderr("# trying %s\n", buf); | 
 | 1866 |             filemode = fdp->mode; | 
 | 1867 |             if (filemode[0] == 'U') | 
 | 1868 |                 filemode = "r" PY_STDIOTEXTMODE; | 
 | 1869 |             fp = fopen(buf, filemode); | 
 | 1870 |             if (fp != NULL) { | 
 | 1871 |                 if (case_ok(buf, len, namelen, name)) | 
 | 1872 |                     break; | 
 | 1873 |                 else {                   /* continue search */ | 
 | 1874 |                     fclose(fp); | 
 | 1875 |                     fp = NULL; | 
 | 1876 |                 } | 
 | 1877 |             } | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1878 | #if defined(PYOS_OS2) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1879 |             /* restore the saved snapshot */ | 
 | 1880 |             strcpy(buf, saved_buf); | 
 | 1881 |             len = saved_len; | 
 | 1882 |             namelen = saved_namelen; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1883 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1884 |         } | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1885 | #if defined(PYOS_OS2) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1886 |         /* don't need/want the module name snapshot anymore */ | 
 | 1887 |         if (saved_buf) | 
 | 1888 |         { | 
 | 1889 |             free(saved_buf); | 
 | 1890 |             saved_buf = NULL; | 
 | 1891 |         } | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 1892 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 1893 |         if (fp != NULL) | 
 | 1894 |             break; | 
 | 1895 |     } | 
 | 1896 |     if (fp == NULL) { | 
 | 1897 |         PyErr_Format(PyExc_ImportError, | 
 | 1898 |                      "No module named %.200s", name); | 
 | 1899 |         return NULL; | 
 | 1900 |     } | 
 | 1901 |     *p_fp = fp; | 
 | 1902 |     return fdp; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 1903 | } | 
 | 1904 |  | 
| Victor Stinner | 3758028 | 2011-03-20 01:34:43 +0100 | [diff] [blame] | 1905 | /* Find a module: | 
 | 1906 |  | 
 | 1907 |    - try find_module() of each sys.meta_path hook | 
 | 1908 |    - try find_frozen() | 
 | 1909 |    - try is_builtin() | 
 | 1910 |    - try _PyWin_FindRegisteredModule() (Windows only) | 
 | 1911 |    - otherwise, call find_module_path_list() with search_path_list (if not | 
 | 1912 |      NULL) or sys.path | 
 | 1913 |  | 
 | 1914 |    Return: | 
 | 1915 |  | 
 | 1916 |    - &fd_builtin (C_BUILTIN) if it is a builtin | 
 | 1917 |    - &fd_frozen (PY_FROZEN) if it is frozen | 
 | 1918 |    - &fd_package (PKG_DIRECTORY) and write the filename into *buf | 
 | 1919 |      if it is a package | 
 | 1920 |    - &importhookdescr (IMP_HOOK) and write the loader into *p_loader if a | 
 | 1921 |      importer loader was found | 
 | 1922 |    - a file descriptor (PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE or | 
 | 1923 |      PY_CODERESOURCE: see _PyImport_Filetab), write the filename into | 
 | 1924 |      *buf and the pointer to the open file into *p_fp | 
 | 1925 |    - NULL on error | 
 | 1926 |  | 
 | 1927 |    By default, write an empty string into *buf, and *p_fp and *p_loader (if | 
 | 1928 |    set) are set to NULL. Eg. *buf is an empty string for a builtin package. */ | 
 | 1929 |  | 
 | 1930 | static struct filedescr * | 
 | 1931 | find_module(char *fullname, const char *name, PyObject *search_path_list, | 
 | 1932 |             char *buf, size_t buflen, FILE **p_fp, PyObject **p_loader) | 
 | 1933 | { | 
 | 1934 |     Py_ssize_t i, npath; | 
 | 1935 |     static struct filedescr fd_frozen = {"", "", PY_FROZEN}; | 
 | 1936 |     static struct filedescr fd_builtin = {"", "", C_BUILTIN}; | 
 | 1937 |     PyObject *path_hooks, *path_importer_cache; | 
 | 1938 |     PyObject *fullname_obj, *nameobj; | 
 | 1939 |  | 
 | 1940 |     *buf = '\0'; | 
 | 1941 |     *p_fp = NULL; | 
 | 1942 |     if (p_loader != NULL) | 
 | 1943 |         *p_loader = NULL; | 
 | 1944 |  | 
 | 1945 |     if (strlen(name) > MAXPATHLEN) { | 
 | 1946 |         PyErr_SetString(PyExc_OverflowError, | 
 | 1947 |                         "module name is too long"); | 
 | 1948 |         return NULL; | 
 | 1949 |     } | 
 | 1950 |  | 
 | 1951 |     /* sys.meta_path import hook */ | 
 | 1952 |     if (p_loader != NULL) { | 
 | 1953 |         PyObject *meta_path; | 
 | 1954 |  | 
 | 1955 |         meta_path = PySys_GetObject("meta_path"); | 
 | 1956 |         if (meta_path == NULL || !PyList_Check(meta_path)) { | 
 | 1957 |             PyErr_SetString(PyExc_ImportError, | 
 | 1958 |                             "sys.meta_path must be a list of " | 
 | 1959 |                             "import hooks"); | 
 | 1960 |             return NULL; | 
 | 1961 |         } | 
 | 1962 |         Py_INCREF(meta_path);  /* zap guard */ | 
 | 1963 |         npath = PyList_Size(meta_path); | 
 | 1964 |         for (i = 0; i < npath; i++) { | 
 | 1965 |             PyObject *loader; | 
 | 1966 |             PyObject *hook = PyList_GetItem(meta_path, i); | 
 | 1967 |             loader = PyObject_CallMethod(hook, "find_module", | 
 | 1968 |                                          "sO", fullname, | 
 | 1969 |                                          search_path_list != NULL ? | 
 | 1970 |                                          search_path_list : Py_None); | 
 | 1971 |             if (loader == NULL) { | 
 | 1972 |                 Py_DECREF(meta_path); | 
 | 1973 |                 return NULL;  /* true error */ | 
 | 1974 |             } | 
 | 1975 |             if (loader != Py_None) { | 
 | 1976 |                 /* a loader was found */ | 
 | 1977 |                 *p_loader = loader; | 
 | 1978 |                 Py_DECREF(meta_path); | 
 | 1979 |                 return &importhookdescr; | 
 | 1980 |             } | 
 | 1981 |             Py_DECREF(loader); | 
 | 1982 |         } | 
 | 1983 |         Py_DECREF(meta_path); | 
 | 1984 |     } | 
 | 1985 |  | 
 | 1986 |     if (fullname != NULL) { | 
 | 1987 |         fullname_obj = PyUnicode_FromString(fullname); | 
 | 1988 |         if (fullname == NULL) | 
 | 1989 |             return NULL; | 
 | 1990 |         if (find_frozen(fullname_obj) != NULL) { | 
 | 1991 |             Py_DECREF(fullname_obj); | 
 | 1992 |             strcpy(buf, fullname); | 
 | 1993 |             return &fd_frozen; | 
 | 1994 |         } | 
 | 1995 |         Py_DECREF(fullname_obj); | 
 | 1996 |     } | 
 | 1997 |  | 
 | 1998 |     if (search_path_list == NULL) { | 
 | 1999 | #ifdef MS_COREDLL | 
 | 2000 |         FILE *fp; | 
 | 2001 |         struct filedescr *fdp; | 
 | 2002 |         PyObject *filename, *filename_bytes; | 
 | 2003 | #endif | 
 | 2004 |         nameobj = PyUnicode_FromString(name); | 
 | 2005 |         if (nameobj == NULL) | 
 | 2006 |             return NULL; | 
 | 2007 |         if (is_builtin(nameobj)) { | 
 | 2008 |             Py_DECREF(nameobj); | 
 | 2009 |             strcpy(buf, name); | 
 | 2010 |             return &fd_builtin; | 
 | 2011 |         } | 
 | 2012 | #ifdef MS_COREDLL | 
 | 2013 |         fp = _PyWin_FindRegisteredModule(nameobj, &fdp, &filename); | 
 | 2014 |         if (fp != NULL) { | 
 | 2015 |             Py_DECREF(nameobj); | 
 | 2016 |             filename_bytes = PyUnicode_EncodeFSDefault(filename); | 
 | 2017 |             Py_DECREF(filename); | 
 | 2018 |             if (filename_bytes == NULL) | 
 | 2019 |                 return NULL; | 
 | 2020 |             strncpy(buf, PyBytes_AS_STRING(filename_bytes), buflen); | 
 | 2021 |             buf[buflen-1] = '\0'; | 
 | 2022 |             Py_DECREF(filename_bytes); | 
 | 2023 |             *p_fp = fp; | 
 | 2024 |             return fdp; | 
 | 2025 |         } | 
 | 2026 |         else if (PyErr_Occurred()) | 
 | 2027 |             return NULL; | 
 | 2028 | #endif | 
 | 2029 |         Py_DECREF(nameobj); | 
 | 2030 |         search_path_list = PySys_GetObject("path"); | 
 | 2031 |     } | 
 | 2032 |  | 
 | 2033 |     if (search_path_list == NULL || !PyList_Check(search_path_list)) { | 
 | 2034 |         PyErr_SetString(PyExc_ImportError, | 
 | 2035 |                         "sys.path must be a list of directory names"); | 
 | 2036 |         return NULL; | 
 | 2037 |     } | 
 | 2038 |  | 
 | 2039 |     path_hooks = PySys_GetObject("path_hooks"); | 
 | 2040 |     if (path_hooks == NULL || !PyList_Check(path_hooks)) { | 
 | 2041 |         PyErr_SetString(PyExc_ImportError, | 
 | 2042 |                         "sys.path_hooks must be a list of " | 
 | 2043 |                         "import hooks"); | 
 | 2044 |         return NULL; | 
 | 2045 |     } | 
 | 2046 |     path_importer_cache = PySys_GetObject("path_importer_cache"); | 
 | 2047 |     if (path_importer_cache == NULL || | 
 | 2048 |         !PyDict_Check(path_importer_cache)) { | 
 | 2049 |         PyErr_SetString(PyExc_ImportError, | 
 | 2050 |                         "sys.path_importer_cache must be a dict"); | 
 | 2051 |         return NULL; | 
 | 2052 |     } | 
 | 2053 |  | 
 | 2054 |     return find_module_path_list(fullname, name, | 
 | 2055 |                                  search_path_list, path_hooks, | 
 | 2056 |                                  path_importer_cache, | 
 | 2057 |                                  buf, buflen, | 
 | 2058 |                                  p_fp, p_loader); | 
 | 2059 | } | 
 | 2060 |  | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 2061 | /* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name) | 
| Tim Peters | d1e87a8 | 2001-03-01 18:12:00 +0000 | [diff] [blame] | 2062 |  * The arguments here are tricky, best shown by example: | 
 | 2063 |  *    /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 | 
 | 2064 |  *    ^                      ^                   ^    ^ | 
 | 2065 |  *    |--------------------- buf ---------------------| | 
 | 2066 |  *    |------------------- len ------------------| | 
 | 2067 |  *                           |------ name -------| | 
 | 2068 |  *                           |----- namelen -----| | 
 | 2069 |  * buf is the full path, but len only counts up to (& exclusive of) the | 
 | 2070 |  * extension.  name is the module name, also exclusive of extension. | 
 | 2071 |  * | 
 | 2072 |  * We've already done a successful stat() or fopen() on buf, so know that | 
 | 2073 |  * there's some match, possibly case-insensitive. | 
 | 2074 |  * | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2075 |  * case_ok() is to return 1 if there's a case-sensitive match for | 
 | 2076 |  * name, else 0.  case_ok() is also to return 1 if envar PYTHONCASEOK | 
 | 2077 |  * exists. | 
| Tim Peters | d1e87a8 | 2001-03-01 18:12:00 +0000 | [diff] [blame] | 2078 |  * | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2079 |  * case_ok() is used to implement case-sensitive import semantics even | 
 | 2080 |  * on platforms with case-insensitive filesystems.  It's trivial to implement | 
 | 2081 |  * for case-sensitive filesystems.  It's pretty much a cross-platform | 
 | 2082 |  * nightmare for systems with case-insensitive filesystems. | 
 | 2083 |  */ | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2084 |  | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2085 | /* First we may need a pile of platform-specific header files; the sequence | 
 | 2086 |  * of #if's here should match the sequence in the body of case_ok(). | 
 | 2087 |  */ | 
| Jason Tishler | 7961aa6 | 2005-05-20 00:56:54 +0000 | [diff] [blame] | 2088 | #if defined(MS_WINDOWS) | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2089 | #include <windows.h> | 
| Guido van Rossum | 4c3f57c | 2001-01-10 20:40:46 +0000 | [diff] [blame] | 2090 |  | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2091 | #elif defined(DJGPP) | 
 | 2092 | #include <dir.h> | 
 | 2093 |  | 
| Jason Tishler | 7961aa6 | 2005-05-20 00:56:54 +0000 | [diff] [blame] | 2094 | #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2095 | #include <sys/types.h> | 
 | 2096 | #include <dirent.h> | 
 | 2097 |  | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 2098 | #elif defined(PYOS_OS2) | 
 | 2099 | #define INCL_DOS | 
 | 2100 | #define INCL_DOSERRORS | 
 | 2101 | #define INCL_NOPMAPI | 
 | 2102 | #include <os2.h> | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2103 | #endif | 
 | 2104 |  | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2105 | static int | 
| Victor Stinner | c696316 | 2011-03-12 09:26:54 -0500 | [diff] [blame] | 2106 | case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, const char *name) | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2107 | { | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2108 | /* Pick a platform-specific implementation; the sequence of #if's here should | 
 | 2109 |  * match the sequence just above. | 
 | 2110 |  */ | 
 | 2111 |  | 
| Jason Tishler | 7961aa6 | 2005-05-20 00:56:54 +0000 | [diff] [blame] | 2112 | /* MS_WINDOWS */ | 
 | 2113 | #if defined(MS_WINDOWS) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2114 |     WIN32_FIND_DATA data; | 
 | 2115 |     HANDLE h; | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2116 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2117 |     if (Py_GETENV("PYTHONCASEOK") != NULL) | 
 | 2118 |         return 1; | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2119 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2120 |     h = FindFirstFile(buf, &data); | 
 | 2121 |     if (h == INVALID_HANDLE_VALUE) { | 
 | 2122 |         PyErr_Format(PyExc_NameError, | 
 | 2123 |           "Can't find file for module %.100s\n(filename %.300s)", | 
 | 2124 |           name, buf); | 
 | 2125 |         return 0; | 
 | 2126 |     } | 
 | 2127 |     FindClose(h); | 
 | 2128 |     return strncmp(data.cFileName, name, namelen) == 0; | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2129 |  | 
 | 2130 | /* DJGPP */ | 
 | 2131 | #elif defined(DJGPP) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2132 |     struct ffblk ffblk; | 
 | 2133 |     int done; | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2134 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2135 |     if (Py_GETENV("PYTHONCASEOK") != NULL) | 
 | 2136 |         return 1; | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2137 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2138 |     done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC); | 
 | 2139 |     if (done) { | 
 | 2140 |         PyErr_Format(PyExc_NameError, | 
 | 2141 |           "Can't find file for module %.100s\n(filename %.300s)", | 
 | 2142 |           name, buf); | 
 | 2143 |         return 0; | 
 | 2144 |     } | 
 | 2145 |     return strncmp(ffblk.ff_name, name, namelen) == 0; | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2146 |  | 
| Jason Tishler | 7961aa6 | 2005-05-20 00:56:54 +0000 | [diff] [blame] | 2147 | /* new-fangled macintosh (macosx) or Cygwin */ | 
 | 2148 | #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2149 |     DIR *dirp; | 
 | 2150 |     struct dirent *dp; | 
 | 2151 |     char dirname[MAXPATHLEN + 1]; | 
 | 2152 |     const int dirlen = len - namelen - 1; /* don't want trailing SEP */ | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2153 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2154 |     if (Py_GETENV("PYTHONCASEOK") != NULL) | 
 | 2155 |         return 1; | 
| Tim Peters | dbe6ebb | 2001-03-01 08:47:29 +0000 | [diff] [blame] | 2156 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2157 |     /* Copy the dir component into dirname; substitute "." if empty */ | 
 | 2158 |     if (dirlen <= 0) { | 
 | 2159 |         dirname[0] = '.'; | 
 | 2160 |         dirname[1] = '\0'; | 
 | 2161 |     } | 
 | 2162 |     else { | 
 | 2163 |         assert(dirlen <= MAXPATHLEN); | 
 | 2164 |         memcpy(dirname, buf, dirlen); | 
 | 2165 |         dirname[dirlen] = '\0'; | 
 | 2166 |     } | 
 | 2167 |     /* Open the directory and search the entries for an exact match. */ | 
 | 2168 |     dirp = opendir(dirname); | 
 | 2169 |     if (dirp) { | 
 | 2170 |         char *nameWithExt = buf + len - namelen; | 
 | 2171 |         while ((dp = readdir(dirp)) != NULL) { | 
 | 2172 |             const int thislen = | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2173 | #ifdef _DIRENT_HAVE_D_NAMELEN | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2174 |                                     dp->d_namlen; | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2175 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2176 |                                     strlen(dp->d_name); | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2177 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2178 |             if (thislen >= namelen && | 
 | 2179 |                 strcmp(dp->d_name, nameWithExt) == 0) { | 
 | 2180 |                 (void)closedir(dirp); | 
 | 2181 |                 return 1; /* Found */ | 
 | 2182 |             } | 
 | 2183 |         } | 
 | 2184 |         (void)closedir(dirp); | 
 | 2185 |     } | 
 | 2186 |     return 0 ; /* Not found */ | 
| Tim Peters | 430f5d4 | 2001-03-01 01:30:56 +0000 | [diff] [blame] | 2187 |  | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 2188 | /* OS/2 */ | 
 | 2189 | #elif defined(PYOS_OS2) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2190 |     HDIR hdir = 1; | 
 | 2191 |     ULONG srchcnt = 1; | 
 | 2192 |     FILEFINDBUF3 ffbuf; | 
 | 2193 |     APIRET rc; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 2194 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2195 |     if (Py_GETENV("PYTHONCASEOK") != NULL) | 
 | 2196 |         return 1; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 2197 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2198 |     rc = DosFindFirst(buf, | 
 | 2199 |                       &hdir, | 
 | 2200 |                       FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY, | 
 | 2201 |                       &ffbuf, sizeof(ffbuf), | 
 | 2202 |                       &srchcnt, | 
 | 2203 |                       FIL_STANDARD); | 
 | 2204 |     if (rc != NO_ERROR) | 
 | 2205 |         return 0; | 
 | 2206 |     return strncmp(ffbuf.achName, name, namelen) == 0; | 
| Andrew MacIntyre | d940054 | 2002-02-26 11:41:34 +0000 | [diff] [blame] | 2207 |  | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2208 | /* assuming it's a case-sensitive filesystem, so there's nothing to do! */ | 
 | 2209 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2210 |     return 1; | 
| Guido van Rossum | 0980bd9 | 1998-02-13 17:18:36 +0000 | [diff] [blame] | 2211 |  | 
| Guido van Rossum | 4d1b3b9 | 1998-02-13 23:27:59 +0000 | [diff] [blame] | 2212 | #endif | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 2213 | } | 
| Guido van Rossum | 4d1b3b9 | 1998-02-13 23:27:59 +0000 | [diff] [blame] | 2214 |  | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2215 | #ifdef HAVE_STAT | 
| Victor Stinner | 4f4402c | 2010-08-14 14:50:26 +0000 | [diff] [blame] | 2216 |  | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2217 | /* Helper to look for __init__.py or __init__.py[co] in potential package */ | 
 | 2218 | static int | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 2219 | find_init_module(char *buf) | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2220 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2221 |     const size_t save_len = strlen(buf); | 
 | 2222 |     size_t i = save_len; | 
 | 2223 |     char *pname;  /* pointer to start of __init__ */ | 
 | 2224 |     struct stat statbuf; | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2225 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2226 | /*      For calling case_ok(buf, len, namelen, name): | 
 | 2227 |  *      /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 | 
 | 2228 |  *      ^                      ^                   ^    ^ | 
 | 2229 |  *      |--------------------- buf ---------------------| | 
 | 2230 |  *      |------------------- len ------------------| | 
 | 2231 |  *                             |------ name -------| | 
 | 2232 |  *                             |----- namelen -----| | 
| Tim Peters | 0f9431f | 2001-07-05 03:47:53 +0000 | [diff] [blame] | 2233 |  */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2234 |     if (save_len + 13 >= MAXPATHLEN) | 
 | 2235 |         return 0; | 
 | 2236 |     buf[i++] = SEP; | 
 | 2237 |     pname = buf + i; | 
 | 2238 |     strcpy(pname, "__init__.py"); | 
 | 2239 |     if (stat(buf, &statbuf) == 0) { | 
 | 2240 |         if (case_ok(buf, | 
 | 2241 |                     save_len + 9,               /* len("/__init__") */ | 
 | 2242 |                 8,                              /* len("__init__") */ | 
 | 2243 |                 pname)) { | 
 | 2244 |             buf[save_len] = '\0'; | 
 | 2245 |             return 1; | 
 | 2246 |         } | 
 | 2247 |     } | 
 | 2248 |     i += strlen(pname); | 
 | 2249 |     strcpy(buf+i, Py_OptimizeFlag ? "o" : "c"); | 
 | 2250 |     if (stat(buf, &statbuf) == 0) { | 
 | 2251 |         if (case_ok(buf, | 
 | 2252 |                     save_len + 9,               /* len("/__init__") */ | 
 | 2253 |                 8,                              /* len("__init__") */ | 
 | 2254 |                 pname)) { | 
 | 2255 |             buf[save_len] = '\0'; | 
 | 2256 |             return 1; | 
 | 2257 |         } | 
 | 2258 |     } | 
 | 2259 |     buf[save_len] = '\0'; | 
 | 2260 |     return 0; | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2261 | } | 
| Guido van Rossum | 48a680c | 2001-03-02 06:34:14 +0000 | [diff] [blame] | 2262 |  | 
| Guido van Rossum | 197346f | 1997-10-31 18:38:52 +0000 | [diff] [blame] | 2263 | #endif /* HAVE_STAT */ | 
 | 2264 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2265 |  | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2266 | static int init_builtin(PyObject *); /* Forward */ | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 2267 |  | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2268 | static PyObject* | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2269 | load_builtin(PyObject *name, int type) | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2270 | { | 
 | 2271 |     PyObject *m, *modules; | 
 | 2272 |     int err; | 
 | 2273 |  | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2274 |     if (type == C_BUILTIN) | 
 | 2275 |         err = init_builtin(name); | 
 | 2276 |     else | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2277 |         err = PyImport_ImportFrozenModuleObject(name); | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2278 |     if (err < 0) | 
 | 2279 |         return NULL; | 
 | 2280 |     if (err == 0) { | 
 | 2281 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2282 |                 "Purported %s module %R not found", | 
 | 2283 |                 type == C_BUILTIN ? "builtin" : "frozen", | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2284 |                 name); | 
 | 2285 |         return NULL; | 
 | 2286 |     } | 
 | 2287 |  | 
 | 2288 |     modules = PyImport_GetModuleDict(); | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2289 |     m = PyDict_GetItem(modules, name); | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2290 |     if (m == NULL) { | 
 | 2291 |         PyErr_Format( | 
 | 2292 |                 PyExc_ImportError, | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2293 |                 "%s module %R not properly initialized", | 
 | 2294 |                 type == C_BUILTIN ? "builtin" : "frozen", | 
| Victor Stinner | 44c6c15 | 2010-08-09 00:59:10 +0000 | [diff] [blame] | 2295 |                 name); | 
 | 2296 |         return NULL; | 
 | 2297 |     } | 
 | 2298 |     Py_INCREF(m); | 
 | 2299 |     return m; | 
 | 2300 | } | 
 | 2301 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2302 | /* Load an external module using the default search path and return | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 2303 |    its module object WITH INCREMENTED REFERENCE COUNT */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2304 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 2305 | static PyObject * | 
| Alexandre Vassalotti | e223eb8 | 2009-07-29 20:12:15 +0000 | [diff] [blame] | 2306 | load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2307 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2308 |     PyObject *m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2309 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2310 |     /* First check that there's an open file (if we need one)  */ | 
 | 2311 |     switch (type) { | 
 | 2312 |     case PY_SOURCE: | 
 | 2313 |     case PY_COMPILED: | 
 | 2314 |         if (fp == NULL) { | 
 | 2315 |             PyErr_Format(PyExc_ValueError, | 
 | 2316 |                "file object required for import (type code %d)", | 
 | 2317 |                          type); | 
 | 2318 |             return NULL; | 
 | 2319 |         } | 
 | 2320 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2321 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2322 |     switch (type) { | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2323 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 2324 |     case PY_SOURCE: { | 
 | 2325 |         PyObject *nameobj, *pathobj; | 
 | 2326 |         nameobj = PyUnicode_FromString(name); | 
 | 2327 |         if (nameobj == NULL) | 
 | 2328 |             return NULL; | 
 | 2329 |         pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 2330 |         if (pathobj == NULL) { | 
 | 2331 |             Py_DECREF(nameobj); | 
 | 2332 |             return NULL; | 
 | 2333 |         } | 
 | 2334 |         m = load_source_module(nameobj, pathobj, fp); | 
 | 2335 |         Py_DECREF(nameobj); | 
 | 2336 |         Py_DECREF(pathobj); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2337 |         break; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 2338 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2339 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 2340 |     case PY_COMPILED: { | 
 | 2341 |         PyObject *nameobj, *pathobj; | 
 | 2342 |         nameobj = PyUnicode_FromString(name); | 
 | 2343 |         if (nameobj == NULL) | 
 | 2344 |             return NULL; | 
 | 2345 |         pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 2346 |         if (pathobj == NULL) { | 
 | 2347 |             Py_DECREF(nameobj); | 
 | 2348 |             return NULL; | 
 | 2349 |         } | 
 | 2350 |         m = load_compiled_module(nameobj, pathobj, fp); | 
 | 2351 |         Py_DECREF(nameobj); | 
 | 2352 |         Py_DECREF(pathobj); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2353 |         break; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 2354 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2355 |  | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 2356 | #ifdef HAVE_DYNAMIC_LOADING | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 2357 |     case C_EXTENSION: { | 
 | 2358 |         PyObject *nameobj, *pathobj; | 
 | 2359 |         nameobj = PyUnicode_FromString(name); | 
 | 2360 |         if (nameobj == NULL) | 
 | 2361 |             return NULL; | 
 | 2362 |         pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 2363 |         if (pathobj == NULL) { | 
 | 2364 |             Py_DECREF(nameobj); | 
 | 2365 |             return NULL; | 
 | 2366 |         } | 
 | 2367 |         m = _PyImport_LoadDynamicModule(nameobj, pathobj, fp); | 
 | 2368 |         Py_DECREF(nameobj); | 
 | 2369 |         Py_DECREF(pathobj); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2370 |         break; | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 2371 |     } | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 2372 | #endif | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2373 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 2374 |     case PKG_DIRECTORY: { | 
 | 2375 |         PyObject *nameobj, *pathobj; | 
 | 2376 |         nameobj = PyUnicode_FromString(name); | 
 | 2377 |         if (nameobj == NULL) | 
 | 2378 |             return NULL; | 
 | 2379 |         pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 2380 |         if (pathobj == NULL) { | 
 | 2381 |             Py_DECREF(nameobj); | 
 | 2382 |             return NULL; | 
 | 2383 |         } | 
 | 2384 |         m = load_package(nameobj, pathobj); | 
 | 2385 |         Py_DECREF(nameobj); | 
 | 2386 |         Py_DECREF(pathobj); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2387 |         break; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 2388 |     } | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 2389 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2390 |     case C_BUILTIN: | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2391 |     case PY_FROZEN: { | 
 | 2392 |         PyObject *nameobj = PyUnicode_FromString(name); | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 2393 |         if (nameobj == NULL) | 
 | 2394 |             return NULL; | 
 | 2395 |         m = load_builtin(nameobj, type); | 
 | 2396 |         Py_DECREF(nameobj); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2397 |         break; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2398 |     } | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 2399 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2400 |     case IMP_HOOK: { | 
 | 2401 |         if (loader == NULL) { | 
 | 2402 |             PyErr_SetString(PyExc_ImportError, | 
 | 2403 |                             "import hook without loader"); | 
 | 2404 |             return NULL; | 
 | 2405 |         } | 
 | 2406 |         m = PyObject_CallMethod(loader, "load_module", "s", name); | 
 | 2407 |         break; | 
 | 2408 |     } | 
| Just van Rossum | 52e14d6 | 2002-12-30 22:08:05 +0000 | [diff] [blame] | 2409 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2410 |     default: | 
 | 2411 |         PyErr_Format(PyExc_ImportError, | 
 | 2412 |                      "Don't know how to import %.200s (type code %d)", | 
 | 2413 |                       name, type); | 
 | 2414 |         m = NULL; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2415 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2416 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2417 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2418 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2419 | } | 
 | 2420 |  | 
 | 2421 |  | 
 | 2422 | /* Initialize a built-in module. | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 2423 |    Return 1 for success, 0 if the module is not found, and -1 with | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2424 |    an exception set if the initialization failed. */ | 
| Guido van Rossum | 7f133ed | 1991-02-19 12:23:57 +0000 | [diff] [blame] | 2425 |  | 
| Guido van Rossum | 7f133ed | 1991-02-19 12:23:57 +0000 | [diff] [blame] | 2426 | static int | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2427 | init_builtin(PyObject *name) | 
| Guido van Rossum | 7f133ed | 1991-02-19 12:23:57 +0000 | [diff] [blame] | 2428 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2429 |     struct _inittab *p; | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 2430 |  | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2431 |     if (_PyImport_FindExtensionObject(name, name) != NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2432 |         return 1; | 
| Guido van Rossum | 25ce566 | 1997-08-02 03:10:38 +0000 | [diff] [blame] | 2433 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2434 |     for (p = PyImport_Inittab; p->name != NULL; p++) { | 
 | 2435 |         PyObject *mod; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2436 |         if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2437 |             if (p->initfunc == NULL) { | 
 | 2438 |                 PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2439 |                     "Cannot re-init internal module %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2440 |                     name); | 
 | 2441 |                 return -1; | 
 | 2442 |             } | 
 | 2443 |             if (Py_VerboseFlag) | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2444 |                 PySys_FormatStderr("import %U # builtin\n", name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2445 |             mod = (*p->initfunc)(); | 
 | 2446 |             if (mod == 0) | 
 | 2447 |                 return -1; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 2448 |             if (_PyImport_FixupExtensionObject(mod, name, name) < 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2449 |                 return -1; | 
 | 2450 |             /* FixupExtension has put the module into sys.modules, | 
 | 2451 |                so we can release our own reference. */ | 
 | 2452 |             Py_DECREF(mod); | 
 | 2453 |             return 1; | 
 | 2454 |         } | 
 | 2455 |     } | 
 | 2456 |     return 0; | 
| Guido van Rossum | 7f133ed | 1991-02-19 12:23:57 +0000 | [diff] [blame] | 2457 | } | 
| Guido van Rossum | f56e3db | 1993-04-01 20:59:32 +0000 | [diff] [blame] | 2458 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2459 |  | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2460 | /* Frozen modules */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2461 |  | 
| Guido van Rossum | cfd0a22 | 1996-06-17 17:06:34 +0000 | [diff] [blame] | 2462 | static struct _frozen * | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2463 | find_frozen(PyObject *name) | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2464 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2465 |     struct _frozen *p; | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2466 |  | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2467 |     if (name == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2468 |         return NULL; | 
| Benjamin Peterson | d968e27 | 2008-11-05 22:48:33 +0000 | [diff] [blame] | 2469 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2470 |     for (p = PyImport_FrozenModules; ; p++) { | 
 | 2471 |         if (p->name == NULL) | 
 | 2472 |             return NULL; | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2473 |         if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2474 |             break; | 
 | 2475 |     } | 
 | 2476 |     return p; | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2477 | } | 
 | 2478 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 2479 | static PyObject * | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2480 | get_frozen_object(PyObject *name) | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2481 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2482 |     struct _frozen *p = find_frozen(name); | 
 | 2483 |     int size; | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2484 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2485 |     if (p == NULL) { | 
 | 2486 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2487 |                      "No such frozen object named %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2488 |                      name); | 
 | 2489 |         return NULL; | 
 | 2490 |     } | 
 | 2491 |     if (p->code == NULL) { | 
 | 2492 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2493 |                      "Excluded frozen object named %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2494 |                      name); | 
 | 2495 |         return NULL; | 
 | 2496 |     } | 
 | 2497 |     size = p->size; | 
 | 2498 |     if (size < 0) | 
 | 2499 |         size = -size; | 
 | 2500 |     return PyMarshal_ReadObjectFromString((char *)p->code, size); | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2501 | } | 
 | 2502 |  | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2503 | static PyObject * | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2504 | is_frozen_package(PyObject *name) | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2505 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2506 |     struct _frozen *p = find_frozen(name); | 
 | 2507 |     int size; | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2508 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2509 |     if (p == NULL) { | 
 | 2510 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2511 |                      "No such frozen object named %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2512 |                      name); | 
 | 2513 |         return NULL; | 
 | 2514 |     } | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2515 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2516 |     size = p->size; | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2517 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2518 |     if (size < 0) | 
 | 2519 |         Py_RETURN_TRUE; | 
 | 2520 |     else | 
 | 2521 |         Py_RETURN_FALSE; | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 2522 | } | 
 | 2523 |  | 
 | 2524 |  | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2525 | /* Initialize a frozen module. | 
| Brett Cannon | 3c2ac44 | 2009-03-08 20:49:47 +0000 | [diff] [blame] | 2526 |    Return 1 for success, 0 if the module is not found, and -1 with | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2527 |    an exception set if the initialization failed. | 
 | 2528 |    This function is also used from frozenmain.c */ | 
| Guido van Rossum | 0b34490 | 1995-02-07 15:35:27 +0000 | [diff] [blame] | 2529 |  | 
 | 2530 | int | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2531 | PyImport_ImportFrozenModuleObject(PyObject *name) | 
| Guido van Rossum | f56e3db | 1993-04-01 20:59:32 +0000 | [diff] [blame] | 2532 | { | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2533 |     struct _frozen *p; | 
 | 2534 |     PyObject *co, *m, *path; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2535 |     int ispackage; | 
 | 2536 |     int size; | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 2537 |  | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2538 |     p = find_frozen(name); | 
 | 2539 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2540 |     if (p == NULL) | 
 | 2541 |         return 0; | 
 | 2542 |     if (p->code == NULL) { | 
 | 2543 |         PyErr_Format(PyExc_ImportError, | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2544 |                      "Excluded frozen object named %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2545 |                      name); | 
 | 2546 |         return -1; | 
 | 2547 |     } | 
 | 2548 |     size = p->size; | 
 | 2549 |     ispackage = (size < 0); | 
 | 2550 |     if (ispackage) | 
 | 2551 |         size = -size; | 
 | 2552 |     if (Py_VerboseFlag) | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2553 |         PySys_FormatStderr("import %U # frozen%s\n", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2554 |             name, ispackage ? " package" : ""); | 
 | 2555 |     co = PyMarshal_ReadObjectFromString((char *)p->code, size); | 
 | 2556 |     if (co == NULL) | 
 | 2557 |         return -1; | 
 | 2558 |     if (!PyCode_Check(co)) { | 
 | 2559 |         PyErr_Format(PyExc_TypeError, | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2560 |                      "frozen object %R is not a code object", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2561 |                      name); | 
 | 2562 |         goto err_return; | 
 | 2563 |     } | 
 | 2564 |     if (ispackage) { | 
 | 2565 |         /* Set __path__ to the package name */ | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2566 |         PyObject *d, *l; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2567 |         int err; | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2568 |         m = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2569 |         if (m == NULL) | 
 | 2570 |             goto err_return; | 
 | 2571 |         d = PyModule_GetDict(m); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2572 |         l = PyList_New(1); | 
 | 2573 |         if (l == NULL) { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2574 |             goto err_return; | 
 | 2575 |         } | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2576 |         Py_INCREF(name); | 
 | 2577 |         PyList_SET_ITEM(l, 0, name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2578 |         err = PyDict_SetItemString(d, "__path__", l); | 
 | 2579 |         Py_DECREF(l); | 
 | 2580 |         if (err != 0) | 
 | 2581 |             goto err_return; | 
 | 2582 |     } | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2583 |     path = PyUnicode_FromString("<frozen>"); | 
 | 2584 |     if (path == NULL) | 
 | 2585 |         goto err_return; | 
 | 2586 |     m = PyImport_ExecCodeModuleObject(name, co, path, NULL); | 
 | 2587 |     Py_DECREF(path); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2588 |     if (m == NULL) | 
 | 2589 |         goto err_return; | 
 | 2590 |     Py_DECREF(co); | 
 | 2591 |     Py_DECREF(m); | 
 | 2592 |     return 1; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 2593 | err_return: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2594 |     Py_DECREF(co); | 
 | 2595 |     return -1; | 
| Guido van Rossum | f56e3db | 1993-04-01 20:59:32 +0000 | [diff] [blame] | 2596 | } | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 2597 |  | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 2598 | int | 
 | 2599 | PyImport_ImportFrozenModule(char *name) | 
 | 2600 | { | 
 | 2601 |     PyObject *nameobj; | 
 | 2602 |     int ret; | 
 | 2603 |     nameobj = PyUnicode_InternFromString(name); | 
 | 2604 |     if (nameobj == NULL) | 
 | 2605 |         return -1; | 
 | 2606 |     ret = PyImport_ImportFrozenModuleObject(nameobj); | 
 | 2607 |     Py_DECREF(nameobj); | 
 | 2608 |     return ret; | 
 | 2609 | } | 
 | 2610 |  | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 2611 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 2612 | /* Import a module, either built-in, frozen, or external, and return | 
| Guido van Rossum | 7f9fa97 | 1995-01-20 16:53:12 +0000 | [diff] [blame] | 2613 |    its module object WITH INCREMENTED REFERENCE COUNT */ | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 2614 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 2615 | PyObject * | 
| Jeremy Hylton | af68c87 | 2005-12-10 18:50:16 +0000 | [diff] [blame] | 2616 | PyImport_ImportModule(const char *name) | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 2617 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2618 |     PyObject *pname; | 
 | 2619 |     PyObject *result; | 
| Marc-André Lemburg | 3c61c35 | 2001-02-09 19:40:15 +0000 | [diff] [blame] | 2620 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2621 |     pname = PyUnicode_FromString(name); | 
 | 2622 |     if (pname == NULL) | 
 | 2623 |         return NULL; | 
 | 2624 |     result = PyImport_Import(pname); | 
 | 2625 |     Py_DECREF(pname); | 
 | 2626 |     return result; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 2627 | } | 
 | 2628 |  | 
| Christian Heimes | 072c0f1 | 2008-01-03 23:01:04 +0000 | [diff] [blame] | 2629 | /* Import a module without blocking | 
 | 2630 |  * | 
 | 2631 |  * At first it tries to fetch the module from sys.modules. If the module was | 
 | 2632 |  * never loaded before it loads it with PyImport_ImportModule() unless another | 
 | 2633 |  * thread holds the import lock. In the latter case the function raises an | 
 | 2634 |  * ImportError instead of blocking. | 
 | 2635 |  * | 
 | 2636 |  * Returns the module object with incremented ref count. | 
 | 2637 |  */ | 
 | 2638 | PyObject * | 
 | 2639 | PyImport_ImportModuleNoBlock(const char *name) | 
 | 2640 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2641 |     PyObject *result; | 
 | 2642 |     PyObject *modules; | 
 | 2643 |     long me; | 
| Christian Heimes | 072c0f1 | 2008-01-03 23:01:04 +0000 | [diff] [blame] | 2644 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2645 |     /* Try to get the module from sys.modules[name] */ | 
 | 2646 |     modules = PyImport_GetModuleDict(); | 
 | 2647 |     if (modules == NULL) | 
 | 2648 |         return NULL; | 
| Christian Heimes | 072c0f1 | 2008-01-03 23:01:04 +0000 | [diff] [blame] | 2649 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2650 |     result = PyDict_GetItemString(modules, name); | 
 | 2651 |     if (result != NULL) { | 
 | 2652 |         Py_INCREF(result); | 
 | 2653 |         return result; | 
 | 2654 |     } | 
 | 2655 |     else { | 
 | 2656 |         PyErr_Clear(); | 
 | 2657 |     } | 
| Benjamin Peterson | 3e4f055 | 2008-09-02 00:31:15 +0000 | [diff] [blame] | 2658 | #ifdef WITH_THREAD | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2659 |     /* check the import lock | 
 | 2660 |      * me might be -1 but I ignore the error here, the lock function | 
 | 2661 |      * takes care of the problem */ | 
 | 2662 |     me = PyThread_get_thread_ident(); | 
 | 2663 |     if (import_lock_thread == -1 || import_lock_thread == me) { | 
 | 2664 |         /* no thread or me is holding the lock */ | 
 | 2665 |         return PyImport_ImportModule(name); | 
 | 2666 |     } | 
 | 2667 |     else { | 
 | 2668 |         PyErr_Format(PyExc_ImportError, | 
 | 2669 |                      "Failed to import %.200s because the import lock" | 
 | 2670 |                      "is held by another thread.", | 
 | 2671 |                      name); | 
 | 2672 |         return NULL; | 
 | 2673 |     } | 
| Benjamin Peterson | 3e4f055 | 2008-09-02 00:31:15 +0000 | [diff] [blame] | 2674 | #else | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2675 |     return PyImport_ImportModule(name); | 
| Benjamin Peterson | 3e4f055 | 2008-09-02 00:31:15 +0000 | [diff] [blame] | 2676 | #endif | 
| Christian Heimes | 072c0f1 | 2008-01-03 23:01:04 +0000 | [diff] [blame] | 2677 | } | 
 | 2678 |  | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2679 | /* Forward declarations for helper routines */ | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2680 | static PyObject *get_parent(PyObject *globals, char *buf, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2681 |                             Py_ssize_t *p_buflen, int level); | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 2682 | static PyObject *load_next(PyObject *mod, PyObject *altmod, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2683 |                            char **p_name, char *buf, Py_ssize_t *p_buflen); | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 2684 | static int mark_miss(char *name); | 
 | 2685 | static int ensure_fromlist(PyObject *mod, PyObject *fromlist, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2686 |                            char *buf, Py_ssize_t buflen, int recursive); | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 2687 | static PyObject * import_submodule(PyObject *mod, char *name, char *fullname); | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2688 |  | 
 | 2689 | /* The Magnum Opus of dotted-name import :-) */ | 
 | 2690 |  | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 2691 | static PyObject * | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2692 | import_module_level(char *name, PyObject *globals, PyObject *locals, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2693 |                     PyObject *fromlist, int level) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 2694 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2695 |     char buf[MAXPATHLEN+1]; | 
 | 2696 |     Py_ssize_t buflen = 0; | 
 | 2697 |     PyObject *parent, *head, *next, *tail; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2698 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2699 |     if (strchr(name, '/') != NULL | 
| Christian Heimes | 454f37b | 2008-01-10 00:10:02 +0000 | [diff] [blame] | 2700 | #ifdef MS_WINDOWS | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2701 |         || strchr(name, '\\') != NULL | 
| Christian Heimes | 454f37b | 2008-01-10 00:10:02 +0000 | [diff] [blame] | 2702 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2703 |         ) { | 
 | 2704 |         PyErr_SetString(PyExc_ImportError, | 
 | 2705 |                         "Import by filename is not supported."); | 
 | 2706 |         return NULL; | 
 | 2707 |     } | 
| Christian Heimes | 454f37b | 2008-01-10 00:10:02 +0000 | [diff] [blame] | 2708 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2709 |     parent = get_parent(globals, buf, &buflen, level); | 
 | 2710 |     if (parent == NULL) | 
 | 2711 |         return NULL; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2712 |  | 
| Benjamin Peterson | 556d800 | 2010-06-27 22:37:28 +0000 | [diff] [blame] | 2713 |     head = load_next(parent, level < 0 ? Py_None : parent, &name, buf, | 
 | 2714 |                         &buflen); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2715 |     if (head == NULL) | 
 | 2716 |         return NULL; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2717 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2718 |     tail = head; | 
 | 2719 |     Py_INCREF(tail); | 
 | 2720 |     while (name) { | 
 | 2721 |         next = load_next(tail, tail, &name, buf, &buflen); | 
 | 2722 |         Py_DECREF(tail); | 
 | 2723 |         if (next == NULL) { | 
 | 2724 |             Py_DECREF(head); | 
 | 2725 |             return NULL; | 
 | 2726 |         } | 
 | 2727 |         tail = next; | 
 | 2728 |     } | 
 | 2729 |     if (tail == Py_None) { | 
 | 2730 |         /* If tail is Py_None, both get_parent and load_next found | 
 | 2731 |            an empty module name: someone called __import__("") or | 
 | 2732 |            doctored faulty bytecode */ | 
 | 2733 |         Py_DECREF(tail); | 
 | 2734 |         Py_DECREF(head); | 
 | 2735 |         PyErr_SetString(PyExc_ValueError, | 
 | 2736 |                         "Empty module name"); | 
 | 2737 |         return NULL; | 
 | 2738 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2739 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2740 |     if (fromlist != NULL) { | 
 | 2741 |         if (fromlist == Py_None || !PyObject_IsTrue(fromlist)) | 
 | 2742 |             fromlist = NULL; | 
 | 2743 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2744 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2745 |     if (fromlist == NULL) { | 
 | 2746 |         Py_DECREF(tail); | 
 | 2747 |         return head; | 
 | 2748 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2749 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2750 |     Py_DECREF(head); | 
 | 2751 |     if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) { | 
 | 2752 |         Py_DECREF(tail); | 
 | 2753 |         return NULL; | 
 | 2754 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2755 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2756 |     return tail; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2757 | } | 
 | 2758 |  | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2759 | PyObject * | 
 | 2760 | PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2761 |                          PyObject *fromlist, int level) | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2762 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2763 |     PyObject *result; | 
 | 2764 |     _PyImport_AcquireLock(); | 
 | 2765 |     result = import_module_level(name, globals, locals, fromlist, level); | 
 | 2766 |     if (_PyImport_ReleaseLock() < 0) { | 
 | 2767 |         Py_XDECREF(result); | 
 | 2768 |         PyErr_SetString(PyExc_RuntimeError, | 
 | 2769 |                         "not holding the import lock"); | 
 | 2770 |         return NULL; | 
 | 2771 |     } | 
 | 2772 |     return result; | 
| Guido van Rossum | 75acc9c | 1998-03-03 22:26:50 +0000 | [diff] [blame] | 2773 | } | 
 | 2774 |  | 
| Fred Drake | 8759090 | 2004-05-28 20:21:36 +0000 | [diff] [blame] | 2775 | /* Return the package that an import is being performed in.  If globals comes | 
 | 2776 |    from the module foo.bar.bat (not itself a package), this returns the | 
 | 2777 |    sys.modules entry for foo.bar.  If globals is from a package's __init__.py, | 
| Thomas Wouters | 4d70c3d | 2006-06-08 14:42:34 +0000 | [diff] [blame] | 2778 |    the package's entry in sys.modules is returned, as a borrowed reference. | 
| Fred Drake | 8759090 | 2004-05-28 20:21:36 +0000 | [diff] [blame] | 2779 |  | 
 | 2780 |    The *name* of the returned package is returned in buf, with the length of | 
 | 2781 |    the name in *p_buflen. | 
 | 2782 |  | 
 | 2783 |    If globals doesn't come from a package or a module in a package, or a | 
 | 2784 |    corresponding entry is not found in sys.modules, Py_None is returned. | 
 | 2785 | */ | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2786 | static PyObject * | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2787 | get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level) | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2788 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2789 |     static PyObject *namestr = NULL; | 
 | 2790 |     static PyObject *pathstr = NULL; | 
 | 2791 |     static PyObject *pkgstr = NULL; | 
 | 2792 |     PyObject *pkgname, *modname, *modpath, *modules, *parent; | 
 | 2793 |     int orig_level = level; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2794 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2795 |     if (globals == NULL || !PyDict_Check(globals) || !level) | 
 | 2796 |         return Py_None; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2797 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2798 |     if (namestr == NULL) { | 
 | 2799 |         namestr = PyUnicode_InternFromString("__name__"); | 
 | 2800 |         if (namestr == NULL) | 
 | 2801 |             return NULL; | 
 | 2802 |     } | 
 | 2803 |     if (pathstr == NULL) { | 
 | 2804 |         pathstr = PyUnicode_InternFromString("__path__"); | 
 | 2805 |         if (pathstr == NULL) | 
 | 2806 |             return NULL; | 
 | 2807 |     } | 
 | 2808 |     if (pkgstr == NULL) { | 
 | 2809 |         pkgstr = PyUnicode_InternFromString("__package__"); | 
 | 2810 |         if (pkgstr == NULL) | 
 | 2811 |             return NULL; | 
 | 2812 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2813 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2814 |     *buf = '\0'; | 
 | 2815 |     *p_buflen = 0; | 
 | 2816 |     pkgname = PyDict_GetItem(globals, pkgstr); | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2817 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2818 |     if ((pkgname != NULL) && (pkgname != Py_None)) { | 
 | 2819 |         /* __package__ is set, so use it */ | 
 | 2820 |         char *pkgname_str; | 
 | 2821 |         Py_ssize_t len; | 
| Alexandre Vassalotti | a85998a | 2008-05-03 18:24:43 +0000 | [diff] [blame] | 2822 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2823 |         if (!PyUnicode_Check(pkgname)) { | 
 | 2824 |             PyErr_SetString(PyExc_ValueError, | 
 | 2825 |                             "__package__ set to non-string"); | 
 | 2826 |             return NULL; | 
 | 2827 |         } | 
 | 2828 |         pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len); | 
 | 2829 |         if (len == 0) { | 
 | 2830 |             if (level > 0) { | 
 | 2831 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2832 |                     "Attempted relative import in non-package"); | 
 | 2833 |                 return NULL; | 
 | 2834 |             } | 
 | 2835 |             return Py_None; | 
 | 2836 |         } | 
 | 2837 |         if (len > MAXPATHLEN) { | 
 | 2838 |             PyErr_SetString(PyExc_ValueError, | 
 | 2839 |                             "Package name too long"); | 
 | 2840 |             return NULL; | 
 | 2841 |         } | 
 | 2842 |         strcpy(buf, pkgname_str); | 
 | 2843 |     } else { | 
 | 2844 |         /* __package__ not set, so figure it out and set it */ | 
 | 2845 |         modname = PyDict_GetItem(globals, namestr); | 
 | 2846 |         if (modname == NULL || !PyUnicode_Check(modname)) | 
 | 2847 |             return Py_None; | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 2848 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2849 |         modpath = PyDict_GetItem(globals, pathstr); | 
 | 2850 |         if (modpath != NULL) { | 
 | 2851 |             /* __path__ is set, so modname is already the package name */ | 
 | 2852 |             char *modname_str; | 
 | 2853 |             Py_ssize_t len; | 
 | 2854 |             int error; | 
| Alexandre Vassalotti | a85998a | 2008-05-03 18:24:43 +0000 | [diff] [blame] | 2855 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2856 |             modname_str = _PyUnicode_AsStringAndSize(modname, &len); | 
 | 2857 |             if (len > MAXPATHLEN) { | 
 | 2858 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2859 |                                 "Module name too long"); | 
 | 2860 |                 return NULL; | 
 | 2861 |             } | 
 | 2862 |             strcpy(buf, modname_str); | 
 | 2863 |             error = PyDict_SetItem(globals, pkgstr, modname); | 
 | 2864 |             if (error) { | 
 | 2865 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2866 |                                 "Could not set __package__"); | 
 | 2867 |                 return NULL; | 
 | 2868 |             } | 
 | 2869 |         } else { | 
 | 2870 |             /* Normal module, so work out the package name if any */ | 
 | 2871 |             char *start = _PyUnicode_AsString(modname); | 
 | 2872 |             char *lastdot = strrchr(start, '.'); | 
 | 2873 |             size_t len; | 
 | 2874 |             int error; | 
 | 2875 |             if (lastdot == NULL && level > 0) { | 
 | 2876 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2877 |                     "Attempted relative import in non-package"); | 
 | 2878 |                 return NULL; | 
 | 2879 |             } | 
 | 2880 |             if (lastdot == NULL) { | 
 | 2881 |                 error = PyDict_SetItem(globals, pkgstr, Py_None); | 
 | 2882 |                 if (error) { | 
 | 2883 |                     PyErr_SetString(PyExc_ValueError, | 
 | 2884 |                         "Could not set __package__"); | 
 | 2885 |                     return NULL; | 
 | 2886 |                 } | 
 | 2887 |                 return Py_None; | 
 | 2888 |             } | 
 | 2889 |             len = lastdot - start; | 
 | 2890 |             if (len >= MAXPATHLEN) { | 
 | 2891 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2892 |                                 "Module name too long"); | 
 | 2893 |                 return NULL; | 
 | 2894 |             } | 
 | 2895 |             strncpy(buf, start, len); | 
 | 2896 |             buf[len] = '\0'; | 
 | 2897 |             pkgname = PyUnicode_FromString(buf); | 
 | 2898 |             if (pkgname == NULL) { | 
 | 2899 |                 return NULL; | 
 | 2900 |             } | 
 | 2901 |             error = PyDict_SetItem(globals, pkgstr, pkgname); | 
 | 2902 |             Py_DECREF(pkgname); | 
 | 2903 |             if (error) { | 
 | 2904 |                 PyErr_SetString(PyExc_ValueError, | 
 | 2905 |                                 "Could not set __package__"); | 
 | 2906 |                 return NULL; | 
 | 2907 |             } | 
 | 2908 |         } | 
 | 2909 |     } | 
 | 2910 |     while (--level > 0) { | 
 | 2911 |         char *dot = strrchr(buf, '.'); | 
 | 2912 |         if (dot == NULL) { | 
 | 2913 |             PyErr_SetString(PyExc_ValueError, | 
 | 2914 |                 "Attempted relative import beyond " | 
 | 2915 |                 "toplevel package"); | 
 | 2916 |             return NULL; | 
 | 2917 |         } | 
 | 2918 |         *dot = '\0'; | 
 | 2919 |     } | 
 | 2920 |     *p_buflen = strlen(buf); | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2921 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2922 |     modules = PyImport_GetModuleDict(); | 
 | 2923 |     parent = PyDict_GetItemString(modules, buf); | 
 | 2924 |     if (parent == NULL) { | 
 | 2925 |         if (orig_level < 1) { | 
 | 2926 |             PyObject *err_msg = PyBytes_FromFormat( | 
 | 2927 |                 "Parent module '%.200s' not found " | 
 | 2928 |                 "while handling absolute import", buf); | 
 | 2929 |             if (err_msg == NULL) { | 
 | 2930 |                 return NULL; | 
 | 2931 |             } | 
 | 2932 |             if (!PyErr_WarnEx(PyExc_RuntimeWarning, | 
 | 2933 |                               PyBytes_AsString(err_msg), 1)) { | 
 | 2934 |                 *buf = '\0'; | 
 | 2935 |                 *p_buflen = 0; | 
 | 2936 |                 parent = Py_None; | 
 | 2937 |             } | 
 | 2938 |             Py_DECREF(err_msg); | 
 | 2939 |         } else { | 
 | 2940 |             PyErr_Format(PyExc_SystemError, | 
 | 2941 |                 "Parent module '%.200s' not loaded, " | 
 | 2942 |                 "cannot perform relative import", buf); | 
 | 2943 |         } | 
 | 2944 |     } | 
 | 2945 |     return parent; | 
 | 2946 |     /* We expect, but can't guarantee, if parent != None, that: | 
 | 2947 |        - parent.__name__ == buf | 
 | 2948 |        - parent.__dict__ is globals | 
 | 2949 |        If this is violated...  Who cares? */ | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2950 | } | 
 | 2951 |  | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 2952 | /* altmod is either None or same as mod */ | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2953 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 2954 | load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2955 |           Py_ssize_t *p_buflen) | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2956 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2957 |     char *name = *p_name; | 
 | 2958 |     char *dot = strchr(name, '.'); | 
 | 2959 |     size_t len; | 
 | 2960 |     char *p; | 
 | 2961 |     PyObject *result; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2962 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2963 |     if (strlen(name) == 0) { | 
 | 2964 |         /* completely empty module name should only happen in | 
 | 2965 |            'from . import' (or '__import__("")')*/ | 
 | 2966 |         Py_INCREF(mod); | 
 | 2967 |         *p_name = NULL; | 
 | 2968 |         return mod; | 
 | 2969 |     } | 
| Thomas Wouters | f7f438b | 2006-02-28 16:09:29 +0000 | [diff] [blame] | 2970 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2971 |     if (dot == NULL) { | 
 | 2972 |         *p_name = NULL; | 
 | 2973 |         len = strlen(name); | 
 | 2974 |     } | 
 | 2975 |     else { | 
 | 2976 |         *p_name = dot+1; | 
 | 2977 |         len = dot-name; | 
 | 2978 |     } | 
 | 2979 |     if (len == 0) { | 
 | 2980 |         PyErr_SetString(PyExc_ValueError, | 
 | 2981 |                         "Empty module name"); | 
 | 2982 |         return NULL; | 
 | 2983 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2984 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2985 |     p = buf + *p_buflen; | 
 | 2986 |     if (p != buf) | 
 | 2987 |         *p++ = '.'; | 
 | 2988 |     if (p+len-buf >= MAXPATHLEN) { | 
 | 2989 |         PyErr_SetString(PyExc_ValueError, | 
 | 2990 |                         "Module name too long"); | 
 | 2991 |         return NULL; | 
 | 2992 |     } | 
 | 2993 |     strncpy(p, name, len); | 
 | 2994 |     p[len] = '\0'; | 
 | 2995 |     *p_buflen = p+len-buf; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 2996 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 2997 |     result = import_submodule(mod, p, buf); | 
 | 2998 |     if (result == Py_None && altmod != mod) { | 
 | 2999 |         Py_DECREF(result); | 
 | 3000 |         /* Here, altmod must be None and mod must not be None */ | 
 | 3001 |         result = import_submodule(altmod, p, p); | 
 | 3002 |         if (result != NULL && result != Py_None) { | 
 | 3003 |             if (mark_miss(buf) != 0) { | 
 | 3004 |                 Py_DECREF(result); | 
 | 3005 |                 return NULL; | 
 | 3006 |             } | 
 | 3007 |             strncpy(buf, name, len); | 
 | 3008 |             buf[len] = '\0'; | 
 | 3009 |             *p_buflen = len; | 
 | 3010 |         } | 
 | 3011 |     } | 
 | 3012 |     if (result == NULL) | 
 | 3013 |         return NULL; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3014 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3015 |     if (result == Py_None) { | 
 | 3016 |         Py_DECREF(result); | 
 | 3017 |         PyErr_Format(PyExc_ImportError, | 
 | 3018 |                      "No module named %.200s", name); | 
 | 3019 |         return NULL; | 
 | 3020 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3021 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3022 |     return result; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3023 | } | 
 | 3024 |  | 
 | 3025 | static int | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3026 | mark_miss(char *name) | 
| Guido van Rossum | f5f5fdb | 1997-09-06 20:29:52 +0000 | [diff] [blame] | 3027 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3028 |     PyObject *modules = PyImport_GetModuleDict(); | 
 | 3029 |     return PyDict_SetItemString(modules, name, Py_None); | 
| Guido van Rossum | f5f5fdb | 1997-09-06 20:29:52 +0000 | [diff] [blame] | 3030 | } | 
 | 3031 |  | 
 | 3032 | static int | 
| Martin v. Löwis | 18e1655 | 2006-02-15 17:27:45 +0000 | [diff] [blame] | 3033 | ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3034 |                 int recursive) | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3035 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3036 |     int i; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3037 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3038 |     if (!PyObject_HasAttrString(mod, "__path__")) | 
 | 3039 |         return 1; | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3040 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3041 |     for (i = 0; ; i++) { | 
 | 3042 |         PyObject *item = PySequence_GetItem(fromlist, i); | 
 | 3043 |         int hasit; | 
 | 3044 |         if (item == NULL) { | 
 | 3045 |             if (PyErr_ExceptionMatches(PyExc_IndexError)) { | 
 | 3046 |                 PyErr_Clear(); | 
 | 3047 |                 return 1; | 
 | 3048 |             } | 
 | 3049 |             return 0; | 
 | 3050 |         } | 
 | 3051 |         if (!PyUnicode_Check(item)) { | 
 | 3052 |             PyErr_SetString(PyExc_TypeError, | 
 | 3053 |                             "Item in ``from list'' not a string"); | 
 | 3054 |             Py_DECREF(item); | 
 | 3055 |             return 0; | 
 | 3056 |         } | 
 | 3057 |         if (PyUnicode_AS_UNICODE(item)[0] == '*') { | 
 | 3058 |             PyObject *all; | 
 | 3059 |             Py_DECREF(item); | 
 | 3060 |             /* See if the package defines __all__ */ | 
 | 3061 |             if (recursive) | 
 | 3062 |                 continue; /* Avoid endless recursion */ | 
 | 3063 |             all = PyObject_GetAttrString(mod, "__all__"); | 
 | 3064 |             if (all == NULL) | 
 | 3065 |                 PyErr_Clear(); | 
 | 3066 |             else { | 
 | 3067 |                 int ret = ensure_fromlist(mod, all, buf, buflen, 1); | 
 | 3068 |                 Py_DECREF(all); | 
 | 3069 |                 if (!ret) | 
 | 3070 |                     return 0; | 
 | 3071 |             } | 
 | 3072 |             continue; | 
 | 3073 |         } | 
 | 3074 |         hasit = PyObject_HasAttr(mod, item); | 
 | 3075 |         if (!hasit) { | 
 | 3076 |             PyObject *item8; | 
 | 3077 |             char *subname; | 
 | 3078 |             PyObject *submod; | 
 | 3079 |             char *p; | 
| Victor Stinner | ae6265f | 2010-05-15 16:27:27 +0000 | [diff] [blame] | 3080 |             item8 = PyUnicode_EncodeFSDefault(item); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3081 |             if (!item8) { | 
 | 3082 |                 PyErr_SetString(PyExc_ValueError, "Cannot encode path item"); | 
 | 3083 |                 return 0; | 
 | 3084 |             } | 
 | 3085 |             subname = PyBytes_AS_STRING(item8); | 
 | 3086 |             if (buflen + strlen(subname) >= MAXPATHLEN) { | 
 | 3087 |                 PyErr_SetString(PyExc_ValueError, | 
 | 3088 |                                 "Module name too long"); | 
 | 3089 |                 Py_DECREF(item); | 
 | 3090 |                 return 0; | 
 | 3091 |             } | 
 | 3092 |             p = buf + buflen; | 
 | 3093 |             *p++ = '.'; | 
 | 3094 |             strcpy(p, subname); | 
 | 3095 |             submod = import_submodule(mod, subname, buf); | 
 | 3096 |             Py_DECREF(item8); | 
 | 3097 |             Py_XDECREF(submod); | 
 | 3098 |             if (submod == NULL) { | 
 | 3099 |                 Py_DECREF(item); | 
 | 3100 |                 return 0; | 
 | 3101 |             } | 
 | 3102 |         } | 
 | 3103 |         Py_DECREF(item); | 
 | 3104 |     } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3105 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3106 |     /* NOTREACHED */ | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3107 | } | 
 | 3108 |  | 
| Neil Schemenauer | 00b0966 | 2003-06-16 21:03:07 +0000 | [diff] [blame] | 3109 | static int | 
 | 3110 | add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3111 |               PyObject *modules) | 
| Neil Schemenauer | 00b0966 | 2003-06-16 21:03:07 +0000 | [diff] [blame] | 3112 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3113 |     if (mod == Py_None) | 
 | 3114 |         return 1; | 
 | 3115 |     /* Irrespective of the success of this load, make a | 
 | 3116 |        reference to it in the parent package module.  A copy gets | 
 | 3117 |        saved in the modules dictionary under the full name, so get a | 
 | 3118 |        reference from there, if need be.  (The exception is when the | 
 | 3119 |        load failed with a SyntaxError -- then there's no trace in | 
 | 3120 |        sys.modules.  In that case, of course, do nothing extra.) */ | 
 | 3121 |     if (submod == NULL) { | 
 | 3122 |         submod = PyDict_GetItemString(modules, fullname); | 
 | 3123 |         if (submod == NULL) | 
 | 3124 |             return 1; | 
 | 3125 |     } | 
 | 3126 |     if (PyModule_Check(mod)) { | 
 | 3127 |         /* We can't use setattr here since it can give a | 
 | 3128 |          * spurious warning if the submodule name shadows a | 
 | 3129 |          * builtin name */ | 
 | 3130 |         PyObject *dict = PyModule_GetDict(mod); | 
 | 3131 |         if (!dict) | 
 | 3132 |             return 0; | 
 | 3133 |         if (PyDict_SetItemString(dict, subname, submod) < 0) | 
 | 3134 |             return 0; | 
 | 3135 |     } | 
 | 3136 |     else { | 
 | 3137 |         if (PyObject_SetAttrString(mod, subname, submod) < 0) | 
 | 3138 |             return 0; | 
 | 3139 |     } | 
 | 3140 |     return 1; | 
| Neil Schemenauer | 00b0966 | 2003-06-16 21:03:07 +0000 | [diff] [blame] | 3141 | } | 
 | 3142 |  | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3143 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3144 | import_submodule(PyObject *mod, char *subname, char *fullname) | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3145 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3146 |     PyObject *modules = PyImport_GetModuleDict(); | 
 | 3147 |     PyObject *m = NULL; | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 3148 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3149 |     /* Require: | 
 | 3150 |        if mod == None: subname == fullname | 
 | 3151 |        else: mod.__name__ + "." + subname == fullname | 
 | 3152 |     */ | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3153 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3154 |     if ((m = PyDict_GetItemString(modules, fullname)) != NULL) { | 
 | 3155 |         Py_INCREF(m); | 
 | 3156 |     } | 
 | 3157 |     else { | 
| Victor Stinner | 7d8b77c | 2011-03-12 08:45:02 -0500 | [diff] [blame] | 3158 |         PyObject *path, *loader; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3159 |         char buf[MAXPATHLEN+1]; | 
 | 3160 |         struct filedescr *fdp; | 
| Victor Stinner | 7d8b77c | 2011-03-12 08:45:02 -0500 | [diff] [blame] | 3161 |         FILE *fp; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3162 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3163 |         if (mod == Py_None) | 
 | 3164 |             path = NULL; | 
 | 3165 |         else { | 
 | 3166 |             path = PyObject_GetAttrString(mod, "__path__"); | 
 | 3167 |             if (path == NULL) { | 
 | 3168 |                 PyErr_Clear(); | 
 | 3169 |                 Py_INCREF(Py_None); | 
 | 3170 |                 return Py_None; | 
 | 3171 |             } | 
 | 3172 |         } | 
| Guido van Rossum | 17fc85f | 1997-09-06 18:52:03 +0000 | [diff] [blame] | 3173 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3174 |         fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1, | 
 | 3175 |                           &fp, &loader); | 
 | 3176 |         Py_XDECREF(path); | 
 | 3177 |         if (fdp == NULL) { | 
 | 3178 |             if (!PyErr_ExceptionMatches(PyExc_ImportError)) | 
 | 3179 |                 return NULL; | 
 | 3180 |             PyErr_Clear(); | 
 | 3181 |             Py_INCREF(Py_None); | 
 | 3182 |             return Py_None; | 
 | 3183 |         } | 
 | 3184 |         m = load_module(fullname, fp, buf, fdp->type, loader); | 
 | 3185 |         Py_XDECREF(loader); | 
 | 3186 |         if (fp) | 
 | 3187 |             fclose(fp); | 
 | 3188 |         if (!add_submodule(mod, m, fullname, subname, modules)) { | 
 | 3189 |             Py_XDECREF(m); | 
 | 3190 |             m = NULL; | 
 | 3191 |         } | 
 | 3192 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3193 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3194 |     return m; | 
| Guido van Rossum | 74e6a11 | 1994-08-29 12:54:38 +0000 | [diff] [blame] | 3195 | } | 
 | 3196 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3197 |  | 
 | 3198 | /* Re-import a module of any kind and return its module object, WITH | 
 | 3199 |    INCREMENTED REFERENCE COUNT */ | 
 | 3200 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3201 | PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3202 | PyImport_ReloadModule(PyObject *m) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3203 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3204 |     PyInterpreterState *interp = PyThreadState_Get()->interp; | 
 | 3205 |     PyObject *modules_reloading = interp->modules_reloading; | 
 | 3206 |     PyObject *modules = PyImport_GetModuleDict(); | 
| Victor Stinner | 7d8b77c | 2011-03-12 08:45:02 -0500 | [diff] [blame] | 3207 |     PyObject *path = NULL, *loader, *existing_m = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3208 |     char *name, *subname; | 
 | 3209 |     char buf[MAXPATHLEN+1]; | 
 | 3210 |     struct filedescr *fdp; | 
| Victor Stinner | 7d8b77c | 2011-03-12 08:45:02 -0500 | [diff] [blame] | 3211 |     FILE *fp; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3212 |     PyObject *newm; | 
| Brett Cannon | 9a5b25a | 2010-03-01 02:09:17 +0000 | [diff] [blame] | 3213 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3214 |     if (modules_reloading == NULL) { | 
 | 3215 |         Py_FatalError("PyImport_ReloadModule: " | 
 | 3216 |                       "no modules_reloading dictionary!"); | 
 | 3217 |         return NULL; | 
 | 3218 |     } | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3219 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3220 |     if (m == NULL || !PyModule_Check(m)) { | 
 | 3221 |         PyErr_SetString(PyExc_TypeError, | 
 | 3222 |                         "reload() argument must be module"); | 
 | 3223 |         return NULL; | 
 | 3224 |     } | 
 | 3225 |     name = (char*)PyModule_GetName(m); | 
 | 3226 |     if (name == NULL) | 
 | 3227 |         return NULL; | 
 | 3228 |     if (m != PyDict_GetItemString(modules, name)) { | 
 | 3229 |         PyErr_Format(PyExc_ImportError, | 
 | 3230 |                      "reload(): module %.200s not in sys.modules", | 
 | 3231 |                      name); | 
 | 3232 |         return NULL; | 
 | 3233 |     } | 
 | 3234 |     existing_m = PyDict_GetItemString(modules_reloading, name); | 
 | 3235 |     if (existing_m != NULL) { | 
 | 3236 |         /* Due to a recursive reload, this module is already | 
 | 3237 |            being reloaded. */ | 
 | 3238 |         Py_INCREF(existing_m); | 
 | 3239 |         return existing_m; | 
 | 3240 |     } | 
 | 3241 |     if (PyDict_SetItemString(modules_reloading, name, m) < 0) | 
 | 3242 |         return NULL; | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 3243 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3244 |     subname = strrchr(name, '.'); | 
 | 3245 |     if (subname == NULL) | 
 | 3246 |         subname = name; | 
 | 3247 |     else { | 
 | 3248 |         PyObject *parentname, *parent; | 
 | 3249 |         parentname = PyUnicode_FromStringAndSize(name, (subname-name)); | 
 | 3250 |         if (parentname == NULL) { | 
 | 3251 |             imp_modules_reloading_clear(); | 
 | 3252 |             return NULL; | 
 | 3253 |         } | 
 | 3254 |         parent = PyDict_GetItem(modules, parentname); | 
 | 3255 |         if (parent == NULL) { | 
 | 3256 |             PyErr_Format(PyExc_ImportError, | 
 | 3257 |                 "reload(): parent %U not in sys.modules", | 
 | 3258 |                  parentname); | 
 | 3259 |             Py_DECREF(parentname); | 
 | 3260 |             imp_modules_reloading_clear(); | 
 | 3261 |             return NULL; | 
 | 3262 |         } | 
 | 3263 |         Py_DECREF(parentname); | 
 | 3264 |         subname++; | 
 | 3265 |         path = PyObject_GetAttrString(parent, "__path__"); | 
 | 3266 |         if (path == NULL) | 
 | 3267 |             PyErr_Clear(); | 
 | 3268 |     } | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3269 |     fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader); | 
 | 3270 |     Py_XDECREF(path); | 
| Phillip J. Eby | 7ec642a | 2004-09-23 04:37:36 +0000 | [diff] [blame] | 3271 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3272 |     if (fdp == NULL) { | 
 | 3273 |         Py_XDECREF(loader); | 
 | 3274 |         imp_modules_reloading_clear(); | 
 | 3275 |         return NULL; | 
 | 3276 |     } | 
| Phillip J. Eby | 7ec642a | 2004-09-23 04:37:36 +0000 | [diff] [blame] | 3277 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3278 |     newm = load_module(name, fp, buf, fdp->type, loader); | 
 | 3279 |     Py_XDECREF(loader); | 
| Phillip J. Eby | 7ec642a | 2004-09-23 04:37:36 +0000 | [diff] [blame] | 3280 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3281 |     if (fp) | 
 | 3282 |         fclose(fp); | 
 | 3283 |     if (newm == NULL) { | 
 | 3284 |         /* load_module probably removed name from modules because of | 
 | 3285 |          * the error.  Put back the original module object.  We're | 
 | 3286 |          * going to return NULL in this case regardless of whether | 
 | 3287 |          * replacing name succeeds, so the return value is ignored. | 
 | 3288 |          */ | 
 | 3289 |         PyDict_SetItemString(modules, name, m); | 
 | 3290 |     } | 
 | 3291 |     imp_modules_reloading_clear(); | 
 | 3292 |     return newm; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3293 | } | 
 | 3294 |  | 
 | 3295 |  | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3296 | /* Higher-level import emulator which emulates the "import" statement | 
 | 3297 |    more accurately -- it invokes the __import__() function from the | 
 | 3298 |    builtins of the current globals.  This means that the import is | 
 | 3299 |    done using whatever import hooks are installed in the current | 
| Brett Cannon | bc2eff3 | 2010-09-19 21:39:02 +0000 | [diff] [blame] | 3300 |    environment. | 
| Guido van Rossum | 6058eb4 | 1998-12-21 19:51:00 +0000 | [diff] [blame] | 3301 |    A dummy list ["__doc__"] is passed as the 4th argument so that | 
| Neal Norwitz | 80e7f27 | 2007-08-26 06:45:23 +0000 | [diff] [blame] | 3302 |    e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache")) | 
| Guido van Rossum | 6058eb4 | 1998-12-21 19:51:00 +0000 | [diff] [blame] | 3303 |    will return <module "gencache"> instead of <module "win32com">. */ | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3304 |  | 
 | 3305 | PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3306 | PyImport_Import(PyObject *module_name) | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3307 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3308 |     static PyObject *silly_list = NULL; | 
 | 3309 |     static PyObject *builtins_str = NULL; | 
 | 3310 |     static PyObject *import_str = NULL; | 
 | 3311 |     PyObject *globals = NULL; | 
 | 3312 |     PyObject *import = NULL; | 
 | 3313 |     PyObject *builtins = NULL; | 
| Brett Cannon | bc2eff3 | 2010-09-19 21:39:02 +0000 | [diff] [blame] | 3314 |     PyObject *modules = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3315 |     PyObject *r = NULL; | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3316 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3317 |     /* Initialize constant string objects */ | 
 | 3318 |     if (silly_list == NULL) { | 
 | 3319 |         import_str = PyUnicode_InternFromString("__import__"); | 
 | 3320 |         if (import_str == NULL) | 
 | 3321 |             return NULL; | 
 | 3322 |         builtins_str = PyUnicode_InternFromString("__builtins__"); | 
 | 3323 |         if (builtins_str == NULL) | 
 | 3324 |             return NULL; | 
| Brett Cannon | bc2eff3 | 2010-09-19 21:39:02 +0000 | [diff] [blame] | 3325 |         silly_list = PyList_New(0); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3326 |         if (silly_list == NULL) | 
 | 3327 |             return NULL; | 
 | 3328 |     } | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3329 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3330 |     /* Get the builtins from current globals */ | 
 | 3331 |     globals = PyEval_GetGlobals(); | 
 | 3332 |     if (globals != NULL) { | 
 | 3333 |         Py_INCREF(globals); | 
 | 3334 |         builtins = PyObject_GetItem(globals, builtins_str); | 
 | 3335 |         if (builtins == NULL) | 
 | 3336 |             goto err; | 
 | 3337 |     } | 
 | 3338 |     else { | 
 | 3339 |         /* No globals -- use standard builtins, and fake globals */ | 
 | 3340 |         builtins = PyImport_ImportModuleLevel("builtins", | 
 | 3341 |                                               NULL, NULL, NULL, 0); | 
 | 3342 |         if (builtins == NULL) | 
 | 3343 |             return NULL; | 
 | 3344 |         globals = Py_BuildValue("{OO}", builtins_str, builtins); | 
 | 3345 |         if (globals == NULL) | 
 | 3346 |             goto err; | 
 | 3347 |     } | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3348 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3349 |     /* Get the __import__ function from the builtins */ | 
 | 3350 |     if (PyDict_Check(builtins)) { | 
 | 3351 |         import = PyObject_GetItem(builtins, import_str); | 
 | 3352 |         if (import == NULL) | 
 | 3353 |             PyErr_SetObject(PyExc_KeyError, import_str); | 
 | 3354 |     } | 
 | 3355 |     else | 
 | 3356 |         import = PyObject_GetAttr(builtins, import_str); | 
 | 3357 |     if (import == NULL) | 
 | 3358 |         goto err; | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3359 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3360 |     /* Call the __import__ function with the proper argument list | 
| Brett Cannon | bc2eff3 | 2010-09-19 21:39:02 +0000 | [diff] [blame] | 3361 |        Always use absolute import here. | 
 | 3362 |        Calling for side-effect of import. */ | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3363 |     r = PyObject_CallFunction(import, "OOOOi", module_name, globals, | 
 | 3364 |                               globals, silly_list, 0, NULL); | 
| Brett Cannon | bc2eff3 | 2010-09-19 21:39:02 +0000 | [diff] [blame] | 3365 |     if (r == NULL) | 
 | 3366 |         goto err; | 
 | 3367 |     Py_DECREF(r); | 
 | 3368 |  | 
 | 3369 |     modules = PyImport_GetModuleDict(); | 
 | 3370 |     r = PyDict_GetItem(modules, module_name); | 
 | 3371 |     if (r != NULL) | 
 | 3372 |         Py_INCREF(r); | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3373 |  | 
 | 3374 |   err: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3375 |     Py_XDECREF(globals); | 
 | 3376 |     Py_XDECREF(builtins); | 
 | 3377 |     Py_XDECREF(import); | 
| Tim Peters | 50d8d37 | 2001-02-28 05:34:27 +0000 | [diff] [blame] | 3378 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3379 |     return r; | 
| Guido van Rossum | d47a0a8 | 1997-08-14 20:11:26 +0000 | [diff] [blame] | 3380 | } | 
 | 3381 |  | 
 | 3382 |  | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3383 | /* Module 'imp' provides Python access to the primitives used for | 
 | 3384 |    importing modules. | 
 | 3385 | */ | 
 | 3386 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3387 | static PyObject * | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3388 | imp_make_magic(long magic) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3389 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3390 |     char buf[4]; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3391 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3392 |     buf[0] = (char) ((magic >>  0) & 0xff); | 
 | 3393 |     buf[1] = (char) ((magic >>  8) & 0xff); | 
 | 3394 |     buf[2] = (char) ((magic >> 16) & 0xff); | 
 | 3395 |     buf[3] = (char) ((magic >> 24) & 0xff); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3396 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3397 |     return PyBytes_FromStringAndSize(buf, 4); | 
| Victor Stinner | 3e2b717 | 2010-11-09 09:32:19 +0000 | [diff] [blame] | 3398 | } | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3399 |  | 
 | 3400 | static PyObject * | 
 | 3401 | imp_get_magic(PyObject *self, PyObject *noargs) | 
 | 3402 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3403 |     return imp_make_magic(pyc_magic); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3404 | } | 
 | 3405 |  | 
 | 3406 | static PyObject * | 
 | 3407 | imp_get_tag(PyObject *self, PyObject *noargs) | 
 | 3408 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3409 |     return PyUnicode_FromString(pyc_tag); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3410 | } | 
 | 3411 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3412 | static PyObject * | 
| Neal Norwitz | 08ea61a | 2003-02-17 18:18:00 +0000 | [diff] [blame] | 3413 | imp_get_suffixes(PyObject *self, PyObject *noargs) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3414 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3415 |     PyObject *list; | 
 | 3416 |     struct filedescr *fdp; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3417 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3418 |     list = PyList_New(0); | 
 | 3419 |     if (list == NULL) | 
 | 3420 |         return NULL; | 
 | 3421 |     for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { | 
 | 3422 |         PyObject *item = Py_BuildValue("ssi", | 
 | 3423 |                                fdp->suffix, fdp->mode, fdp->type); | 
 | 3424 |         if (item == NULL) { | 
 | 3425 |             Py_DECREF(list); | 
 | 3426 |             return NULL; | 
 | 3427 |         } | 
 | 3428 |         if (PyList_Append(list, item) < 0) { | 
 | 3429 |             Py_DECREF(list); | 
 | 3430 |             Py_DECREF(item); | 
 | 3431 |             return NULL; | 
 | 3432 |         } | 
 | 3433 |         Py_DECREF(item); | 
 | 3434 |     } | 
 | 3435 |     return list; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3436 | } | 
 | 3437 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3438 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3439 | call_find_module(char *name, PyObject *path) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3440 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3441 |     extern int fclose(FILE *); | 
 | 3442 |     PyObject *fob, *ret; | 
 | 3443 |     PyObject *pathobj; | 
 | 3444 |     struct filedescr *fdp; | 
 | 3445 |     char pathname[MAXPATHLEN+1]; | 
| Victor Stinner | 7d8b77c | 2011-03-12 08:45:02 -0500 | [diff] [blame] | 3446 |     FILE *fp; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3447 |     int fd = -1; | 
 | 3448 |     char *found_encoding = NULL; | 
 | 3449 |     char *encoding = NULL; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3450 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3451 |     pathname[0] = '\0'; | 
 | 3452 |     if (path == Py_None) | 
 | 3453 |         path = NULL; | 
 | 3454 |     fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL); | 
 | 3455 |     if (fdp == NULL) | 
 | 3456 |         return NULL; | 
 | 3457 |     if (fp != NULL) { | 
 | 3458 |         fd = fileno(fp); | 
 | 3459 |         if (fd != -1) | 
 | 3460 |             fd = dup(fd); | 
 | 3461 |         fclose(fp); | 
 | 3462 |         fp = NULL; | 
 | 3463 |     } | 
 | 3464 |     if (fd != -1) { | 
 | 3465 |         if (strchr(fdp->mode, 'b') == NULL) { | 
 | 3466 |             /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed | 
 | 3467 |                memory. */ | 
 | 3468 |             found_encoding = PyTokenizer_FindEncoding(fd); | 
 | 3469 |             lseek(fd, 0, 0); /* Reset position */ | 
 | 3470 |             if (found_encoding == NULL && PyErr_Occurred()) | 
 | 3471 |                 return NULL; | 
 | 3472 |             encoding = (found_encoding != NULL) ? found_encoding : | 
 | 3473 |                    (char*)PyUnicode_GetDefaultEncoding(); | 
 | 3474 |         } | 
 | 3475 |         fob = PyFile_FromFd(fd, pathname, fdp->mode, -1, | 
 | 3476 |                             (char*)encoding, NULL, NULL, 1); | 
 | 3477 |         if (fob == NULL) { | 
 | 3478 |             close(fd); | 
 | 3479 |             PyMem_FREE(found_encoding); | 
 | 3480 |             return NULL; | 
 | 3481 |         } | 
 | 3482 |     } | 
 | 3483 |     else { | 
 | 3484 |         fob = Py_None; | 
 | 3485 |         Py_INCREF(fob); | 
 | 3486 |     } | 
 | 3487 |     pathobj = PyUnicode_DecodeFSDefault(pathname); | 
 | 3488 |     ret = Py_BuildValue("NN(ssi)", | 
 | 3489 |                   fob, pathobj, fdp->suffix, fdp->mode, fdp->type); | 
 | 3490 |     PyMem_FREE(found_encoding); | 
| Brett Cannon | 3bb42d9 | 2007-10-20 03:43:15 +0000 | [diff] [blame] | 3491 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3492 |     return ret; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3493 | } | 
 | 3494 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3495 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3496 | imp_find_module(PyObject *self, PyObject *args) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3497 | { | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3498 |     PyObject *name; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3499 |     PyObject *ret, *path = NULL; | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3500 |     if (!PyArg_ParseTuple(args, "O&|O:find_module", | 
 | 3501 |                           PyUnicode_FSConverter, &name, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3502 |                           &path)) | 
 | 3503 |         return NULL; | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3504 |     ret = call_find_module(PyBytes_AS_STRING(name), path); | 
 | 3505 |     Py_DECREF(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3506 |     return ret; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3507 | } | 
 | 3508 |  | 
 | 3509 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3510 | imp_init_builtin(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3511 | { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 3512 |     PyObject *name; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3513 |     int ret; | 
 | 3514 |     PyObject *m; | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 3515 |     if (!PyArg_ParseTuple(args, "U:init_builtin", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3516 |         return NULL; | 
 | 3517 |     ret = init_builtin(name); | 
 | 3518 |     if (ret < 0) | 
 | 3519 |         return NULL; | 
 | 3520 |     if (ret == 0) { | 
 | 3521 |         Py_INCREF(Py_None); | 
 | 3522 |         return Py_None; | 
 | 3523 |     } | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 3524 |     m = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3525 |     Py_XINCREF(m); | 
 | 3526 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3527 | } | 
 | 3528 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3529 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3530 | imp_init_frozen(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3531 | { | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3532 |     PyObject *name; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3533 |     int ret; | 
 | 3534 |     PyObject *m; | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3535 |     if (!PyArg_ParseTuple(args, "U:init_frozen", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3536 |         return NULL; | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3537 |     ret = PyImport_ImportFrozenModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3538 |     if (ret < 0) | 
 | 3539 |         return NULL; | 
 | 3540 |     if (ret == 0) { | 
 | 3541 |         Py_INCREF(Py_None); | 
 | 3542 |         return Py_None; | 
 | 3543 |     } | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3544 |     m = PyImport_AddModuleObject(name); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3545 |     Py_XINCREF(m); | 
 | 3546 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3547 | } | 
 | 3548 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3549 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3550 | imp_get_frozen_object(PyObject *self, PyObject *args) | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 3551 | { | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3552 |     PyObject *name; | 
| Jack Jansen | 95ffa23 | 1995-10-03 14:38:41 +0000 | [diff] [blame] | 3553 |  | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3554 |     if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3555 |         return NULL; | 
 | 3556 |     return get_frozen_object(name); | 
| Guido van Rossum | 6ec1efb | 1995-08-04 04:08:57 +0000 | [diff] [blame] | 3557 | } | 
 | 3558 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3559 | static PyObject * | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 3560 | imp_is_frozen_package(PyObject *self, PyObject *args) | 
 | 3561 | { | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3562 |     PyObject *name; | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 3563 |  | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3564 |     if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3565 |         return NULL; | 
 | 3566 |     return is_frozen_package(name); | 
| Brett Cannon | 8d11013 | 2009-03-15 02:20:16 +0000 | [diff] [blame] | 3567 | } | 
 | 3568 |  | 
 | 3569 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3570 | imp_is_builtin(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3571 | { | 
| Victor Stinner | 9587286 | 2011-03-07 18:20:56 +0100 | [diff] [blame] | 3572 |     PyObject *name; | 
 | 3573 |     if (!PyArg_ParseTuple(args, "U:is_builtin", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3574 |         return NULL; | 
 | 3575 |     return PyLong_FromLong(is_builtin(name)); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3576 | } | 
 | 3577 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3578 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3579 | imp_is_frozen(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3580 | { | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3581 |     PyObject *name; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3582 |     struct _frozen *p; | 
| Victor Stinner | 53dc735 | 2011-03-20 01:50:21 +0100 | [diff] [blame] | 3583 |     if (!PyArg_ParseTuple(args, "U:is_frozen", &name)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3584 |         return NULL; | 
 | 3585 |     p = find_frozen(name); | 
 | 3586 |     return PyBool_FromLong((long) (p == NULL ? 0 : p->size)); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3587 | } | 
 | 3588 |  | 
 | 3589 | static FILE * | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3590 | get_file(PyObject *pathname, PyObject *fob, char *mode) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3591 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3592 |     FILE *fp; | 
 | 3593 |     if (mode[0] == 'U') | 
 | 3594 |         mode = "r" PY_STDIOTEXTMODE; | 
 | 3595 |     if (fob == NULL) { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3596 |         fp = _Py_fopen(pathname, mode); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3597 |     } | 
 | 3598 |     else { | 
 | 3599 |         int fd = PyObject_AsFileDescriptor(fob); | 
 | 3600 |         if (fd == -1) | 
 | 3601 |             return NULL; | 
 | 3602 |         if (!_PyVerify_fd(fd)) | 
 | 3603 |             goto error; | 
 | 3604 |         /* the FILE struct gets a new fd, so that it can be closed | 
 | 3605 |          * independently of the file descriptor given | 
 | 3606 |          */ | 
 | 3607 |         fd = dup(fd); | 
 | 3608 |         if (fd == -1) | 
 | 3609 |             goto error; | 
 | 3610 |         fp = fdopen(fd, mode); | 
 | 3611 |     } | 
 | 3612 |     if (fp) | 
 | 3613 |         return fp; | 
| Kristján Valur Jónsson | e1b0445 | 2009-03-31 17:43:39 +0000 | [diff] [blame] | 3614 | error: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3615 |     PyErr_SetFromErrno(PyExc_IOError); | 
 | 3616 |     return NULL; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3617 | } | 
 | 3618 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3619 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3620 | imp_load_compiled(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3621 | { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3622 |     PyObject *name, *pathname; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3623 |     PyObject *fob = NULL; | 
 | 3624 |     PyObject *m; | 
 | 3625 |     FILE *fp; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3626 |     if (!PyArg_ParseTuple(args, "UO&|O:load_compiled", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3627 |                           &name, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3628 |                           PyUnicode_FSDecoder, &pathname, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3629 |                           &fob)) | 
 | 3630 |         return NULL; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3631 |     fp = get_file(pathname, fob, "rb"); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3632 |     if (fp == NULL) { | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3633 |         Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3634 |         return NULL; | 
 | 3635 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3636 |     m = load_compiled_module(name, pathname, fp); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3637 |     fclose(fp); | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3638 |     Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3639 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3640 | } | 
 | 3641 |  | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 3642 | #ifdef HAVE_DYNAMIC_LOADING | 
 | 3643 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3644 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3645 | imp_load_dynamic(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3646 | { | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 3647 |     PyObject *name, *pathname, *fob = NULL, *mod; | 
 | 3648 |     FILE *fp; | 
 | 3649 |  | 
 | 3650 |     if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic", | 
 | 3651 |                           &name, PyUnicode_FSDecoder, &pathname, &fob)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3652 |         return NULL; | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 3653 |     if (fob != NULL) { | 
 | 3654 |         fp = get_file(NULL, fob, "r"); | 
 | 3655 |         if (fp == NULL) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3656 |             return NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3657 |     } | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 3658 |     else | 
 | 3659 |         fp = NULL; | 
 | 3660 |     mod = _PyImport_LoadDynamicModule(name, pathname, fp); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3661 |     if (fp) | 
 | 3662 |         fclose(fp); | 
| Victor Stinner | fefd70c | 2011-03-14 15:54:07 -0400 | [diff] [blame] | 3663 |     return mod; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3664 | } | 
 | 3665 |  | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 3666 | #endif /* HAVE_DYNAMIC_LOADING */ | 
 | 3667 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3668 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3669 | imp_load_source(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3670 | { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3671 |     PyObject *name, *pathname; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3672 |     PyObject *fob = NULL; | 
 | 3673 |     PyObject *m; | 
 | 3674 |     FILE *fp; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3675 |     if (!PyArg_ParseTuple(args, "UO&|O:load_source", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3676 |                           &name, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3677 |                           PyUnicode_FSDecoder, &pathname, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3678 |                           &fob)) | 
 | 3679 |         return NULL; | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3680 |     fp = get_file(pathname, fob, "r"); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3681 |     if (fp == NULL) { | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3682 |         Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3683 |         return NULL; | 
 | 3684 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3685 |     m = load_source_module(name, pathname, fp); | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3686 |     Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3687 |     fclose(fp); | 
 | 3688 |     return m; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3689 | } | 
 | 3690 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3691 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3692 | imp_load_module(PyObject *self, PyObject *args) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3693 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3694 |     char *name; | 
 | 3695 |     PyObject *fob; | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3696 |     PyObject *pathname; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3697 |     PyObject * ret; | 
 | 3698 |     char *suffix; /* Unused */ | 
 | 3699 |     char *mode; | 
 | 3700 |     int type; | 
 | 3701 |     FILE *fp; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3702 |  | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3703 |     if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3704 |                           &name, &fob, | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3705 |                           PyUnicode_FSConverter, &pathname, | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3706 |                           &suffix, &mode, &type)) | 
 | 3707 |         return NULL; | 
 | 3708 |     if (*mode) { | 
 | 3709 |         /* Mode must start with 'r' or 'U' and must not contain '+'. | 
 | 3710 |            Implicit in this test is the assumption that the mode | 
 | 3711 |            may contain other modifiers like 'b' or 't'. */ | 
| Guido van Rossum | 5e2c5fa | 2002-05-30 17:33:07 +0000 | [diff] [blame] | 3712 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3713 |         if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) { | 
 | 3714 |             PyErr_Format(PyExc_ValueError, | 
 | 3715 |                          "invalid file open mode %.200s", mode); | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3716 |             Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3717 |             return NULL; | 
 | 3718 |         } | 
 | 3719 |     } | 
 | 3720 |     if (fob == Py_None) | 
 | 3721 |         fp = NULL; | 
 | 3722 |     else { | 
 | 3723 |         fp = get_file(NULL, fob, mode); | 
 | 3724 |         if (fp == NULL) { | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3725 |             Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3726 |             return NULL; | 
 | 3727 |         } | 
 | 3728 |     } | 
| Victor Stinner | 1a56303 | 2010-10-15 22:43:10 +0000 | [diff] [blame] | 3729 |     ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL); | 
 | 3730 |     Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3731 |     if (fp) | 
 | 3732 |         fclose(fp); | 
 | 3733 |     return ret; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3734 | } | 
 | 3735 |  | 
 | 3736 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3737 | imp_load_package(PyObject *self, PyObject *args) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3738 | { | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3739 |     PyObject *name, *pathname; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3740 |     PyObject * ret; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3741 |     if (!PyArg_ParseTuple(args, "UO&:load_package", | 
 | 3742 |                           &name, PyUnicode_FSDecoder, &pathname)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3743 |         return NULL; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3744 |     ret = load_package(name, pathname); | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3745 |     Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3746 |     return ret; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3747 | } | 
 | 3748 |  | 
 | 3749 | static PyObject * | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3750 | imp_new_module(PyObject *self, PyObject *args) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3751 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3752 |     char *name; | 
 | 3753 |     if (!PyArg_ParseTuple(args, "s:new_module", &name)) | 
 | 3754 |         return NULL; | 
 | 3755 |     return PyModule_New(name); | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3756 | } | 
 | 3757 |  | 
| Christian Heimes | 13a7a21 | 2008-01-07 17:13:09 +0000 | [diff] [blame] | 3758 | static PyObject * | 
 | 3759 | imp_reload(PyObject *self, PyObject *v) | 
 | 3760 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3761 |     return PyImport_ReloadModule(v); | 
| Christian Heimes | 13a7a21 | 2008-01-07 17:13:09 +0000 | [diff] [blame] | 3762 | } | 
 | 3763 |  | 
 | 3764 | PyDoc_STRVAR(doc_reload, | 
 | 3765 | "reload(module) -> module\n\ | 
 | 3766 | \n\ | 
 | 3767 | Reload the module.  The module must have been successfully imported before."); | 
 | 3768 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3769 | static PyObject * | 
 | 3770 | imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws) | 
 | 3771 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3772 |     static char *kwlist[] = {"path", "debug_override", NULL}; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3773 |  | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3774 |     PyObject *pathname, *cpathname; | 
| Benjamin Peterson | 294a9fc | 2010-10-16 03:12:39 +0000 | [diff] [blame] | 3775 |     PyObject *debug_override = NULL; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3776 |     int debug = !Py_OptimizeFlag; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3777 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3778 |     if (!PyArg_ParseTupleAndKeywords( | 
| Victor Stinner | 3ea23dd | 2010-10-15 20:34:32 +0000 | [diff] [blame] | 3779 |                 args, kws, "O&|O", kwlist, | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3780 |                 PyUnicode_FSDecoder, &pathname, &debug_override)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3781 |         return NULL; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3782 |  | 
| Benjamin Peterson | 294a9fc | 2010-10-16 03:12:39 +0000 | [diff] [blame] | 3783 |     if (debug_override != NULL && | 
 | 3784 |         (debug = PyObject_IsTrue(debug_override)) < 0) { | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3785 |         Py_DECREF(pathname); | 
| Benjamin Peterson | 294a9fc | 2010-10-16 03:12:39 +0000 | [diff] [blame] | 3786 |         return NULL; | 
 | 3787 |     } | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3788 |  | 
| Victor Stinner | 3ea23dd | 2010-10-15 20:34:32 +0000 | [diff] [blame] | 3789 |     cpathname = make_compiled_pathname( | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3790 |         PyUnicode_AS_UNICODE(pathname), | 
 | 3791 |         debug); | 
 | 3792 |     Py_DECREF(pathname); | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3793 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3794 |     if (cpathname == NULL) { | 
 | 3795 |         PyErr_Format(PyExc_SystemError, "path buffer too short"); | 
 | 3796 |         return NULL; | 
 | 3797 |     } | 
| Victor Stinner | 2f42ae5 | 2011-03-20 00:41:24 +0100 | [diff] [blame^] | 3798 |     return cpathname; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3799 | } | 
 | 3800 |  | 
 | 3801 | PyDoc_STRVAR(doc_cache_from_source, | 
 | 3802 | "Given the path to a .py file, return the path to its .pyc/.pyo file.\n\ | 
 | 3803 | \n\ | 
 | 3804 | The .py file does not need to exist; this simply returns the path to the\n\ | 
 | 3805 | .pyc/.pyo file calculated as if the .py file were imported.  The extension\n\ | 
 | 3806 | will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\ | 
 | 3807 | \n\ | 
 | 3808 | If debug_override is not None, then it must be a boolean and is taken as\n\ | 
 | 3809 | the value of __debug__ instead."); | 
 | 3810 |  | 
 | 3811 | static PyObject * | 
 | 3812 | imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws) | 
 | 3813 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3814 |     static char *kwlist[] = {"path", NULL}; | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3815 |     PyObject *pathname, *source; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3816 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3817 |     if (!PyArg_ParseTupleAndKeywords( | 
| Victor Stinner | ebc0052 | 2010-12-03 17:06:43 +0000 | [diff] [blame] | 3818 |                 args, kws, "O&", kwlist, | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3819 |                 PyUnicode_FSDecoder, &pathname)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3820 |         return NULL; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3821 |  | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3822 |     source = make_source_pathname(pathname); | 
 | 3823 |     if (source == NULL) { | 
 | 3824 |         PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %R", | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3825 |                      pathname); | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3826 |         Py_DECREF(pathname); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3827 |         return NULL; | 
 | 3828 |     } | 
| Victor Stinner | c9abda0 | 2011-03-14 13:33:46 -0400 | [diff] [blame] | 3829 |     Py_DECREF(pathname); | 
 | 3830 |     return source; | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3831 | } | 
 | 3832 |  | 
 | 3833 | PyDoc_STRVAR(doc_source_from_cache, | 
 | 3834 | "Given the path to a .pyc./.pyo file, return the path to its .py file.\n\ | 
 | 3835 | \n\ | 
 | 3836 | The .pyc/.pyo file does not need to exist; this simply returns the path to\n\ | 
 | 3837 | the .py file calculated to correspond to the .pyc/.pyo file.  If path\n\ | 
 | 3838 | does not conform to PEP 3147 format, ValueError will be raised."); | 
 | 3839 |  | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3840 | /* Doc strings */ | 
 | 3841 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3842 | PyDoc_STRVAR(doc_imp, | 
 | 3843 | "This module provides the components needed to build your own\n\ | 
 | 3844 | __import__ function.  Undocumented functions are obsolete."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3845 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3846 | PyDoc_STRVAR(doc_find_module, | 
 | 3847 | "find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\ | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3848 | Search for a module.  If path is omitted or None, search for a\n\ | 
 | 3849 | built-in, frozen or special module and continue search in sys.path.\n\ | 
 | 3850 | The module name cannot contain '.'; to search for a submodule of a\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3851 | package, pass the submodule name and the package's __path__."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3852 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3853 | PyDoc_STRVAR(doc_load_module, | 
 | 3854 | "load_module(name, file, filename, (suffix, mode, type)) -> module\n\ | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3855 | Load a module, given information returned by find_module().\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3856 | The module name must include the full package name, if any."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3857 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3858 | PyDoc_STRVAR(doc_get_magic, | 
 | 3859 | "get_magic() -> string\n\ | 
 | 3860 | Return the magic number for .pyc or .pyo files."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3861 |  | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 3862 | PyDoc_STRVAR(doc_get_tag, | 
 | 3863 | "get_tag() -> string\n\ | 
 | 3864 | Return the magic tag for .pyc or .pyo files."); | 
 | 3865 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3866 | PyDoc_STRVAR(doc_get_suffixes, | 
 | 3867 | "get_suffixes() -> [(suffix, mode, type), ...]\n\ | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3868 | Return a list of (suffix, mode, type) tuples describing the files\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3869 | that find_module() looks for."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3870 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3871 | PyDoc_STRVAR(doc_new_module, | 
 | 3872 | "new_module(name) -> module\n\ | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3873 | Create a new module.  Do not enter it in sys.modules.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3874 | The module name must include the full package name, if any."); | 
| Guido van Rossum | 0207e6d | 1997-09-09 22:04:42 +0000 | [diff] [blame] | 3875 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 3876 | PyDoc_STRVAR(doc_lock_held, | 
| Tim Peters | a7c6509 | 2004-08-01 23:26:05 +0000 | [diff] [blame] | 3877 | "lock_held() -> boolean\n\ | 
 | 3878 | Return True if the import lock is currently held, else False.\n\ | 
 | 3879 | On platforms without threads, return False."); | 
| Tim Peters | 6923234 | 2001-08-30 05:16:13 +0000 | [diff] [blame] | 3880 |  | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 3881 | PyDoc_STRVAR(doc_acquire_lock, | 
 | 3882 | "acquire_lock() -> None\n\ | 
| Neal Norwitz | 2294c0d | 2003-02-12 23:02:21 +0000 | [diff] [blame] | 3883 | Acquires the interpreter's import lock for the current thread.\n\ | 
 | 3884 | This lock should be used by import hooks to ensure thread-safety\n\ | 
 | 3885 | when importing modules.\n\ | 
| Guido van Rossum | c4f4ca9 | 2003-02-12 21:46:11 +0000 | [diff] [blame] | 3886 | On platforms without threads, this function does nothing."); | 
 | 3887 |  | 
 | 3888 | PyDoc_STRVAR(doc_release_lock, | 
 | 3889 | "release_lock() -> None\n\ | 
 | 3890 | Release the interpreter's import lock.\n\ | 
 | 3891 | On platforms without threads, this function does nothing."); | 
 | 3892 |  | 
| Guido van Rossum | 79f25d9 | 1997-04-29 20:08:16 +0000 | [diff] [blame] | 3893 | static PyMethodDef imp_methods[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3894 |     {"find_module",      imp_find_module,  METH_VARARGS, doc_find_module}, | 
 | 3895 |     {"get_magic",        imp_get_magic,    METH_NOARGS,  doc_get_magic}, | 
 | 3896 |     {"get_tag",          imp_get_tag,      METH_NOARGS,  doc_get_tag}, | 
 | 3897 |     {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes}, | 
 | 3898 |     {"load_module",      imp_load_module,  METH_VARARGS, doc_load_module}, | 
 | 3899 |     {"new_module",       imp_new_module,   METH_VARARGS, doc_new_module}, | 
 | 3900 |     {"lock_held",        imp_lock_held,    METH_NOARGS,  doc_lock_held}, | 
 | 3901 |     {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock}, | 
 | 3902 |     {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock}, | 
 | 3903 |     {"reload",       imp_reload,       METH_O,       doc_reload}, | 
 | 3904 |     {"cache_from_source", (PyCFunction)imp_cache_from_source, | 
 | 3905 |      METH_VARARGS | METH_KEYWORDS, doc_cache_from_source}, | 
 | 3906 |     {"source_from_cache", (PyCFunction)imp_source_from_cache, | 
 | 3907 |      METH_VARARGS | METH_KEYWORDS, doc_source_from_cache}, | 
 | 3908 |     /* The rest are obsolete */ | 
 | 3909 |     {"get_frozen_object",       imp_get_frozen_object,  METH_VARARGS}, | 
 | 3910 |     {"is_frozen_package",   imp_is_frozen_package,  METH_VARARGS}, | 
 | 3911 |     {"init_builtin",            imp_init_builtin,       METH_VARARGS}, | 
 | 3912 |     {"init_frozen",             imp_init_frozen,        METH_VARARGS}, | 
 | 3913 |     {"is_builtin",              imp_is_builtin,         METH_VARARGS}, | 
 | 3914 |     {"is_frozen",               imp_is_frozen,          METH_VARARGS}, | 
 | 3915 |     {"load_compiled",           imp_load_compiled,      METH_VARARGS}, | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 3916 | #ifdef HAVE_DYNAMIC_LOADING | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3917 |     {"load_dynamic",            imp_load_dynamic,       METH_VARARGS}, | 
| Guido van Rossum | 96a8fb7 | 1999-12-22 14:09:35 +0000 | [diff] [blame] | 3918 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3919 |     {"load_package",            imp_load_package,       METH_VARARGS}, | 
 | 3920 |     {"load_source",             imp_load_source,        METH_VARARGS}, | 
 | 3921 |     {NULL,                      NULL}           /* sentinel */ | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 3922 | }; | 
 | 3923 |  | 
| Guido van Rossum | 1a8791e | 1998-08-04 22:46:29 +0000 | [diff] [blame] | 3924 | static int | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 3925 | setint(PyObject *d, char *name, int value) | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3926 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3927 |     PyObject *v; | 
 | 3928 |     int err; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3929 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3930 |     v = PyLong_FromLong((long)value); | 
 | 3931 |     err = PyDict_SetItemString(d, name, v); | 
 | 3932 |     Py_XDECREF(v); | 
 | 3933 |     return err; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 3934 | } | 
 | 3935 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 3936 | typedef struct { | 
 | 3937 |     PyObject_HEAD | 
 | 3938 | } NullImporter; | 
 | 3939 |  | 
 | 3940 | static int | 
 | 3941 | NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds) | 
 | 3942 | { | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3943 | #ifndef MS_WINDOWS | 
 | 3944 |     PyObject *path; | 
 | 3945 |     struct stat statbuf; | 
 | 3946 |     int rv; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 3947 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3948 |     if (!_PyArg_NoKeywords("NullImporter()", kwds)) | 
 | 3949 |         return -1; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 3950 |  | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3951 |     if (!PyArg_ParseTuple(args, "O&:NullImporter", | 
 | 3952 |                           PyUnicode_FSConverter, &path)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3953 |         return -1; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 3954 |  | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3955 |     if (PyBytes_GET_SIZE(path) == 0) { | 
 | 3956 |         Py_DECREF(path); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3957 |         PyErr_SetString(PyExc_ImportError, "empty pathname"); | 
 | 3958 |         return -1; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3959 |     } | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3960 |  | 
 | 3961 |     rv = stat(PyBytes_AS_STRING(path), &statbuf); | 
 | 3962 |     Py_DECREF(path); | 
 | 3963 |     if (rv == 0) { | 
 | 3964 |         /* it exists */ | 
 | 3965 |         if (S_ISDIR(statbuf.st_mode)) { | 
 | 3966 |             /* it's a directory */ | 
 | 3967 |             PyErr_SetString(PyExc_ImportError, "existing directory"); | 
 | 3968 |             return -1; | 
 | 3969 |         } | 
 | 3970 |     } | 
 | 3971 | #else /* MS_WINDOWS */ | 
 | 3972 |     PyObject *pathobj; | 
 | 3973 |     DWORD rv; | 
| Victor Stinner | 255dfdb | 2010-09-29 10:28:51 +0000 | [diff] [blame] | 3974 |     wchar_t *path; | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3975 |  | 
 | 3976 |     if (!_PyArg_NoKeywords("NullImporter()", kwds)) | 
 | 3977 |         return -1; | 
 | 3978 |  | 
 | 3979 |     if (!PyArg_ParseTuple(args, "U:NullImporter", | 
 | 3980 |                           &pathobj)) | 
 | 3981 |         return -1; | 
 | 3982 |  | 
 | 3983 |     if (PyUnicode_GET_SIZE(pathobj) == 0) { | 
 | 3984 |         PyErr_SetString(PyExc_ImportError, "empty pathname"); | 
 | 3985 |         return -1; | 
 | 3986 |     } | 
 | 3987 |  | 
| Victor Stinner | beb4135b | 2010-10-07 01:02:42 +0000 | [diff] [blame] | 3988 |     path = PyUnicode_AsWideCharString(pathobj, NULL); | 
| Victor Stinner | 255dfdb | 2010-09-29 10:28:51 +0000 | [diff] [blame] | 3989 |     if (path == NULL) | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3990 |         return -1; | 
 | 3991 |     /* see issue1293 and issue3677: | 
 | 3992 |      * stat() on Windows doesn't recognise paths like | 
 | 3993 |      * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs. | 
 | 3994 |      */ | 
 | 3995 |     rv = GetFileAttributesW(path); | 
| Victor Stinner | 255dfdb | 2010-09-29 10:28:51 +0000 | [diff] [blame] | 3996 |     PyMem_Free(path); | 
| Victor Stinner | 1a4d12d | 2010-08-13 13:07:29 +0000 | [diff] [blame] | 3997 |     if (rv != INVALID_FILE_ATTRIBUTES) { | 
 | 3998 |         /* it exists */ | 
 | 3999 |         if (rv & FILE_ATTRIBUTE_DIRECTORY) { | 
 | 4000 |             /* it's a directory */ | 
 | 4001 |             PyErr_SetString(PyExc_ImportError, "existing directory"); | 
 | 4002 |             return -1; | 
 | 4003 |         } | 
 | 4004 |     } | 
 | 4005 | #endif | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4006 |     return 0; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4007 | } | 
 | 4008 |  | 
 | 4009 | static PyObject * | 
 | 4010 | NullImporter_find_module(NullImporter *self, PyObject *args) | 
 | 4011 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4012 |     Py_RETURN_NONE; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4013 | } | 
 | 4014 |  | 
 | 4015 | static PyMethodDef NullImporter_methods[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4016 |     {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS, | 
 | 4017 |      "Always return None" | 
 | 4018 |     }, | 
 | 4019 |     {NULL}  /* Sentinel */ | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4020 | }; | 
 | 4021 |  | 
 | 4022 |  | 
| Christian Heimes | 9cd1775 | 2007-11-18 19:35:23 +0000 | [diff] [blame] | 4023 | PyTypeObject PyNullImporter_Type = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4024 |     PyVarObject_HEAD_INIT(NULL, 0) | 
 | 4025 |     "imp.NullImporter",        /*tp_name*/ | 
 | 4026 |     sizeof(NullImporter),      /*tp_basicsize*/ | 
 | 4027 |     0,                         /*tp_itemsize*/ | 
 | 4028 |     0,                         /*tp_dealloc*/ | 
 | 4029 |     0,                         /*tp_print*/ | 
 | 4030 |     0,                         /*tp_getattr*/ | 
 | 4031 |     0,                         /*tp_setattr*/ | 
 | 4032 |     0,                         /*tp_reserved*/ | 
 | 4033 |     0,                         /*tp_repr*/ | 
 | 4034 |     0,                         /*tp_as_number*/ | 
 | 4035 |     0,                         /*tp_as_sequence*/ | 
 | 4036 |     0,                         /*tp_as_mapping*/ | 
 | 4037 |     0,                         /*tp_hash */ | 
 | 4038 |     0,                         /*tp_call*/ | 
 | 4039 |     0,                         /*tp_str*/ | 
 | 4040 |     0,                         /*tp_getattro*/ | 
 | 4041 |     0,                         /*tp_setattro*/ | 
 | 4042 |     0,                         /*tp_as_buffer*/ | 
 | 4043 |     Py_TPFLAGS_DEFAULT,        /*tp_flags*/ | 
 | 4044 |     "Null importer object",    /* tp_doc */ | 
 | 4045 |     0,                             /* tp_traverse */ | 
 | 4046 |     0,                             /* tp_clear */ | 
 | 4047 |     0,                             /* tp_richcompare */ | 
 | 4048 |     0,                             /* tp_weaklistoffset */ | 
 | 4049 |     0,                             /* tp_iter */ | 
 | 4050 |     0,                             /* tp_iternext */ | 
 | 4051 |     NullImporter_methods,      /* tp_methods */ | 
 | 4052 |     0,                         /* tp_members */ | 
 | 4053 |     0,                         /* tp_getset */ | 
 | 4054 |     0,                         /* tp_base */ | 
 | 4055 |     0,                         /* tp_dict */ | 
 | 4056 |     0,                         /* tp_descr_get */ | 
 | 4057 |     0,                         /* tp_descr_set */ | 
 | 4058 |     0,                         /* tp_dictoffset */ | 
 | 4059 |     (initproc)NullImporter_init,      /* tp_init */ | 
 | 4060 |     0,                         /* tp_alloc */ | 
 | 4061 |     PyType_GenericNew          /* tp_new */ | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4062 | }; | 
 | 4063 |  | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 4064 | static struct PyModuleDef impmodule = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4065 |     PyModuleDef_HEAD_INIT, | 
 | 4066 |     "imp", | 
 | 4067 |     doc_imp, | 
 | 4068 |     0, | 
 | 4069 |     imp_methods, | 
 | 4070 |     NULL, | 
 | 4071 |     NULL, | 
 | 4072 |     NULL, | 
 | 4073 |     NULL | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 4074 | }; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4075 |  | 
| Jason Tishler | 6bc06ec | 2003-09-04 11:59:50 +0000 | [diff] [blame] | 4076 | PyMODINIT_FUNC | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 4077 | PyInit_imp(void) | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 4078 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4079 |     PyObject *m, *d; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 4080 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4081 |     if (PyType_Ready(&PyNullImporter_Type) < 0) | 
 | 4082 |         return NULL; | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 4083 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4084 |     m = PyModule_Create(&impmodule); | 
 | 4085 |     if (m == NULL) | 
 | 4086 |         goto failure; | 
 | 4087 |     d = PyModule_GetDict(m); | 
 | 4088 |     if (d == NULL) | 
 | 4089 |         goto failure; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 4090 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4091 |     if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure; | 
 | 4092 |     if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure; | 
 | 4093 |     if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure; | 
 | 4094 |     if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure; | 
 | 4095 |     if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure; | 
 | 4096 |     if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure; | 
 | 4097 |     if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure; | 
 | 4098 |     if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure; | 
 | 4099 |     if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure; | 
 | 4100 |     if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 4101 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4102 |     Py_INCREF(&PyNullImporter_Type); | 
 | 4103 |     PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type); | 
 | 4104 |     return m; | 
| Guido van Rossum | aee0bad | 1997-09-05 07:33:22 +0000 | [diff] [blame] | 4105 |   failure: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4106 |     Py_XDECREF(m); | 
 | 4107 |     return NULL; | 
| Guido van Rossum | 1ae940a | 1995-01-02 19:04:15 +0000 | [diff] [blame] | 4108 | } | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4109 |  | 
 | 4110 |  | 
| Guido van Rossum | b18618d | 2000-05-03 23:44:39 +0000 | [diff] [blame] | 4111 | /* API for embedding applications that want to add their own entries | 
 | 4112 |    to the table of built-in modules.  This should normally be called | 
 | 4113 |    *before* Py_Initialize().  When the table resize fails, -1 is | 
 | 4114 |    returned and the existing table is unchanged. | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4115 |  | 
 | 4116 |    After a similar function by Just van Rossum. */ | 
 | 4117 |  | 
 | 4118 | int | 
| Thomas Wouters | f70ef4f | 2000-07-22 18:47:25 +0000 | [diff] [blame] | 4119 | PyImport_ExtendInittab(struct _inittab *newtab) | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4120 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4121 |     static struct _inittab *our_copy = NULL; | 
 | 4122 |     struct _inittab *p; | 
 | 4123 |     int i, n; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4124 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4125 |     /* Count the number of entries in both tables */ | 
 | 4126 |     for (n = 0; newtab[n].name != NULL; n++) | 
 | 4127 |         ; | 
 | 4128 |     if (n == 0) | 
 | 4129 |         return 0; /* Nothing to do */ | 
 | 4130 |     for (i = 0; PyImport_Inittab[i].name != NULL; i++) | 
 | 4131 |         ; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4132 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4133 |     /* Allocate new memory for the combined table */ | 
 | 4134 |     p = our_copy; | 
 | 4135 |     PyMem_RESIZE(p, struct _inittab, i+n+1); | 
 | 4136 |     if (p == NULL) | 
 | 4137 |         return -1; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4138 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4139 |     /* Copy the tables into the new memory */ | 
 | 4140 |     if (our_copy != PyImport_Inittab) | 
 | 4141 |         memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab)); | 
 | 4142 |     PyImport_Inittab = our_copy = p; | 
 | 4143 |     memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab)); | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4144 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4145 |     return 0; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4146 | } | 
 | 4147 |  | 
 | 4148 | /* Shorthand to add a single entry given a name and a function */ | 
 | 4149 |  | 
 | 4150 | int | 
| Brett Cannon | a826f32 | 2009-04-02 03:41:46 +0000 | [diff] [blame] | 4151 | PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void)) | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4152 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4153 |     struct _inittab newtab[2]; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4154 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4155 |     memset(newtab, '\0', sizeof newtab); | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4156 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4157 |     newtab[0].name = (char *)name; | 
 | 4158 |     newtab[0].initfunc = initfunc; | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4159 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 4160 |     return PyImport_ExtendInittab(newtab); | 
| Guido van Rossum | 09cae1f | 1998-05-14 02:32:54 +0000 | [diff] [blame] | 4161 | } | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 4162 |  | 
 | 4163 | #ifdef __cplusplus | 
 | 4164 | } | 
 | 4165 | #endif |