blob: 103e7de43939f4fadfc6bf116f5ad9d62ae06187 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module definition and import implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006#include "Python-ast.h"
Guido van Rossumd8faa362007-04-27 19:54:29 +00007#undef Yield /* undefine macro conflicting with winbase.h */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +00009#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010#include "code.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000011#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000012#include "importdl.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000013
Guido van Rossum55a83382000-09-20 20:31:38 +000014#ifdef HAVE_FCNTL_H
15#include <fcntl.h>
16#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000017#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000018extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000019#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000020
Christian Heimesd3eb5a152008-02-24 00:38:49 +000021#ifdef MS_WINDOWS
22/* for stat.st_mode */
23typedef unsigned short mode_t;
Daniel Stutzbachc7937792010-09-09 21:18:04 +000024/* for _mkdir */
25#include <direct.h>
Christian Heimesd3eb5a152008-02-24 00:38:49 +000026#endif
27
Guido van Rossum21d335e1993-10-15 13:01:11 +000028
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000029/* 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 Rossum7faeab31995-07-07 22:50:36 +000033 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000034 Apple MPW compiler swaps their values, botching string constants.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000035
Guido van Rossum45aecf42006-03-15 04:58:47 +000036 The magic numbers must be spaced apart at least 2 values, as the
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000037 -U interpeter flag will cause MAGIC+1 being used. They have been
38 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000039
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000040 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 Rossumf6894922002-08-31 15:16:14 +000043
Barry Warsaw28a691b2010-04-17 00:19:56 +000044 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é Lemburgbd3be8f2002-02-07 11:33:49 +000053 Known values:
54 Python 1.5: 20121
55 Python 1.5.1: 20121
56 Python 1.5.2: 20121
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000057 Python 1.6: 50428
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000058 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 Norwitz7fdcb412002-06-14 01:07:39 +000064 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000065 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000066 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000067 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000068 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000069 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000070 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000071 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000072 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000073 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000074 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 Pitrouf95a1b32010-05-09 15:52:27 +000077 storing constants that should have been removed)
Thomas Wouters89f507f2006-12-13 04:49:30 +000078 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Christian Heimes99170a52007-12-19 02:07:34 +000079 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000080 Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Guido van Rossum45aecf42006-03-15 04:58:47 +000081 Python 3000: 3000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 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 Peterson0f6cae02009-12-10 02:09:08 +000094 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 Pitrouf95a1b32010-05-09 15:52:27 +000097 change LIST_APPEND and SET_ADD, add MAP_ADD)
Benjamin Peterson0f6cae02009-12-10 02:09:08 +000098 Python 3.1a0: 3151 (optimize conditional branches:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Benjamin Peterson876b2f22009-06-28 03:18:59 +0000100 Python 3.2a0: 3160 (add SETUP_WITH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 tag: cpython-32
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000102 Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
103 tag: cpython-32
Benjamin Peterson6246d6d2010-09-10 21:51:44 +0000104 Python 3.2a2 3180 (add DELETE_DEREF)
Benjamin Petersone7c15fa2011-06-19 19:54:45 -0500105 Python 3.3a0 3190 __class__ super closure changed
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100106 Python 3.3a0 3200 (__qualname__ added)
Benjamin Petersonabdb5522012-03-15 15:40:37 -0500107 3210 (added size modulo 2**32 to the pyc header)
108 Python 3.3a1 3220 (changed PEP 380 implementation)
Tim Peters36515e22001-11-18 04:06:29 +0000109*/
Guido van Rossum3ddee711991-12-16 13:06:34 +0000110
Nick Coghlancd419ab2010-09-11 00:39:25 +0000111/* MAGIC must change whenever the bytecode emitted by the compiler may no
112 longer be understood by older implementations of the eval loop (usually
113 due to the addition of new opcodes)
Martin v. Löwisfadcd312011-10-23 18:08:20 +0200114 TAG must change for each major Python release. The magic number will take
115 care of any bytecode changes that occur during development.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000116*/
Benjamin Peterson48deae12011-06-03 17:50:16 -0500117#define QUOTE(arg) #arg
118#define STRIFY(name) QUOTE(name)
119#define MAJOR STRIFY(PY_MAJOR_VERSION)
120#define MINOR STRIFY(PY_MINOR_VERSION)
Benjamin Petersonf53d20f2012-03-16 09:39:12 -0500121#define MAGIC (3220 | ((long)'\r'<<16) | ((long)'\n'<<24))
Benjamin Peterson48deae12011-06-03 17:50:16 -0500122#define TAG "cpython-" MAJOR MINOR;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000123#define CACHEDIR "__pycache__"
124/* Current magic word and string tag as globals. */
Guido van Rossum96774c12000-05-01 20:19:08 +0000125static long pyc_magic = MAGIC;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000126static const char *pyc_tag = TAG;
Benjamin Peterson48deae12011-06-03 17:50:16 -0500127#undef QUOTE
128#undef STRIFY
129#undef MAJOR
130#undef MINOR
Guido van Rossum96774c12000-05-01 20:19:08 +0000131
Victor Stinner95872862011-03-07 18:20:56 +0100132/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134
Victor Stinnerfe7c5b52011-04-05 01:48:03 +0200135/* Function from Parser/tokenizer.c */
136extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
137
Guido van Rossum771c6c81997-10-31 18:37:24 +0000138/* This table is defined in config.c: */
139extern struct _inittab _PyImport_Inittab[];
140
141struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000142
Guido van Rossumed1170e1999-12-20 21:23:41 +0000143/* these tables define the module suffixes that Python recognizes */
144struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000145
Guido van Rossumed1170e1999-12-20 21:23:41 +0000146static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000148#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 {".pyc", "rb", PY_COMPILED},
152 {0, 0}
Guido van Rossumed1170e1999-12-20 21:23:41 +0000153};
154
Victor Stinnerd0296212011-03-14 14:04:10 -0400155static PyObject *initstr = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000156
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000157/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158
159void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000160_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 const struct filedescr *scan;
163 struct filedescr *filetab;
164 int countD = 0;
165 int countS = 0;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000166
Victor Stinnerd0296212011-03-14 14:04:10 -0400167 initstr = PyUnicode_InternFromString("__init__");
168 if (initstr == NULL)
169 Py_FatalError("Can't initialize import variables");
170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 /* prepare _PyImport_Filetab: copy entries from
172 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
173 */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000174#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
176 ++countD;
Guido van Rossum04110fb2007-08-24 16:32:05 +0000177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
179 ++countS;
180 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
181 if (filetab == NULL)
182 Py_FatalError("Can't initialize import file table.");
Guido van Rossum04110fb2007-08-24 16:32:05 +0000183#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 memcpy(filetab, _PyImport_DynLoadFiletab,
185 countD * sizeof(struct filedescr));
Guido van Rossum04110fb2007-08-24 16:32:05 +0000186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 memcpy(filetab + countD, _PyImport_StandardFiletab,
188 countS * sizeof(struct filedescr));
189 filetab[countD + countS].suffix = NULL;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 _PyImport_Filetab = filetab;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 if (Py_OptimizeFlag) {
194 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
195 for (; filetab->suffix != NULL; filetab++) {
196 if (strcmp(filetab->suffix, ".pyc") == 0)
197 filetab->suffix = ".pyo";
198 }
199 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200}
201
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202void
Just van Rossum52e14d62002-12-30 22:08:05 +0000203_PyImportHooks_Init(void)
204{
Brett Cannonfd074152012-04-14 14:10:13 -0400205 PyObject *v, *path_hooks = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 if (PyType_Ready(&PyNullImporter_Type) < 0)
209 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000210
Brett Cannonfd074152012-04-14 14:10:13 -0400211 /* adding sys.path_hooks and sys.path_importer_cache */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 v = PyList_New(0);
213 if (v == NULL)
214 goto error;
215 err = PySys_SetObject("meta_path", v);
216 Py_DECREF(v);
217 if (err)
218 goto error;
219 v = PyDict_New();
220 if (v == NULL)
221 goto error;
222 err = PySys_SetObject("path_importer_cache", v);
223 Py_DECREF(v);
224 if (err)
225 goto error;
226 path_hooks = PyList_New(0);
227 if (path_hooks == NULL)
228 goto error;
229 err = PySys_SetObject("path_hooks", path_hooks);
230 if (err) {
Just van Rossum52e14d62002-12-30 22:08:05 +0000231 error:
Brett Cannonfd074152012-04-14 14:10:13 -0400232 PyErr_Print();
233 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
234 "path_importer_cache, or NullImporter failed"
235 );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 }
Brett Cannonfd074152012-04-14 14:10:13 -0400237 Py_DECREF(path_hooks);
238}
239
240void
241_PyImportZip_Init(void)
242{
243 PyObject *path_hooks, *zimpimport;
244 int err = 0;
245
246 path_hooks = PySys_GetObject("path_hooks");
247 if (path_hooks == NULL)
248 goto error;
249
250 if (Py_VerboseFlag)
251 PySys_WriteStderr("# installing zipimport hook\n");
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 zimpimport = PyImport_ImportModule("zipimport");
254 if (zimpimport == NULL) {
255 PyErr_Clear(); /* No zip import module -- okay */
256 if (Py_VerboseFlag)
257 PySys_WriteStderr("# can't import zipimport\n");
258 }
259 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200260 _Py_IDENTIFIER(zipimporter);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200261 PyObject *zipimporter = _PyObject_GetAttrId(zimpimport,
262 &PyId_zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 Py_DECREF(zimpimport);
264 if (zipimporter == NULL) {
265 PyErr_Clear(); /* No zipimporter object -- okay */
266 if (Py_VerboseFlag)
267 PySys_WriteStderr(
268 "# can't import zipimport.zipimporter\n");
269 }
270 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -0400271 /* sys.path_hooks.insert(0, zipimporter) */
272 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -0400274 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -0400276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 if (Py_VerboseFlag)
278 PySys_WriteStderr(
279 "# installed zipimport hook\n");
280 }
281 }
Brett Cannonfd074152012-04-14 14:10:13 -0400282
283 return;
284
285 error:
286 PyErr_Print();
287 Py_FatalError("initializing zipimport or NullImporter failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000288}
289
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000290/* Locking primitives to prevent parallel imports of the same module
291 in different threads to return with a partially loaded module.
292 These calls are serialized by the global interpreter lock. */
293
294#ifdef WITH_THREAD
295
Guido van Rossum49b56061998-10-01 20:42:43 +0000296#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000297
Guido van Rossum65d5b571998-12-21 19:32:43 +0000298static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000299static long import_lock_thread = -1;
300static int import_lock_level = 0;
301
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000302void
303_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 long me = PyThread_get_thread_ident();
306 if (me == -1)
307 return; /* Too bad */
308 if (import_lock == NULL) {
309 import_lock = PyThread_allocate_lock();
310 if (import_lock == NULL)
311 return; /* Nothing much we can do. */
312 }
313 if (import_lock_thread == me) {
314 import_lock_level++;
315 return;
316 }
317 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
318 {
319 PyThreadState *tstate = PyEval_SaveThread();
320 PyThread_acquire_lock(import_lock, 1);
321 PyEval_RestoreThread(tstate);
322 }
323 import_lock_thread = me;
324 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000325}
326
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000327int
328_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 long me = PyThread_get_thread_ident();
331 if (me == -1 || import_lock == NULL)
332 return 0; /* Too bad */
333 if (import_lock_thread != me)
334 return -1;
335 import_lock_level--;
336 if (import_lock_level == 0) {
337 import_lock_thread = -1;
338 PyThread_release_lock(import_lock);
339 }
340 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000341}
342
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000343/* This function is called from PyOS_AfterFork to ensure that newly
344 created child processes do not share locks with the parent.
345 We now acquire the import lock around fork() calls but on some platforms
346 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000347
348void
349_PyImport_ReInitLock(void)
350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 if (import_lock != NULL)
352 import_lock = PyThread_allocate_lock();
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000353 if (import_lock_level > 1) {
354 /* Forked as a side effect of import */
355 long me = PyThread_get_thread_ident();
356 PyThread_acquire_lock(import_lock, 0);
Victor Stinner942003c2011-03-07 16:57:48 +0100357 /* XXX: can the previous line fail? */
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000358 import_lock_thread = me;
359 import_lock_level--;
360 } else {
361 import_lock_thread = -1;
362 import_lock_level = 0;
363 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000364}
365
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000366#endif
367
Tim Peters69232342001-08-30 05:16:13 +0000368static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000369imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000370{
Tim Peters69232342001-08-30 05:16:13 +0000371#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000373#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000375#endif
376}
377
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000378static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000379imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000380{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000381#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 _PyImport_AcquireLock();
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 Py_INCREF(Py_None);
385 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000386}
387
388static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000389imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000390{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000391#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 if (_PyImport_ReleaseLock() < 0) {
393 PyErr_SetString(PyExc_RuntimeError,
394 "not holding the import lock");
395 return NULL;
396 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 Py_INCREF(Py_None);
399 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000400}
401
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100402void
403_PyImport_Fini(void)
404{
405 Py_XDECREF(extensions);
406 extensions = NULL;
407 PyMem_DEL(_PyImport_Filetab);
408 _PyImport_Filetab = NULL;
409#ifdef WITH_THREAD
410 if (import_lock != NULL) {
411 PyThread_free_lock(import_lock);
412 import_lock = NULL;
413 }
414#endif
415}
416
Guido van Rossumd8faa362007-04-27 19:54:29 +0000417static void
418imp_modules_reloading_clear(void)
419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 PyInterpreterState *interp = PyThreadState_Get()->interp;
421 if (interp->modules_reloading != NULL)
422 PyDict_Clear(interp->modules_reloading);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423}
424
Guido van Rossum25ce5661997-08-02 03:10:38 +0000425/* Helper for sys */
426
427PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 PyInterpreterState *interp = PyThreadState_GET()->interp;
431 if (interp->modules == NULL)
432 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
433 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000434}
435
Guido van Rossum3f5da241990-12-20 15:06:42 +0000436
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000437/* List of names to clear in sys */
438static char* sys_deletes[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 "path", "argv", "ps1", "ps2",
440 "last_type", "last_value", "last_traceback",
441 "path_hooks", "path_importer_cache", "meta_path",
442 /* misc stuff */
443 "flags", "float_info",
444 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000445};
446
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000447static char* sys_files[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 "stdin", "__stdin__",
449 "stdout", "__stdout__",
450 "stderr", "__stderr__",
451 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000452};
453
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000454
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000456
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000458PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 Py_ssize_t pos, ndone;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 PyObject *key, *value, *dict;
462 PyInterpreterState *interp = PyThreadState_GET()->interp;
463 PyObject *modules = interp->modules;
Guido van Rossum758eec01998-01-19 21:58:26 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 if (modules == NULL)
466 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 /* Delete some special variables first. These are common
469 places where user values hide and people complain when their
470 destructors fail. Since the modules containing them are
471 deleted *last* of all, they would come too late in the normal
472 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 value = PyDict_GetItemString(modules, "builtins");
475 if (value != NULL && PyModule_Check(value)) {
476 dict = PyModule_GetDict(value);
477 if (Py_VerboseFlag)
478 PySys_WriteStderr("# clear builtins._\n");
479 PyDict_SetItemString(dict, "_", Py_None);
480 }
481 value = PyDict_GetItemString(modules, "sys");
482 if (value != NULL && PyModule_Check(value)) {
483 char **p;
484 PyObject *v;
485 dict = PyModule_GetDict(value);
486 for (p = sys_deletes; *p != NULL; p++) {
487 if (Py_VerboseFlag)
488 PySys_WriteStderr("# clear sys.%s\n", *p);
489 PyDict_SetItemString(dict, *p, Py_None);
490 }
491 for (p = sys_files; *p != NULL; p+=2) {
492 if (Py_VerboseFlag)
493 PySys_WriteStderr("# restore sys.%s\n", *p);
494 v = PyDict_GetItemString(dict, *(p+1));
495 if (v == NULL)
496 v = Py_None;
497 PyDict_SetItemString(dict, *p, v);
498 }
499 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 /* First, delete __main__ */
502 value = PyDict_GetItemString(modules, "__main__");
503 if (value != NULL && PyModule_Check(value)) {
504 if (Py_VerboseFlag)
505 PySys_WriteStderr("# cleanup __main__\n");
506 _PyModule_Clear(value);
507 PyDict_SetItemString(modules, "__main__", Py_None);
508 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* The special treatment of "builtins" here is because even
511 when it's not referenced as a module, its dictionary is
512 referenced by almost every module's __builtins__. Since
513 deleting a module clears its dictionary (even if there are
514 references left to it), we need to delete the "builtins"
515 module last. Likewise, we don't delete sys until the very
516 end because it is implicitly referenced (e.g. by print).
Guido van Rossum758eec01998-01-19 21:58:26 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 Also note that we 'delete' modules by replacing their entry
519 in the modules dict with None, rather than really deleting
520 them; this avoids a rehash of the modules dictionary and
521 also marks them as "non existent" so they won't be
522 re-imported. */
Guido van Rossum758eec01998-01-19 21:58:26 +0000523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 /* Next, repeatedly delete modules with a reference count of
525 one (skipping builtins and sys) and delete them */
526 do {
527 ndone = 0;
528 pos = 0;
529 while (PyDict_Next(modules, &pos, &key, &value)) {
530 if (value->ob_refcnt != 1)
531 continue;
532 if (PyUnicode_Check(key) && PyModule_Check(value)) {
Victor Stinner9464d612011-03-07 17:08:21 +0100533 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 continue;
Victor Stinner9464d612011-03-07 17:08:21 +0100535 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 continue;
537 if (Py_VerboseFlag)
Victor Stinner9464d612011-03-07 17:08:21 +0100538 PySys_FormatStderr(
539 "# cleanup[1] %U\n", key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 _PyModule_Clear(value);
541 PyDict_SetItem(modules, key, Py_None);
542 ndone++;
543 }
544 }
545 } while (ndone > 0);
Guido van Rossum758eec01998-01-19 21:58:26 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 /* Next, delete all modules (still skipping builtins and sys) */
548 pos = 0;
549 while (PyDict_Next(modules, &pos, &key, &value)) {
550 if (PyUnicode_Check(key) && PyModule_Check(value)) {
Victor Stinner9464d612011-03-07 17:08:21 +0100551 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 continue;
Victor Stinner9464d612011-03-07 17:08:21 +0100553 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 continue;
555 if (Py_VerboseFlag)
Victor Stinner9464d612011-03-07 17:08:21 +0100556 PySys_FormatStderr("# cleanup[2] %U\n", key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 _PyModule_Clear(value);
558 PyDict_SetItem(modules, key, Py_None);
559 }
560 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 /* Next, delete sys and builtins (in that order) */
563 value = PyDict_GetItemString(modules, "sys");
564 if (value != NULL && PyModule_Check(value)) {
565 if (Py_VerboseFlag)
566 PySys_WriteStderr("# cleanup sys\n");
567 _PyModule_Clear(value);
568 PyDict_SetItemString(modules, "sys", Py_None);
569 }
570 value = PyDict_GetItemString(modules, "builtins");
571 if (value != NULL && PyModule_Check(value)) {
572 if (Py_VerboseFlag)
573 PySys_WriteStderr("# cleanup builtins\n");
574 _PyModule_Clear(value);
575 PyDict_SetItemString(modules, "builtins", Py_None);
576 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 /* Finally, clear and delete the modules directory */
579 PyDict_Clear(modules);
580 interp->modules = NULL;
581 Py_DECREF(modules);
582 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000583}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000584
585
Barry Warsaw28a691b2010-04-17 00:19:56 +0000586/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587
588long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000589PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592}
593
594
Barry Warsaw28a691b2010-04-17 00:19:56 +0000595const char *
596PyImport_GetMagicTag(void)
597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 return pyc_tag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000599}
600
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601/* Magic for extension modules (built-in as well as dynamically
602 loaded). To prevent initializing an extension module more than
603 once, we keep a static dictionary 'extensions' keyed by module name
604 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000605 modules), containing these modules. A copy of the module's
Victor Stinner95872862011-03-07 18:20:56 +0100606 dictionary is stored by calling _PyImport_FixupExtensionObject()
Guido van Rossum25ce5661997-08-02 03:10:38 +0000607 immediately after the module initialization function succeeds. A
608 copy can be retrieved from there by calling
Victor Stinner95872862011-03-07 18:20:56 +0100609 _PyImport_FindExtensionObject().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000610
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000611 Modules which do support multiple initialization set their m_size
612 field to a non-negative number (indicating the size of the
613 module-specific state). They are still recorded in the extensions
614 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000615*/
616
617int
Victor Stinner95872862011-03-07 18:20:56 +0100618_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
619 PyObject *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *modules, *dict;
622 struct PyModuleDef *def;
623 if (extensions == NULL) {
624 extensions = PyDict_New();
625 if (extensions == NULL)
626 return -1;
627 }
628 if (mod == NULL || !PyModule_Check(mod)) {
629 PyErr_BadInternalCall();
630 return -1;
631 }
632 def = PyModule_GetDef(mod);
633 if (!def) {
634 PyErr_BadInternalCall();
635 return -1;
636 }
637 modules = PyImport_GetModuleDict();
Victor Stinner95872862011-03-07 18:20:56 +0100638 if (PyDict_SetItem(modules, name, mod) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return -1;
640 if (_PyState_AddModule(mod, def) < 0) {
Victor Stinner95872862011-03-07 18:20:56 +0100641 PyDict_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 return -1;
643 }
644 if (def->m_size == -1) {
645 if (def->m_base.m_copy) {
646 /* Somebody already imported the module,
647 likely under a different name.
648 XXX this should really not happen. */
649 Py_DECREF(def->m_base.m_copy);
650 def->m_base.m_copy = NULL;
651 }
652 dict = PyModule_GetDict(mod);
653 if (dict == NULL)
654 return -1;
655 def->m_base.m_copy = PyDict_Copy(dict);
656 if (def->m_base.m_copy == NULL)
657 return -1;
658 }
Victor Stinner49d3f252010-10-17 01:24:53 +0000659 PyDict_SetItem(extensions, filename, (PyObject*)def);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000661}
662
Victor Stinner49d3f252010-10-17 01:24:53 +0000663int
664_PyImport_FixupBuiltin(PyObject *mod, char *name)
665{
666 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100667 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100668 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100669 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000670 return -1;
Victor Stinner95872862011-03-07 18:20:56 +0100671 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
672 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000673 return res;
674}
675
Guido van Rossum25ce5661997-08-02 03:10:38 +0000676PyObject *
Victor Stinner95872862011-03-07 18:20:56 +0100677_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 PyObject *mod, *mdict;
680 PyModuleDef* def;
681 if (extensions == NULL)
682 return NULL;
Victor Stinner49d3f252010-10-17 01:24:53 +0000683 def = (PyModuleDef*)PyDict_GetItem(extensions, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (def == NULL)
685 return NULL;
686 if (def->m_size == -1) {
687 /* Module does not support repeated initialization */
688 if (def->m_base.m_copy == NULL)
689 return NULL;
Victor Stinner95872862011-03-07 18:20:56 +0100690 mod = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 if (mod == NULL)
692 return NULL;
693 mdict = PyModule_GetDict(mod);
694 if (mdict == NULL)
695 return NULL;
696 if (PyDict_Update(mdict, def->m_base.m_copy))
697 return NULL;
698 }
699 else {
700 if (def->m_base.m_init == NULL)
701 return NULL;
702 mod = def->m_base.m_init();
703 if (mod == NULL)
704 return NULL;
Victor Stinner95872862011-03-07 18:20:56 +0100705 PyDict_SetItem(PyImport_GetModuleDict(), name, mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 Py_DECREF(mod);
707 }
708 if (_PyState_AddModule(mod, def) < 0) {
Victor Stinner95872862011-03-07 18:20:56 +0100709 PyDict_DelItem(PyImport_GetModuleDict(), name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 Py_DECREF(mod);
711 return NULL;
712 }
713 if (Py_VerboseFlag)
Victor Stinner95872862011-03-07 18:20:56 +0100714 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 name, filename);
716 return mod;
Brett Cannon9a5b25a2010-03-01 02:09:17 +0000717
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718}
719
Victor Stinner49d3f252010-10-17 01:24:53 +0000720PyObject *
Victor Stinner501c09a2011-02-23 00:02:00 +0000721_PyImport_FindBuiltin(const char *name)
Victor Stinner49d3f252010-10-17 01:24:53 +0000722{
Victor Stinner95872862011-03-07 18:20:56 +0100723 PyObject *res, *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100724 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100725 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000726 return NULL;
Victor Stinner95872862011-03-07 18:20:56 +0100727 res = _PyImport_FindExtensionObject(nameobj, nameobj);
728 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000729 return res;
730}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731
732/* Get the module object corresponding to a module name.
733 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000734 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000735 Because the former action is most common, THIS DOES NOT RETURN A
736 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000739PyImport_AddModuleObject(PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 PyObject *modules = PyImport_GetModuleDict();
742 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743
Victor Stinner27ee0892011-03-04 12:57:09 +0000744 if ((m = PyDict_GetItem(modules, name)) != NULL &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 PyModule_Check(m))
746 return m;
Victor Stinner27ee0892011-03-04 12:57:09 +0000747 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 if (m == NULL)
749 return NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000750 if (PyDict_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 Py_DECREF(m);
752 return NULL;
753 }
754 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757}
758
Victor Stinner27ee0892011-03-04 12:57:09 +0000759PyObject *
760PyImport_AddModule(const char *name)
761{
762 PyObject *nameobj, *module;
763 nameobj = PyUnicode_FromString(name);
764 if (nameobj == NULL)
765 return NULL;
766 module = PyImport_AddModuleObject(nameobj);
767 Py_DECREF(nameobj);
768 return module;
769}
770
771
Tim Peters1cd70172004-08-02 03:52:12 +0000772/* Remove name from sys.modules, if it's there. */
773static void
Victor Stinner27ee0892011-03-04 12:57:09 +0000774remove_module(PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 PyObject *modules = PyImport_GetModuleDict();
Victor Stinner27ee0892011-03-04 12:57:09 +0000777 if (PyDict_GetItem(modules, name) == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 return;
Victor Stinner27ee0892011-03-04 12:57:09 +0000779 if (PyDict_DelItem(modules, name) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 Py_FatalError("import: deleting existing key in"
781 "sys.modules failed");
Tim Peters1cd70172004-08-02 03:52:12 +0000782}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783
Victor Stinnerc9abda02011-03-14 13:33:46 -0400784static PyObject * get_sourcefile(PyObject *filename);
785static PyObject *make_source_pathname(PyObject *pathname);
Christian Heimes3b06e532008-01-07 20:12:44 +0000786
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000787/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000788 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
789 * removed from sys.modules, to avoid leaving damaged module objects
790 * in sys.modules. The caller may wish to restore the original
791 * module object (if any) in this case; PyImport_ReloadModule is an
792 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000793 *
794 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
795 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000796 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000798PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 return PyImport_ExecCodeModuleWithPathnames(
801 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000802}
803
804PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 return PyImport_ExecCodeModuleWithPathnames(
808 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000809}
810
811PyObject *
812PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000814{
Victor Stinner27ee0892011-03-04 12:57:09 +0000815 PyObject *m = NULL;
816 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL;
817
818 nameobj = PyUnicode_FromString(name);
819 if (nameobj == NULL)
820 return NULL;
821
822 if (pathname != NULL) {
823 pathobj = PyUnicode_DecodeFSDefault(pathname);
824 if (pathobj == NULL)
825 goto error;
826 } else
827 pathobj = NULL;
828 if (cpathname != NULL) {
829 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
830 if (cpathobj == NULL)
831 goto error;
832 } else
833 cpathobj = NULL;
834 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
835error:
836 Py_DECREF(nameobj);
837 Py_XDECREF(pathobj);
838 Py_XDECREF(cpathobj);
839 return m;
840}
841
842PyObject*
843PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
844 PyObject *cpathname)
845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyObject *modules = PyImport_GetModuleDict();
847 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848
Victor Stinner27ee0892011-03-04 12:57:09 +0000849 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 if (m == NULL)
851 return NULL;
852 /* If the module is being reloaded, we get the old module back
853 and re-use its dict to exec the new code. */
854 d = PyModule_GetDict(m);
855 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
856 if (PyDict_SetItemString(d, "__builtins__",
857 PyEval_GetBuiltins()) != 0)
858 goto error;
859 }
860 /* Remember the filename as the __file__ attribute */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 if (pathname != NULL) {
Victor Stinnerc9abda02011-03-14 13:33:46 -0400862 v = get_sourcefile(pathname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (v == NULL)
864 PyErr_Clear();
865 }
Victor Stinner27ee0892011-03-04 12:57:09 +0000866 else
867 v = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (v == NULL) {
869 v = ((PyCodeObject *)co)->co_filename;
870 Py_INCREF(v);
871 }
872 if (PyDict_SetItemString(d, "__file__", v) != 0)
873 PyErr_Clear(); /* Not important enough to report */
874 Py_DECREF(v);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 /* Remember the pyc path name as the __cached__ attribute. */
Victor Stinner27ee0892011-03-04 12:57:09 +0000877 if (cpathname != NULL)
878 v = cpathname;
879 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 v = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (PyDict_SetItemString(d, "__cached__", v) != 0)
882 PyErr_Clear(); /* Not important enough to report */
Barry Warsaw28a691b2010-04-17 00:19:56 +0000883
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000884 v = PyEval_EvalCode(co, d, d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 if (v == NULL)
886 goto error;
887 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000888
Victor Stinner27ee0892011-03-04 12:57:09 +0000889 if ((m = PyDict_GetItem(modules, name)) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 PyErr_Format(PyExc_ImportError,
Victor Stinner27ee0892011-03-04 12:57:09 +0000891 "Loaded module %R not found in sys.modules",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 name);
893 return NULL;
894 }
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000899
900 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 remove_module(name);
902 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903}
904
905
Martin v. Löwis2db72862011-10-23 17:29:08 +0200906/* Like rightmost_sep, but operate on unicode objects. */
907static Py_ssize_t
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200908rightmost_sep_obj(PyObject* o, Py_ssize_t start, Py_ssize_t end)
Martin v. Löwis2db72862011-10-23 17:29:08 +0200909{
910 Py_ssize_t found, i;
911 Py_UCS4 c;
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200912 for (found = -1, i = start; i < end; i++) {
Martin v. Löwis2db72862011-10-23 17:29:08 +0200913 c = PyUnicode_READ_CHAR(o, i);
914 if (c == SEP
915#ifdef ALTSEP
916 || c == ALTSEP
917#endif
918 )
919 {
920 found = i;
921 }
922 }
923 return found;
924}
Victor Stinnerc9abda02011-03-14 13:33:46 -0400925
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926
Barry Warsaw28a691b2010-04-17 00:19:56 +0000927/* Given a pathname to a Python byte compiled file, return the path to the
928 source file, if the path matches the PEP 3147 format. This does not check
929 for any file existence, however, if the pyc file name does not match PEP
930 3147 style, NULL is returned. buf must be at least as big as pathname;
Victor Stinnerc9abda02011-03-14 13:33:46 -0400931 the resulting path will always be shorter.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932
Victor Stinnerc9abda02011-03-14 13:33:46 -0400933 (...)/__pycache__/foo.<tag>.pyc -> (...)/foo.py */
934
935static PyObject*
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200936make_source_pathname(PyObject *path)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000937{
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200938 Py_ssize_t left, right, dot0, dot1, len;
939 Py_ssize_t i, j;
940 PyObject *result;
941 int kind;
942 void *data;
Victor Stinnerc9abda02011-03-14 13:33:46 -0400943
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200944 len = PyUnicode_GET_LENGTH(path);
945 if (len > MAXPATHLEN)
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200946 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 /* Look back two slashes from the end. In between these two slashes
949 must be the string __pycache__ or this is not a PEP 3147 style
950 path. It's possible for there to be only one slash.
951 */
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200952 right = rightmost_sep_obj(path, 0, len);
953 if (right == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 return NULL;
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200955 left = rightmost_sep_obj(path, 0, right);
956 if (left == -1)
957 left = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 else
959 left++;
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200960 if (right-left != sizeof(CACHEDIR)-1)
961 return NULL;
962 for (i = 0; i < sizeof(CACHEDIR)-1; i++)
963 if (PyUnicode_READ_CHAR(path, left+i) != CACHEDIR[i])
964 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 /* Now verify that the path component to the right of the last slash
967 has two dots in it.
968 */
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200969 dot0 = PyUnicode_FindChar(path, '.', right+1, len, 1);
970 if (dot0 < 0)
971 return NULL;
972 dot1 = PyUnicode_FindChar(path, '.', dot0+1, len, 1);
973 if (dot1 < 0)
974 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 /* Too many dots? */
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200976 if (PyUnicode_FindChar(path, '.', dot1+1, len, 1) != -1)
977 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 /* This is a PEP 3147 path. Start by copying everything from the
980 start of pathname up to and including the leftmost slash. Then
981 copy the file's basename, removing the magic tag and adding a .py
982 suffix.
983 */
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200984 result = PyUnicode_New(left + (dot0-right) + 2,
985 PyUnicode_MAX_CHAR_VALUE(path));
986 if (!result)
987 return NULL;
988 kind = PyUnicode_KIND(result);
989 data = PyUnicode_DATA(result);
990 PyUnicode_CopyCharacters(result, 0, path, 0, (i = left));
991 PyUnicode_CopyCharacters(result, left, path, right+1,
992 (j = dot0-right));
993 PyUnicode_WRITE(kind, data, i+j, 'p');
994 PyUnicode_WRITE(kind, data, i+j+1, 'y');
Victor Stinner8f825062012-04-27 13:55:39 +0200995 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwis8a0ef782011-10-23 18:05:06 +0200996 return result;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000997}
998
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001000static void
1001update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 PyObject *constants, *tmp;
1004 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 if (PyUnicode_Compare(co->co_filename, oldname))
1007 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 tmp = co->co_filename;
1010 co->co_filename = newname;
1011 Py_INCREF(co->co_filename);
1012 Py_DECREF(tmp);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 constants = co->co_consts;
1015 n = PyTuple_GET_SIZE(constants);
1016 for (i = 0; i < n; i++) {
1017 tmp = PyTuple_GET_ITEM(constants, i);
1018 if (PyCode_Check(tmp))
1019 update_code_filenames((PyCodeObject *)tmp,
1020 oldname, newname);
1021 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001022}
1023
Victor Stinner2f42ae52011-03-20 00:41:24 +01001024static void
1025update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001026{
Victor Stinner2f42ae52011-03-20 00:41:24 +01001027 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001028
Victor Stinner2f42ae52011-03-20 00:41:24 +01001029 if (PyUnicode_Compare(co->co_filename, newname) == 0)
1030 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 oldname = co->co_filename;
1033 Py_INCREF(oldname);
1034 update_code_filenames(co, oldname, newname);
1035 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001036}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001037
Brett Cannon442c9b92011-03-23 16:14:42 -07001038static PyObject *
1039imp_fix_co_filename(PyObject *self, PyObject *args)
1040{
1041 PyObject *co;
1042 PyObject *file_path;
1043
1044 if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path))
1045 return NULL;
1046
1047 if (!PyCode_Check(co)) {
1048 PyErr_SetString(PyExc_TypeError,
1049 "first argument must be a code object");
1050 return NULL;
1051 }
1052
1053 if (!PyUnicode_Check(file_path)) {
1054 PyErr_SetString(PyExc_TypeError,
1055 "second argument must be a string");
1056 return NULL;
1057 }
1058
1059 update_compiled_module((PyCodeObject*)co, file_path);
1060
1061 Py_RETURN_NONE;
1062}
1063
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064
Christian Heimes3b06e532008-01-07 20:12:44 +00001065/* Get source file -> unicode or None
1066 * Returns the path to the py file if available, else the given path
1067 */
1068static PyObject *
Victor Stinnerc9abda02011-03-14 13:33:46 -04001069get_sourcefile(PyObject *filename)
Christian Heimes3b06e532008-01-07 20:12:44 +00001070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 Py_ssize_t len;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001072 Py_UCS4 *fileuni;
Victor Stinnerc9abda02011-03-14 13:33:46 -04001073 PyObject *py;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 struct stat statbuf;
Victor Stinnerbd0850b2011-12-18 20:47:30 +01001075 int err;
Christian Heimes3b06e532008-01-07 20:12:44 +00001076
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001077 len = PyUnicode_GET_LENGTH(filename);
Victor Stinnerc9abda02011-03-14 13:33:46 -04001078 if (len == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 Py_RETURN_NONE;
Christian Heimes3b06e532008-01-07 20:12:44 +00001080
Victor Stinnerc9abda02011-03-14 13:33:46 -04001081 /* don't match *.pyc or *.pyo? */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001082 fileuni = PyUnicode_AsUCS4Copy(filename);
1083 if (!fileuni)
1084 return NULL;
Victor Stinnerc9abda02011-03-14 13:33:46 -04001085 if (len < 5
1086 || fileuni[len-4] != '.'
1087 || (fileuni[len-3] != 'p' && fileuni[len-3] != 'P')
1088 || (fileuni[len-2] != 'y' && fileuni[len-2] != 'Y'))
1089 goto unchanged;
Christian Heimes3b06e532008-01-07 20:12:44 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 /* Start by trying to turn PEP 3147 path into source path. If that
1092 * fails, just chop off the trailing character, i.e. legacy pyc path
1093 * to py.
1094 */
Victor Stinnerc9abda02011-03-14 13:33:46 -04001095 py = make_source_pathname(filename);
1096 if (py == NULL) {
1097 PyErr_Clear();
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001098 py = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, fileuni, len - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 }
Victor Stinnerc9abda02011-03-14 13:33:46 -04001100 if (py == NULL)
1101 goto error;
Barry Warsaw28a691b2010-04-17 00:19:56 +00001102
Victor Stinnerbd0850b2011-12-18 20:47:30 +01001103 err = _Py_stat(py, &statbuf);
1104 if (err == -2)
1105 goto error;
1106 if (err == 0 && S_ISREG(statbuf.st_mode)) {
Martin v. Löwis0b1d3482011-10-01 16:35:40 +02001107 PyMem_Free(fileuni);
Victor Stinnerc9abda02011-03-14 13:33:46 -04001108 return py;
Martin v. Löwis0b1d3482011-10-01 16:35:40 +02001109 }
Victor Stinnerc9abda02011-03-14 13:33:46 -04001110 Py_DECREF(py);
1111 goto unchanged;
1112
1113error:
1114 PyErr_Clear();
1115unchanged:
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001116 PyMem_Free(fileuni);
Victor Stinnerc9abda02011-03-14 13:33:46 -04001117 Py_INCREF(filename);
1118 return filename;
Christian Heimes3b06e532008-01-07 20:12:44 +00001119}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001120
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001121/* Forward */
Victor Stinner53dc7352011-03-20 01:50:21 +01001122static struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001123
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001124
1125/* Helper to test for built-in module */
1126
1127static int
Victor Stinner95872862011-03-07 18:20:56 +01001128is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001129{
Victor Stinner95872862011-03-07 18:20:56 +01001130 int i, cmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Victor Stinner95872862011-03-07 18:20:56 +01001132 cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name);
1133 if (cmp == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 if (PyImport_Inittab[i].initfunc == NULL)
1135 return -1;
1136 else
1137 return 1;
1138 }
1139 }
1140 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001141}
1142
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001143
Just van Rossum52e14d62002-12-30 22:08:05 +00001144/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1145 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001146 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001147 that can handle the path item. Return None if no hook could;
1148 this tells our caller it should fall back to the builtin
1149 import mechanism. Cache the result in path_importer_cache.
1150 Returns a borrowed reference. */
1151
1152static PyObject *
1153get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 PyObject *importer;
1157 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 /* These conditions are the caller's responsibility: */
1160 assert(PyList_Check(path_hooks));
1161 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 nhooks = PyList_Size(path_hooks);
1164 if (nhooks < 0)
1165 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 importer = PyDict_GetItem(path_importer_cache, p);
1168 if (importer != NULL)
1169 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 /* set path_importer_cache[p] to None to avoid recursion */
1172 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1173 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 for (j = 0; j < nhooks; j++) {
1176 PyObject *hook = PyList_GetItem(path_hooks, j);
1177 if (hook == NULL)
1178 return NULL;
1179 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
1180 if (importer != NULL)
1181 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1184 return NULL;
1185 }
1186 PyErr_Clear();
1187 }
1188 if (importer == NULL) {
1189 importer = PyObject_CallFunctionObjArgs(
1190 (PyObject *)&PyNullImporter_Type, p, NULL
1191 );
1192 if (importer == NULL) {
1193 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1194 PyErr_Clear();
1195 return Py_None;
1196 }
1197 }
1198 }
1199 if (importer != NULL) {
1200 int err = PyDict_SetItem(path_importer_cache, p, importer);
1201 Py_DECREF(importer);
1202 if (err != 0)
1203 return NULL;
1204 }
1205 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001206}
1207
Christian Heimes9cd17752007-11-18 19:35:23 +00001208PyAPI_FUNC(PyObject *)
1209PyImport_GetImporter(PyObject *path) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1213 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1214 importer = get_path_importer(path_importer_cache,
1215 path_hooks, path);
1216 }
1217 }
1218 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1219 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001220}
1221
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001223#ifdef MS_COREDLL
Victor Stinner4d6c1c42011-03-08 23:49:04 +01001224extern FILE *_PyWin_FindRegisteredModule(PyObject *, struct filedescr **,
1225 PyObject **p_path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001226#endif
1227
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228
Victor Stinner95872862011-03-07 18:20:56 +01001229static int init_builtin(PyObject *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001230
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001232 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001234
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001235static int
Victor Stinner95872862011-03-07 18:20:56 +01001236init_builtin(PyObject *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001239
Victor Stinner95872862011-03-07 18:20:56 +01001240 if (_PyImport_FindExtensionObject(name, name) != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 return 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 for (p = PyImport_Inittab; p->name != NULL; p++) {
1244 PyObject *mod;
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001245 PyModuleDef *def;
Victor Stinner95872862011-03-07 18:20:56 +01001246 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 if (p->initfunc == NULL) {
1248 PyErr_Format(PyExc_ImportError,
Victor Stinner95872862011-03-07 18:20:56 +01001249 "Cannot re-init internal module %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 name);
1251 return -1;
1252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 mod = (*p->initfunc)();
1254 if (mod == 0)
1255 return -1;
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001256 /* Remember pointer to module init function. */
1257 def = PyModule_GetDef(mod);
1258 def->m_base.m_init = p->initfunc;
Victor Stinner95872862011-03-07 18:20:56 +01001259 if (_PyImport_FixupExtensionObject(mod, name, name) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 return -1;
1261 /* FixupExtension has put the module into sys.modules,
1262 so we can release our own reference. */
1263 Py_DECREF(mod);
1264 return 1;
1265 }
1266 }
1267 return 0;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001268}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001269
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001271/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001273static struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001274find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001277
Victor Stinner53dc7352011-03-20 01:50:21 +01001278 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 for (p = PyImport_FrozenModules; ; p++) {
1282 if (p->name == NULL)
1283 return NULL;
Victor Stinner53dc7352011-03-20 01:50:21 +01001284 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 break;
1286 }
1287 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001288}
1289
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001291get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 struct _frozen *p = find_frozen(name);
1294 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 if (p == NULL) {
1297 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001298 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 name);
1300 return NULL;
1301 }
1302 if (p->code == NULL) {
1303 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001304 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 name);
1306 return NULL;
1307 }
1308 size = p->size;
1309 if (size < 0)
1310 size = -size;
1311 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001312}
1313
Brett Cannon8d110132009-03-15 02:20:16 +00001314static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001315is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 struct _frozen *p = find_frozen(name);
1318 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 if (p == NULL) {
1321 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001322 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 name);
1324 return NULL;
1325 }
Brett Cannon8d110132009-03-15 02:20:16 +00001326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 if (size < 0)
1330 Py_RETURN_TRUE;
1331 else
1332 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001333}
1334
1335
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001336/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001337 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001338 an exception set if the initialization failed.
1339 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001340
1341int
Victor Stinner53dc7352011-03-20 01:50:21 +01001342PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001343{
Victor Stinner53dc7352011-03-20 01:50:21 +01001344 struct _frozen *p;
1345 PyObject *co, *m, *path;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 int ispackage;
1347 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001348
Victor Stinner53dc7352011-03-20 01:50:21 +01001349 p = find_frozen(name);
1350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 if (p == NULL)
1352 return 0;
1353 if (p->code == NULL) {
1354 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001355 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 name);
1357 return -1;
1358 }
1359 size = p->size;
1360 ispackage = (size < 0);
1361 if (ispackage)
1362 size = -size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
1364 if (co == NULL)
1365 return -1;
1366 if (!PyCode_Check(co)) {
1367 PyErr_Format(PyExc_TypeError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001368 "frozen object %R is not a code object",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 name);
1370 goto err_return;
1371 }
1372 if (ispackage) {
1373 /* Set __path__ to the package name */
Victor Stinner53dc7352011-03-20 01:50:21 +01001374 PyObject *d, *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 int err;
Victor Stinner53dc7352011-03-20 01:50:21 +01001376 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 if (m == NULL)
1378 goto err_return;
1379 d = PyModule_GetDict(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 l = PyList_New(1);
1381 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 goto err_return;
1383 }
Victor Stinner53dc7352011-03-20 01:50:21 +01001384 Py_INCREF(name);
1385 PyList_SET_ITEM(l, 0, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 err = PyDict_SetItemString(d, "__path__", l);
1387 Py_DECREF(l);
1388 if (err != 0)
1389 goto err_return;
1390 }
Victor Stinner53dc7352011-03-20 01:50:21 +01001391 path = PyUnicode_FromString("<frozen>");
1392 if (path == NULL)
1393 goto err_return;
1394 m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
1395 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 if (m == NULL)
1397 goto err_return;
1398 Py_DECREF(co);
1399 Py_DECREF(m);
1400 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001401err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 Py_DECREF(co);
1403 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001404}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001405
Victor Stinner53dc7352011-03-20 01:50:21 +01001406int
1407PyImport_ImportFrozenModule(char *name)
1408{
1409 PyObject *nameobj;
1410 int ret;
1411 nameobj = PyUnicode_InternFromString(name);
1412 if (nameobj == NULL)
1413 return -1;
1414 ret = PyImport_ImportFrozenModuleObject(nameobj);
1415 Py_DECREF(nameobj);
1416 return ret;
1417}
1418
Guido van Rossum74e6a111994-08-29 12:54:38 +00001419
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001420/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001421 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001422
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001424PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 PyObject *pname;
1427 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 pname = PyUnicode_FromString(name);
1430 if (pname == NULL)
1431 return NULL;
1432 result = PyImport_Import(pname);
1433 Py_DECREF(pname);
1434 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001435}
1436
Christian Heimes072c0f12008-01-03 23:01:04 +00001437/* Import a module without blocking
1438 *
1439 * At first it tries to fetch the module from sys.modules. If the module was
1440 * never loaded before it loads it with PyImport_ImportModule() unless another
1441 * thread holds the import lock. In the latter case the function raises an
1442 * ImportError instead of blocking.
1443 *
1444 * Returns the module object with incremented ref count.
1445 */
1446PyObject *
1447PyImport_ImportModuleNoBlock(const char *name)
1448{
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001449 PyObject *nameobj, *modules, *result;
Victor Stinner0af03062011-09-02 00:11:43 +02001450#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 long me;
Victor Stinner0af03062011-09-02 00:11:43 +02001452#endif
Christian Heimes072c0f12008-01-03 23:01:04 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 /* Try to get the module from sys.modules[name] */
1455 modules = PyImport_GetModuleDict();
1456 if (modules == NULL)
1457 return NULL;
Christian Heimes072c0f12008-01-03 23:01:04 +00001458
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001459 nameobj = PyUnicode_FromString(name);
1460 if (nameobj == NULL)
1461 return NULL;
1462 result = PyDict_GetItem(modules, nameobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 if (result != NULL) {
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001464 Py_DECREF(nameobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 Py_INCREF(result);
1466 return result;
1467 }
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001468 PyErr_Clear();
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00001469#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 /* check the import lock
1471 * me might be -1 but I ignore the error here, the lock function
1472 * takes care of the problem */
1473 me = PyThread_get_thread_ident();
1474 if (import_lock_thread == -1 || import_lock_thread == me) {
1475 /* no thread or me is holding the lock */
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001476 result = PyImport_Import(nameobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 }
1478 else {
1479 PyErr_Format(PyExc_ImportError,
Victor Stinnerc24c8102011-03-13 22:38:06 -04001480 "Failed to import %R because the import lock"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 "is held by another thread.",
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001482 nameobj);
1483 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00001485#else
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001486 result = PyImport_Import(nameobj);
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00001487#endif
Victor Stinner2e5f11a2011-03-13 21:57:27 -04001488 Py_DECREF(nameobj);
1489 return result;
Christian Heimes072c0f12008-01-03 23:01:04 +00001490}
1491
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001492
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001493PyObject *
Brett Cannonfd074152012-04-14 14:10:13 -04001494PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
1495 PyObject *locals, PyObject *given_fromlist,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001496 int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001497{
Brett Cannonfd074152012-04-14 14:10:13 -04001498 _Py_IDENTIFIER(__import__);
1499 _Py_IDENTIFIER(__package__);
1500 _Py_IDENTIFIER(__path__);
1501 _Py_IDENTIFIER(__name__);
1502 _Py_IDENTIFIER(_find_and_load);
1503 _Py_IDENTIFIER(_handle_fromlist);
1504 _Py_static_string(single_dot, ".");
1505 PyObject *abs_name = NULL;
1506 PyObject *builtins_import = NULL;
1507 PyObject *final_mod = NULL;
1508 PyObject *mod = NULL;
1509 PyObject *package = NULL;
1510 PyObject *globals = NULL;
1511 PyObject *fromlist = NULL;
1512 PyInterpreterState *interp = PyThreadState_GET()->interp;
1513
1514 /* Make sure to use default values so as to not have
1515 PyObject_CallMethodObjArgs() truncate the parameter list because of a
1516 NULL argument. */
1517 if (given_globals == NULL) {
1518 globals = PyDict_New();
1519 if (globals == NULL) {
1520 goto error;
1521 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 }
Brett Cannonfd074152012-04-14 14:10:13 -04001523 else {
1524 /* Only have to care what given_globals is if it will be used
1525 fortsomething. */
1526 if (level > 0 && !PyDict_Check(given_globals)) {
1527 PyErr_SetString(PyExc_TypeError, "globals must be a dict");
1528 goto error;
1529 }
1530 globals = given_globals;
1531 Py_INCREF(globals);
1532 }
1533
1534 if (given_fromlist == NULL) {
1535 fromlist = PyList_New(0);
1536 if (fromlist == NULL) {
1537 goto error;
1538 }
1539 }
1540 else {
1541 fromlist = given_fromlist;
1542 Py_INCREF(fromlist);
1543 }
1544 if (name == NULL) {
1545 PyErr_SetString(PyExc_ValueError, "Empty module name");
1546 goto error;
1547 }
1548
1549 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1550 for added performance. */
1551
1552 if (!PyUnicode_Check(name)) {
1553 PyErr_SetString(PyExc_TypeError, "module name must be a string");
1554 goto error;
1555 }
1556 else if (PyUnicode_READY(name) < 0) {
1557 goto error;
1558 }
1559 if (level < 0) {
1560 PyErr_SetString(PyExc_ValueError, "level must be >= 0");
1561 goto error;
1562 }
1563 else if (level > 0) {
1564 package = _PyDict_GetItemId(globals, &PyId___package__);
1565 if (package != NULL && package != Py_None) {
1566 Py_INCREF(package);
1567 if (!PyUnicode_Check(package)) {
1568 PyErr_SetString(PyExc_TypeError, "package must be a string");
1569 goto error;
1570 }
1571 }
1572 else {
Brett Cannon273323c2012-04-17 19:05:11 -04001573 package = _PyDict_GetItemId(globals, &PyId___name__);
Brett Cannonfd074152012-04-14 14:10:13 -04001574 if (package == NULL) {
Brett Cannon273323c2012-04-17 19:05:11 -04001575 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
Brett Cannonfd074152012-04-14 14:10:13 -04001576 goto error;
1577 }
1578 else if (!PyUnicode_Check(package)) {
1579 PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
1580 }
1581 Py_INCREF(package);
1582
1583 if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) {
Brett Cannon740fce02012-04-14 14:23:49 -04001584 PyObject *partition = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001585 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
1586 if (borrowed_dot == NULL) {
1587 goto error;
1588 }
Brett Cannon740fce02012-04-14 14:23:49 -04001589 partition = PyUnicode_RPartition(package, borrowed_dot);
Brett Cannonfd074152012-04-14 14:10:13 -04001590 Py_DECREF(package);
1591 if (partition == NULL) {
1592 goto error;
1593 }
1594 package = PyTuple_GET_ITEM(partition, 0);
1595 Py_INCREF(package);
1596 Py_DECREF(partition);
1597 }
1598 }
1599
1600 if (PyDict_GetItem(interp->modules, package) == NULL) {
1601 PyErr_Format(PyExc_SystemError,
1602 "Parent module %R not loaded, cannot perform relative "
1603 "import", package);
1604 goto error;
1605 }
1606 }
1607 else { /* level == 0 */
1608 if (PyUnicode_GET_LENGTH(name) == 0) {
1609 PyErr_SetString(PyExc_ValueError, "Empty module name");
1610 goto error;
1611 }
1612 package = Py_None;
1613 Py_INCREF(package);
1614 }
1615
1616 if (level > 0) {
1617 Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package);
1618 PyObject *base = NULL;
1619 int level_up = 1;
1620
1621 for (level_up = 1; level_up < level; level_up += 1) {
1622 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1623 if (last_dot == -2) {
1624 goto error;
1625 }
1626 else if (last_dot == -1) {
1627 PyErr_SetString(PyExc_ValueError,
1628 "attempted relative import beyond top-level "
1629 "package");
1630 goto error;
1631 }
1632 }
1633 base = PyUnicode_Substring(package, 0, last_dot);
1634 if (PyUnicode_GET_LENGTH(name) > 0) {
Antoine Pitrou538ba2a2012-04-16 21:52:45 +02001635 PyObject *borrowed_dot, *seq = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001636
1637 borrowed_dot = _PyUnicode_FromId(&single_dot);
Antoine Pitrou538ba2a2012-04-16 21:52:45 +02001638 seq = PyTuple_Pack(2, base, name);
1639 Py_DECREF(base);
Brett Cannonfd074152012-04-14 14:10:13 -04001640 if (borrowed_dot == NULL || seq == NULL) {
1641 goto error;
1642 }
1643
1644 abs_name = PyUnicode_Join(borrowed_dot, seq);
1645 Py_DECREF(seq);
1646 if (abs_name == NULL) {
1647 goto error;
1648 }
1649 }
1650 else {
1651 abs_name = base;
1652 }
1653 }
1654 else {
1655 abs_name = name;
1656 Py_INCREF(abs_name);
1657 }
1658
Brian Curtine6b299f2012-04-14 14:19:33 -05001659#ifdef WITH_THREAD
Brett Cannonfd074152012-04-14 14:10:13 -04001660 _PyImport_AcquireLock();
1661#endif
1662 /* From this point forward, goto error_with_unlock! */
1663 if (PyDict_Check(globals)) {
1664 builtins_import = _PyDict_GetItemId(globals, &PyId___import__);
1665 }
1666 if (builtins_import == NULL) {
1667 builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__);
1668 if (builtins_import == NULL) {
1669 Py_FatalError("__import__ missing");
1670 }
1671 }
1672 Py_INCREF(builtins_import);
1673
1674 mod = PyDict_GetItem(interp->modules, abs_name);
1675 if (mod == Py_None) {
Brett Cannon27fc5282012-04-15 14:15:31 -04001676 PyObject *msg = PyUnicode_FromFormat("import of %R halted; "
1677 "None in sys.modules", abs_name);
1678 if (msg != NULL) {
Brian Curtin09b86d12012-04-17 16:57:09 -05001679 PyErr_SetImportError(msg, abs_name, NULL);
1680 Py_DECREF(msg);
Brett Cannon27fc5282012-04-15 14:15:31 -04001681 }
Antoine Pitrou71382cb2012-04-16 18:48:49 +02001682 mod = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001683 goto error_with_unlock;
1684 }
1685 else if (mod != NULL) {
1686 Py_INCREF(mod);
1687 }
1688 else {
1689 mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
1690 &PyId__find_and_load, abs_name,
1691 builtins_import, NULL);
1692 if (mod == NULL) {
1693 goto error_with_unlock;
1694 }
1695 }
1696
1697 if (PyObject_Not(fromlist)) {
1698 if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) {
1699 PyObject *front = NULL;
Brian Curtine6b299f2012-04-14 14:19:33 -05001700 PyObject *partition = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001701 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
1702
1703 if (borrowed_dot == NULL) {
1704 goto error_with_unlock;
1705 }
1706
Brian Curtine6b299f2012-04-14 14:19:33 -05001707 partition = PyUnicode_Partition(name, borrowed_dot);
Brett Cannonfd074152012-04-14 14:10:13 -04001708 if (partition == NULL) {
1709 goto error_with_unlock;
1710 }
1711
1712 front = PyTuple_GET_ITEM(partition, 0);
1713 Py_INCREF(front);
1714 Py_DECREF(partition);
1715
1716 if (level == 0) {
Benjamin Petersond76bc7a2012-04-18 10:55:43 -04001717 final_mod = PyDict_GetItem(interp->modules, front);
Brett Cannon881535b2012-04-15 15:24:04 -04001718 Py_DECREF(front);
1719 if (final_mod == NULL) {
Benjamin Petersond76bc7a2012-04-18 10:55:43 -04001720 PyErr_Format(PyExc_KeyError,
1721 "%R not in sys.modules as expected", front);
Brett Cannon881535b2012-04-15 15:24:04 -04001722 }
Benjamin Petersond76bc7a2012-04-18 10:55:43 -04001723 else {
1724 Py_INCREF(final_mod);
1725 }
Brett Cannonfd074152012-04-14 14:10:13 -04001726 }
1727 else {
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001728 Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) -
1729 PyUnicode_GET_LENGTH(front);
1730 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001731 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001732 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001733 Py_DECREF(front);
1734 if (to_return == NULL) {
1735 goto error_with_unlock;
1736 }
Brett Cannonfd074152012-04-14 14:10:13 -04001737
1738 final_mod = PyDict_GetItem(interp->modules, to_return);
Brett Cannonfd074152012-04-14 14:10:13 -04001739 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001740 if (final_mod == NULL) {
1741 PyErr_Format(PyExc_KeyError,
1742 "%R not in sys.modules as expected",
1743 to_return);
1744 }
1745 else {
1746 Py_INCREF(final_mod);
1747 }
Brett Cannonfd074152012-04-14 14:10:13 -04001748 }
1749 }
1750 else {
1751 final_mod = mod;
1752 Py_INCREF(mod);
1753 }
1754 }
1755 else {
1756 final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
1757 &PyId__handle_fromlist, mod,
1758 fromlist, builtins_import,
1759 NULL);
1760 }
1761 error_with_unlock:
Brian Curtine6b299f2012-04-14 14:19:33 -05001762#ifdef WITH_THREAD
Brett Cannonfd074152012-04-14 14:10:13 -04001763 if (_PyImport_ReleaseLock() < 0) {
1764 PyErr_SetString(PyExc_RuntimeError, "not holding the import lock");
1765 }
1766#endif
1767 error:
1768 Py_XDECREF(abs_name);
1769 Py_XDECREF(builtins_import);
1770 Py_XDECREF(mod);
1771 Py_XDECREF(package);
1772 Py_XDECREF(globals);
1773 Py_XDECREF(fromlist);
1774 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001775}
1776
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001777PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001778PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001779 PyObject *fromlist, int level)
1780{
1781 PyObject *nameobj, *mod;
1782 nameobj = PyUnicode_FromString(name);
1783 if (nameobj == NULL)
1784 return NULL;
1785 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1786 fromlist, level);
1787 Py_DECREF(nameobj);
1788 return mod;
1789}
1790
1791
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792/* Re-import a module of any kind and return its module object, WITH
1793 INCREMENTED REFERENCE COUNT */
1794
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001796PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 PyInterpreterState *interp = PyThreadState_Get()->interp;
1799 PyObject *modules_reloading = interp->modules_reloading;
1800 PyObject *modules = PyImport_GetModuleDict();
Brett Cannon8a1d04c2012-04-15 17:56:09 -04001801 PyObject *loader = NULL, *existing_m = NULL;
1802 PyObject *name;
Martin v. Löwis796ea532011-10-30 09:07:07 +01001803 Py_ssize_t subname_start;
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001804 PyObject *newm = NULL;
Brett Cannon8a1d04c2012-04-15 17:56:09 -04001805 _Py_IDENTIFIER(__loader__);
1806 _Py_IDENTIFIER(load_module);
Brett Cannon9a5b25a2010-03-01 02:09:17 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 if (modules_reloading == NULL) {
1809 Py_FatalError("PyImport_ReloadModule: "
1810 "no modules_reloading dictionary!");
1811 return NULL;
1812 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (m == NULL || !PyModule_Check(m)) {
1815 PyErr_SetString(PyExc_TypeError,
1816 "reload() argument must be module");
1817 return NULL;
1818 }
Martin v. Löwis796ea532011-10-30 09:07:07 +01001819 name = PyModule_GetNameObject(m);
1820 if (name == NULL || PyUnicode_READY(name) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 return NULL;
Martin v. Löwis796ea532011-10-30 09:07:07 +01001822 if (m != PyDict_GetItem(modules, name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 PyErr_Format(PyExc_ImportError,
Victor Stinner98dbba52011-03-14 15:15:47 -04001824 "reload(): module %R not in sys.modules",
Martin v. Löwis796ea532011-10-30 09:07:07 +01001825 name);
1826 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return NULL;
1828 }
Martin v. Löwis796ea532011-10-30 09:07:07 +01001829 existing_m = PyDict_GetItem(modules_reloading, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 if (existing_m != NULL) {
1831 /* Due to a recursive reload, this module is already
1832 being reloaded. */
Martin v. Löwis796ea532011-10-30 09:07:07 +01001833 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 Py_INCREF(existing_m);
1835 return existing_m;
1836 }
Martin v. Löwis796ea532011-10-30 09:07:07 +01001837 if (PyDict_SetItem(modules_reloading, name, m) < 0) {
1838 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return NULL;
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001840 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001841
Martin v. Löwis796ea532011-10-30 09:07:07 +01001842 subname_start = PyUnicode_FindChar(name, '.', 0,
1843 PyUnicode_GET_LENGTH(name), -1);
Brett Cannon8a1d04c2012-04-15 17:56:09 -04001844 if (subname_start != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 PyObject *parentname, *parent;
Martin v. Löwis796ea532011-10-30 09:07:07 +01001846 parentname = PyUnicode_Substring(name, 0, subname_start);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 if (parentname == NULL) {
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001848 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
1850 parent = PyDict_GetItem(modules, parentname);
Brett Cannon8a1d04c2012-04-15 17:56:09 -04001851 Py_XDECREF(parent);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 if (parent == NULL) {
1853 PyErr_Format(PyExc_ImportError,
Victor Stinner98dbba52011-03-14 15:15:47 -04001854 "reload(): parent %R not in sys.modules",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 parentname);
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001856 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 }
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00001859
Brett Cannon8a1d04c2012-04-15 17:56:09 -04001860 loader = _PyObject_GetAttrId(m, &PyId___loader__);
1861 if (loader == NULL) {
1862 goto error;
1863 }
1864 newm = _PyObject_CallMethodId(loader, &PyId_load_module, "O", name);
1865 Py_DECREF(loader);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (newm == NULL) {
1867 /* load_module probably removed name from modules because of
1868 * the error. Put back the original module object. We're
1869 * going to return NULL in this case regardless of whether
1870 * replacing name succeeds, so the return value is ignored.
1871 */
Martin v. Löwis796ea532011-10-30 09:07:07 +01001872 PyDict_SetItem(modules, name, m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001874
1875error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 imp_modules_reloading_clear();
Martin v. Löwis796ea532011-10-30 09:07:07 +01001877 Py_DECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001879}
1880
1881
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001882/* Higher-level import emulator which emulates the "import" statement
1883 more accurately -- it invokes the __import__() function from the
1884 builtins of the current globals. This means that the import is
1885 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001886 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001887 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001888 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001889 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001890
1891PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001892PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 static PyObject *silly_list = NULL;
1895 static PyObject *builtins_str = NULL;
1896 static PyObject *import_str = NULL;
1897 PyObject *globals = NULL;
1898 PyObject *import = NULL;
1899 PyObject *builtins = NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001900 PyObject *modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 /* Initialize constant string objects */
1904 if (silly_list == NULL) {
1905 import_str = PyUnicode_InternFromString("__import__");
1906 if (import_str == NULL)
1907 return NULL;
1908 builtins_str = PyUnicode_InternFromString("__builtins__");
1909 if (builtins_str == NULL)
1910 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001911 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 if (silly_list == NULL)
1913 return NULL;
1914 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 /* Get the builtins from current globals */
1917 globals = PyEval_GetGlobals();
1918 if (globals != NULL) {
1919 Py_INCREF(globals);
1920 builtins = PyObject_GetItem(globals, builtins_str);
1921 if (builtins == NULL)
1922 goto err;
1923 }
1924 else {
1925 /* No globals -- use standard builtins, and fake globals */
1926 builtins = PyImport_ImportModuleLevel("builtins",
1927 NULL, NULL, NULL, 0);
1928 if (builtins == NULL)
1929 return NULL;
1930 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1931 if (globals == NULL)
1932 goto err;
1933 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 /* Get the __import__ function from the builtins */
1936 if (PyDict_Check(builtins)) {
1937 import = PyObject_GetItem(builtins, import_str);
1938 if (import == NULL)
1939 PyErr_SetObject(PyExc_KeyError, import_str);
1940 }
1941 else
1942 import = PyObject_GetAttr(builtins, import_str);
1943 if (import == NULL)
1944 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001947 Always use absolute import here.
1948 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1950 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001951 if (r == NULL)
1952 goto err;
1953 Py_DECREF(r);
1954
1955 modules = PyImport_GetModuleDict();
1956 r = PyDict_GetItem(modules, module_name);
1957 if (r != NULL)
1958 Py_INCREF(r);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001959
1960 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 Py_XDECREF(globals);
1962 Py_XDECREF(builtins);
1963 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001966}
1967
1968
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969/* Module 'imp' provides Python access to the primitives used for
1970 importing modules.
1971*/
1972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973static PyObject *
Barry Warsaw28a691b2010-04-17 00:19:56 +00001974imp_make_magic(long magic)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 char buf[4];
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 buf[0] = (char) ((magic >> 0) & 0xff);
1979 buf[1] = (char) ((magic >> 8) & 0xff);
1980 buf[2] = (char) ((magic >> 16) & 0xff);
1981 buf[3] = (char) ((magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 return PyBytes_FromStringAndSize(buf, 4);
Victor Stinner3e2b7172010-11-09 09:32:19 +00001984}
Barry Warsaw28a691b2010-04-17 00:19:56 +00001985
1986static PyObject *
1987imp_get_magic(PyObject *self, PyObject *noargs)
1988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 return imp_make_magic(pyc_magic);
Barry Warsaw28a691b2010-04-17 00:19:56 +00001990}
1991
1992static PyObject *
1993imp_get_tag(PyObject *self, PyObject *noargs)
1994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 return PyUnicode_FromString(pyc_tag);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001996}
1997
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00001999imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 PyObject *list;
2002 struct filedescr *fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 list = PyList_New(0);
2005 if (list == NULL)
2006 return NULL;
2007 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2008 PyObject *item = Py_BuildValue("ssi",
2009 fdp->suffix, fdp->mode, fdp->type);
2010 if (item == NULL) {
2011 Py_DECREF(list);
2012 return NULL;
2013 }
2014 if (PyList_Append(list, item) < 0) {
2015 Py_DECREF(list);
2016 Py_DECREF(item);
2017 return NULL;
2018 }
2019 Py_DECREF(item);
2020 }
2021 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002022}
2023
Guido van Rossum79f25d91997-04-29 20:08:16 +00002024static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002025imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026{
Victor Stinner95872862011-03-07 18:20:56 +01002027 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 int ret;
2029 PyObject *m;
Victor Stinner95872862011-03-07 18:20:56 +01002030 if (!PyArg_ParseTuple(args, "U:init_builtin", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 return NULL;
2032 ret = init_builtin(name);
2033 if (ret < 0)
2034 return NULL;
2035 if (ret == 0) {
2036 Py_INCREF(Py_None);
2037 return Py_None;
2038 }
Victor Stinner95872862011-03-07 18:20:56 +01002039 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 Py_XINCREF(m);
2041 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002042}
2043
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046{
Victor Stinner53dc7352011-03-20 01:50:21 +01002047 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 int ret;
2049 PyObject *m;
Victor Stinner53dc7352011-03-20 01:50:21 +01002050 if (!PyArg_ParseTuple(args, "U:init_frozen", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 return NULL;
Victor Stinner53dc7352011-03-20 01:50:21 +01002052 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (ret < 0)
2054 return NULL;
2055 if (ret == 0) {
2056 Py_INCREF(Py_None);
2057 return Py_None;
2058 }
Victor Stinner53dc7352011-03-20 01:50:21 +01002059 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 Py_XINCREF(m);
2061 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002062}
2063
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002065imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002066{
Victor Stinner53dc7352011-03-20 01:50:21 +01002067 PyObject *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002068
Victor Stinner53dc7352011-03-20 01:50:21 +01002069 if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 return NULL;
2071 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002072}
2073
Guido van Rossum79f25d91997-04-29 20:08:16 +00002074static PyObject *
Brett Cannon8d110132009-03-15 02:20:16 +00002075imp_is_frozen_package(PyObject *self, PyObject *args)
2076{
Victor Stinner53dc7352011-03-20 01:50:21 +01002077 PyObject *name;
Brett Cannon8d110132009-03-15 02:20:16 +00002078
Victor Stinner53dc7352011-03-20 01:50:21 +01002079 if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 return NULL;
2081 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002082}
2083
2084static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002085imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002086{
Victor Stinner95872862011-03-07 18:20:56 +01002087 PyObject *name;
2088 if (!PyArg_ParseTuple(args, "U:is_builtin", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 return NULL;
2090 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091}
2092
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095{
Victor Stinner53dc7352011-03-20 01:50:21 +01002096 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 struct _frozen *p;
Victor Stinner53dc7352011-03-20 01:50:21 +01002098 if (!PyArg_ParseTuple(args, "U:is_frozen", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 return NULL;
2100 p = find_frozen(name);
2101 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002102}
2103
2104static FILE *
Victor Stinner2f42ae52011-03-20 00:41:24 +01002105get_file(PyObject *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 FILE *fp;
2108 if (mode[0] == 'U')
2109 mode = "r" PY_STDIOTEXTMODE;
2110 if (fob == NULL) {
Victor Stinner2f42ae52011-03-20 00:41:24 +01002111 fp = _Py_fopen(pathname, mode);
Victor Stinner35734762011-12-18 21:05:22 +01002112 if (!fp) {
2113 if (!PyErr_Occurred())
2114 PyErr_SetFromErrno(PyExc_IOError);
2115 return NULL;
2116 }
2117 return fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 }
2119 else {
2120 int fd = PyObject_AsFileDescriptor(fob);
2121 if (fd == -1)
2122 return NULL;
Victor Stinner35734762011-12-18 21:05:22 +01002123 if (!_PyVerify_fd(fd)) {
2124 PyErr_SetFromErrno(PyExc_IOError);
2125 return NULL;
2126 }
2127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 /* the FILE struct gets a new fd, so that it can be closed
2129 * independently of the file descriptor given
2130 */
2131 fd = dup(fd);
Victor Stinner35734762011-12-18 21:05:22 +01002132 if (fd == -1) {
2133 PyErr_SetFromErrno(PyExc_IOError);
2134 return NULL;
2135 }
2136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 fp = fdopen(fd, mode);
Victor Stinner35734762011-12-18 21:05:22 +01002138 if (!fp) {
2139 PyErr_SetFromErrno(PyExc_IOError);
2140 return NULL;
2141 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 return fp;
Victor Stinner35734762011-12-18 21:05:22 +01002143 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144}
2145
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002146#ifdef HAVE_DYNAMIC_LOADING
2147
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002149imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002150{
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002151 PyObject *name, *pathname, *fob = NULL, *mod;
2152 FILE *fp;
2153
2154 if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic",
2155 &name, PyUnicode_FSDecoder, &pathname, &fob))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 return NULL;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002157 if (fob != NULL) {
2158 fp = get_file(NULL, fob, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002159 if (fp == NULL) {
2160 Py_DECREF(pathname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002162 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002164 else
2165 fp = NULL;
2166 mod = _PyImport_LoadDynamicModule(name, pathname, fp);
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002167 Py_DECREF(pathname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 if (fp)
2169 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002170 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002171}
2172
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002173#endif /* HAVE_DYNAMIC_LOADING */
2174
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175static PyObject *
Christian Heimes13a7a212008-01-07 17:13:09 +00002176imp_reload(PyObject *self, PyObject *v)
2177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 return PyImport_ReloadModule(v);
Christian Heimes13a7a212008-01-07 17:13:09 +00002179}
2180
2181PyDoc_STRVAR(doc_reload,
2182"reload(module) -> module\n\
2183\n\
2184Reload the module. The module must have been successfully imported before.");
2185
Barry Warsaw28a691b2010-04-17 00:19:56 +00002186
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002187/* Doc strings */
2188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002190"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192PyDoc_STRVAR(doc_get_magic,
2193"get_magic() -> string\n\
2194Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002195
Barry Warsaw28a691b2010-04-17 00:19:56 +00002196PyDoc_STRVAR(doc_get_tag,
2197"get_tag() -> string\n\
2198Return the magic tag for .pyc or .pyo files.");
2199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002200PyDoc_STRVAR(doc_get_suffixes,
2201"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002202Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002203that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002205PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00002206"lock_held() -> boolean\n\
2207Return True if the import lock is currently held, else False.\n\
2208On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00002209
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002210PyDoc_STRVAR(doc_acquire_lock,
2211"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00002212Acquires the interpreter's import lock for the current thread.\n\
2213This lock should be used by import hooks to ensure thread-safety\n\
2214when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002215On platforms without threads, this function does nothing.");
2216
2217PyDoc_STRVAR(doc_release_lock,
2218"release_lock() -> None\n\
2219Release the interpreter's import lock.\n\
2220On platforms without threads, this function does nothing.");
2221
Guido van Rossum79f25d91997-04-29 20:08:16 +00002222static PyMethodDef imp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
2224 {"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
2225 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
2227 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
2228 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
2229 {"reload", imp_reload, METH_O, doc_reload},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
2231 {"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
2232 {"init_builtin", imp_init_builtin, METH_VARARGS},
2233 {"init_frozen", imp_init_frozen, METH_VARARGS},
2234 {"is_builtin", imp_is_builtin, METH_VARARGS},
2235 {"is_frozen", imp_is_frozen, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002236#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002238#endif
Brett Cannon442c9b92011-03-23 16:14:42 -07002239 {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002241};
2242
Guido van Rossum1a8791e1998-08-04 22:46:29 +00002243static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002244setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 PyObject *v;
2247 int err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 v = PyLong_FromLong((long)value);
2250 err = PyDict_SetItemString(d, name, v);
2251 Py_XDECREF(v);
2252 return err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002253}
2254
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002255typedef struct {
2256 PyObject_HEAD
2257} NullImporter;
2258
2259static int
2260NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
2261{
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002262#ifndef MS_WINDOWS
2263 PyObject *path;
2264 struct stat statbuf;
2265 int rv;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 if (!_PyArg_NoKeywords("NullImporter()", kwds))
2268 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002269
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002270 if (!PyArg_ParseTuple(args, "O&:NullImporter",
2271 PyUnicode_FSConverter, &path))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002273
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002274 if (PyBytes_GET_SIZE(path) == 0) {
2275 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 PyErr_SetString(PyExc_ImportError, "empty pathname");
2277 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 }
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002279
2280 rv = stat(PyBytes_AS_STRING(path), &statbuf);
2281 Py_DECREF(path);
2282 if (rv == 0) {
2283 /* it exists */
2284 if (S_ISDIR(statbuf.st_mode)) {
2285 /* it's a directory */
2286 PyErr_SetString(PyExc_ImportError, "existing directory");
2287 return -1;
2288 }
2289 }
2290#else /* MS_WINDOWS */
2291 PyObject *pathobj;
2292 DWORD rv;
Victor Stinner255dfdb2010-09-29 10:28:51 +00002293 wchar_t *path;
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002294
2295 if (!_PyArg_NoKeywords("NullImporter()", kwds))
2296 return -1;
2297
2298 if (!PyArg_ParseTuple(args, "U:NullImporter",
2299 &pathobj))
2300 return -1;
2301
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002302 if (PyUnicode_GET_LENGTH(pathobj) == 0) {
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002303 PyErr_SetString(PyExc_ImportError, "empty pathname");
2304 return -1;
2305 }
2306
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00002307 path = PyUnicode_AsWideCharString(pathobj, NULL);
Victor Stinner255dfdb2010-09-29 10:28:51 +00002308 if (path == NULL)
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002309 return -1;
2310 /* see issue1293 and issue3677:
2311 * stat() on Windows doesn't recognise paths like
2312 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
2313 */
2314 rv = GetFileAttributesW(path);
Victor Stinner255dfdb2010-09-29 10:28:51 +00002315 PyMem_Free(path);
Victor Stinner1a4d12d2010-08-13 13:07:29 +00002316 if (rv != INVALID_FILE_ATTRIBUTES) {
2317 /* it exists */
2318 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
2319 /* it's a directory */
2320 PyErr_SetString(PyExc_ImportError, "existing directory");
2321 return -1;
2322 }
2323 }
2324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 return 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002326}
2327
2328static PyObject *
2329NullImporter_find_module(NullImporter *self, PyObject *args)
2330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002332}
2333
2334static PyMethodDef NullImporter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
2336 "Always return None"
2337 },
2338 {NULL} /* Sentinel */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002339};
2340
2341
Christian Heimes9cd17752007-11-18 19:35:23 +00002342PyTypeObject PyNullImporter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 PyVarObject_HEAD_INIT(NULL, 0)
2344 "imp.NullImporter", /*tp_name*/
2345 sizeof(NullImporter), /*tp_basicsize*/
2346 0, /*tp_itemsize*/
2347 0, /*tp_dealloc*/
2348 0, /*tp_print*/
2349 0, /*tp_getattr*/
2350 0, /*tp_setattr*/
2351 0, /*tp_reserved*/
2352 0, /*tp_repr*/
2353 0, /*tp_as_number*/
2354 0, /*tp_as_sequence*/
2355 0, /*tp_as_mapping*/
2356 0, /*tp_hash */
2357 0, /*tp_call*/
2358 0, /*tp_str*/
2359 0, /*tp_getattro*/
2360 0, /*tp_setattro*/
2361 0, /*tp_as_buffer*/
2362 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2363 "Null importer object", /* tp_doc */
2364 0, /* tp_traverse */
2365 0, /* tp_clear */
2366 0, /* tp_richcompare */
2367 0, /* tp_weaklistoffset */
2368 0, /* tp_iter */
2369 0, /* tp_iternext */
2370 NullImporter_methods, /* tp_methods */
2371 0, /* tp_members */
2372 0, /* tp_getset */
2373 0, /* tp_base */
2374 0, /* tp_dict */
2375 0, /* tp_descr_get */
2376 0, /* tp_descr_set */
2377 0, /* tp_dictoffset */
2378 (initproc)NullImporter_init, /* tp_init */
2379 0, /* tp_alloc */
2380 PyType_GenericNew /* tp_new */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002381};
2382
Martin v. Löwis1a214512008-06-11 05:26:20 +00002383static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002385 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 doc_imp,
2387 0,
2388 imp_methods,
2389 NULL,
2390 NULL,
2391 NULL,
2392 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002393};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002394
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002395PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002396PyInit_imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 if (PyType_Ready(&PyNullImporter_Type) < 0)
2401 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 m = PyModule_Create(&impmodule);
2404 if (m == NULL)
2405 goto failure;
2406 d = PyModule_GetDict(m);
2407 if (d == NULL)
2408 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
2411 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
2412 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
2413 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
2414 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
2415 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
2416 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
2417 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
2418 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
2419 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_INCREF(&PyNullImporter_Type);
2422 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
2423 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002424 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 Py_XDECREF(m);
2426 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002427}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002428
2429
Guido van Rossumb18618d2000-05-03 23:44:39 +00002430/* API for embedding applications that want to add their own entries
2431 to the table of built-in modules. This should normally be called
2432 *before* Py_Initialize(). When the table resize fails, -1 is
2433 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002434
2435 After a similar function by Just van Rossum. */
2436
2437int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002438PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 static struct _inittab *our_copy = NULL;
2441 struct _inittab *p;
2442 int i, n;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 /* Count the number of entries in both tables */
2445 for (n = 0; newtab[n].name != NULL; n++)
2446 ;
2447 if (n == 0)
2448 return 0; /* Nothing to do */
2449 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2450 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 /* Allocate new memory for the combined table */
2453 p = our_copy;
2454 PyMem_RESIZE(p, struct _inittab, i+n+1);
2455 if (p == NULL)
2456 return -1;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 /* Copy the tables into the new memory */
2459 if (our_copy != PyImport_Inittab)
2460 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2461 PyImport_Inittab = our_copy = p;
2462 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 return 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002465}
2466
2467/* Shorthand to add a single entry given a name and a function */
2468
2469int
Brett Cannona826f322009-04-02 03:41:46 +00002470PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 newtab[0].name = (char *)name;
2477 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002480}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002481
2482#ifdef __cplusplus
2483}
2484#endif