blob: a5277af938221e6347518853647aaf561729fe71 [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 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00008#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00009#include "pythonrun.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000011#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012#include "code.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000013#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000015#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016#include "importdl.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017
Guido van Rossum55a83382000-09-20 20:31:38 +000018#ifdef HAVE_FCNTL_H
19#include <fcntl.h>
20#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000021#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000022extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000023#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000024
Christian Heimesd3eb5a152008-02-24 00:38:49 +000025#ifdef MS_WINDOWS
26/* for stat.st_mode */
27typedef unsigned short mode_t;
28#endif
29
Guido van Rossum21d335e1993-10-15 13:01:11 +000030
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000031/* Magic word to reject .pyc files generated by other Python versions.
32 It should change for each incompatible change to the bytecode.
33
34 The value of CR and LF is incorporated so if you ever read or write
Guido van Rossum7faeab31995-07-07 22:50:36 +000035 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000036 Apple MPW compiler swaps their values, botching string constants.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000037
Guido van Rossum45aecf42006-03-15 04:58:47 +000038 The magic numbers must be spaced apart at least 2 values, as the
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000039 -U interpeter flag will cause MAGIC+1 being used. They have been
40 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000041
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000042 There were a variety of old schemes for setting the magic number.
43 The current working scheme is to increment the previous value by
44 10.
Guido van Rossumf6894922002-08-31 15:16:14 +000045
Barry Warsaw28a691b2010-04-17 00:19:56 +000046 Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
47 number also includes a new "magic tag", i.e. a human readable string used
48 to represent the magic number in __pycache__ directories. When you change
49 the magic number, you must also set a new unique magic tag. Generally this
50 can be named after the Python major version of the magic number bump, but
51 it can really be anything, as long as it's different than anything else
52 that's come before. The tags are included in the following table, starting
53 with Python 3.2a0.
54
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000055 Known values:
56 Python 1.5: 20121
57 Python 1.5.1: 20121
58 Python 1.5.2: 20121
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000059 Python 1.6: 50428
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000060 Python 2.0: 50823
61 Python 2.0.1: 50823
62 Python 2.1: 60202
63 Python 2.1.1: 60202
64 Python 2.1.2: 60202
65 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000066 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000067 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000068 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000069 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000070 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000071 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000072 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000073 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000074 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000075 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000076 Python 2.5b3: 62101 (fix wrong code: for x, in ...)
77 Python 2.5b3: 62111 (fix wrong code: x += yield)
78 Python 2.5c1: 62121 (fix wrong lnotab with for loops and
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 storing constants that should have been removed)
Thomas Wouters89f507f2006-12-13 04:49:30 +000080 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Christian Heimes99170a52007-12-19 02:07:34 +000081 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000082 Python 2.6a1: 62161 (WITH_CLEANUP optimization)
Guido van Rossum45aecf42006-03-15 04:58:47 +000083 Python 3000: 3000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 3010 (removed UNARY_CONVERT)
85 3020 (added BUILD_SET)
86 3030 (added keyword-only parameters)
87 3040 (added signature annotations)
88 3050 (print becomes a function)
89 3060 (PEP 3115 metaclass syntax)
90 3061 (string literals become unicode)
91 3071 (PEP 3109 raise changes)
92 3081 (PEP 3137 make __file__ and __name__ unicode)
93 3091 (kill str8 interning)
94 3101 (merge from 2.6a0, see 62151)
95 3103 (__file__ points to source file)
Benjamin Peterson0f6cae02009-12-10 02:09:08 +000096 Python 3.0a4: 3111 (WITH_CLEANUP optimization).
97 Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
98 Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 change LIST_APPEND and SET_ADD, add MAP_ADD)
Benjamin Peterson0f6cae02009-12-10 02:09:08 +0000100 Python 3.1a0: 3151 (optimize conditional branches:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
Benjamin Peterson876b2f22009-06-28 03:18:59 +0000102 Python 3.2a0: 3160 (add SETUP_WITH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 tag: cpython-32
Tim Peters36515e22001-11-18 04:06:29 +0000104*/
Guido van Rossum3ddee711991-12-16 13:06:34 +0000105
Barry Warsaw28a691b2010-04-17 00:19:56 +0000106/* If you change MAGIC, you must change TAG and you must insert the old value
107 into _PyMagicNumberTags below.
108*/
Benjamin Peterson876b2f22009-06-28 03:18:59 +0000109#define MAGIC (3160 | ((long)'\r'<<16) | ((long)'\n'<<24))
Barry Warsaw28a691b2010-04-17 00:19:56 +0000110#define TAG "cpython-32"
111#define CACHEDIR "__pycache__"
112/* Current magic word and string tag as globals. */
Guido van Rossum96774c12000-05-01 20:19:08 +0000113static long pyc_magic = MAGIC;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000114static const char *pyc_tag = TAG;
Guido van Rossum96774c12000-05-01 20:19:08 +0000115
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116/* See _PyImport_FixupExtension() below */
117static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000118
Guido van Rossum771c6c81997-10-31 18:37:24 +0000119/* This table is defined in config.c: */
120extern struct _inittab _PyImport_Inittab[];
121
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000122/* Method from Parser/tokenizer.c */
Guido van Rossum40d20bc2007-10-22 00:09:51 +0000123extern char * PyTokenizer_FindEncoding(int);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000124
Guido van Rossum771c6c81997-10-31 18:37:24 +0000125struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000126
Guido van Rossumed1170e1999-12-20 21:23:41 +0000127/* these tables define the module suffixes that Python recognizes */
128struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000129
Guido van Rossumed1170e1999-12-20 21:23:41 +0000130static const struct filedescr _PyImport_StandardFiletab[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000132#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 {".pyc", "rb", PY_COMPILED},
136 {0, 0}
Guido van Rossumed1170e1999-12-20 21:23:41 +0000137};
138
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000139
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000140/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141
142void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000143_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 const struct filedescr *scan;
146 struct filedescr *filetab;
147 int countD = 0;
148 int countS = 0;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 /* prepare _PyImport_Filetab: copy entries from
151 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
152 */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000153#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
155 ++countD;
Guido van Rossum04110fb2007-08-24 16:32:05 +0000156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
158 ++countS;
159 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
160 if (filetab == NULL)
161 Py_FatalError("Can't initialize import file table.");
Guido van Rossum04110fb2007-08-24 16:32:05 +0000162#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 memcpy(filetab, _PyImport_DynLoadFiletab,
164 countD * sizeof(struct filedescr));
Guido van Rossum04110fb2007-08-24 16:32:05 +0000165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 memcpy(filetab + countD, _PyImport_StandardFiletab,
167 countS * sizeof(struct filedescr));
168 filetab[countD + countS].suffix = NULL;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 _PyImport_Filetab = filetab;
Guido van Rossumed1170e1999-12-20 21:23:41 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 if (Py_OptimizeFlag) {
173 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
174 for (; filetab->suffix != NULL; filetab++) {
175 if (strcmp(filetab->suffix, ".pyc") == 0)
176 filetab->suffix = ".pyo";
177 }
178 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179}
180
Guido van Rossum25ce5661997-08-02 03:10:38 +0000181void
Just van Rossum52e14d62002-12-30 22:08:05 +0000182_PyImportHooks_Init(void)
183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 PyObject *v, *path_hooks = NULL, *zimpimport;
185 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 /* adding sys.path_hooks and sys.path_importer_cache, setting up
188 zipimport */
189 if (PyType_Ready(&PyNullImporter_Type) < 0)
190 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (Py_VerboseFlag)
193 PySys_WriteStderr("# installing zipimport hook\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 v = PyList_New(0);
196 if (v == NULL)
197 goto error;
198 err = PySys_SetObject("meta_path", v);
199 Py_DECREF(v);
200 if (err)
201 goto error;
202 v = PyDict_New();
203 if (v == NULL)
204 goto error;
205 err = PySys_SetObject("path_importer_cache", v);
206 Py_DECREF(v);
207 if (err)
208 goto error;
209 path_hooks = PyList_New(0);
210 if (path_hooks == NULL)
211 goto error;
212 err = PySys_SetObject("path_hooks", path_hooks);
213 if (err) {
Just van Rossum52e14d62002-12-30 22:08:05 +0000214 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 PyErr_Print();
216 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
217 "path_importer_cache, or NullImporter failed"
218 );
219 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 zimpimport = PyImport_ImportModule("zipimport");
222 if (zimpimport == NULL) {
223 PyErr_Clear(); /* No zip import module -- okay */
224 if (Py_VerboseFlag)
225 PySys_WriteStderr("# can't import zipimport\n");
226 }
227 else {
228 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
229 "zipimporter");
230 Py_DECREF(zimpimport);
231 if (zipimporter == NULL) {
232 PyErr_Clear(); /* No zipimporter object -- okay */
233 if (Py_VerboseFlag)
234 PySys_WriteStderr(
235 "# can't import zipimport.zipimporter\n");
236 }
237 else {
238 /* sys.path_hooks.append(zipimporter) */
239 err = PyList_Append(path_hooks, zipimporter);
240 Py_DECREF(zipimporter);
241 if (err)
242 goto error;
243 if (Py_VerboseFlag)
244 PySys_WriteStderr(
245 "# installed zipimport hook\n");
246 }
247 }
248 Py_DECREF(path_hooks);
Just van Rossum52e14d62002-12-30 22:08:05 +0000249}
250
251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 Py_XDECREF(extensions);
255 extensions = NULL;
256 PyMem_DEL(_PyImport_Filetab);
257 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000258}
259
260
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000261/* Locking primitives to prevent parallel imports of the same module
262 in different threads to return with a partially loaded module.
263 These calls are serialized by the global interpreter lock. */
264
265#ifdef WITH_THREAD
266
Guido van Rossum49b56061998-10-01 20:42:43 +0000267#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000268
Guido van Rossum65d5b571998-12-21 19:32:43 +0000269static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000270static long import_lock_thread = -1;
271static int import_lock_level = 0;
272
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000273void
274_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 long me = PyThread_get_thread_ident();
277 if (me == -1)
278 return; /* Too bad */
279 if (import_lock == NULL) {
280 import_lock = PyThread_allocate_lock();
281 if (import_lock == NULL)
282 return; /* Nothing much we can do. */
283 }
284 if (import_lock_thread == me) {
285 import_lock_level++;
286 return;
287 }
288 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
289 {
290 PyThreadState *tstate = PyEval_SaveThread();
291 PyThread_acquire_lock(import_lock, 1);
292 PyEval_RestoreThread(tstate);
293 }
294 import_lock_thread = me;
295 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000296}
297
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000298int
299_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 long me = PyThread_get_thread_ident();
302 if (me == -1 || import_lock == NULL)
303 return 0; /* Too bad */
304 if (import_lock_thread != me)
305 return -1;
306 import_lock_level--;
307 if (import_lock_level == 0) {
308 import_lock_thread = -1;
309 PyThread_release_lock(import_lock);
310 }
311 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000312}
313
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000314/* This function is called from PyOS_AfterFork to ensure that newly
315 created child processes do not share locks with the parent.
316 We now acquire the import lock around fork() calls but on some platforms
317 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000318
319void
320_PyImport_ReInitLock(void)
321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 if (import_lock != NULL)
323 import_lock = PyThread_allocate_lock();
324 import_lock_thread = -1;
325 import_lock_level = 0;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000326}
327
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000328#endif
329
Tim Peters69232342001-08-30 05:16:13 +0000330static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000331imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000332{
Tim Peters69232342001-08-30 05:16:13 +0000333#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000335#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000337#endif
338}
339
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000340static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000341imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000342{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000343#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 _PyImport_AcquireLock();
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 Py_INCREF(Py_None);
347 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000348}
349
350static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000351imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000352{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000353#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (_PyImport_ReleaseLock() < 0) {
355 PyErr_SetString(PyExc_RuntimeError,
356 "not holding the import lock");
357 return NULL;
358 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 Py_INCREF(Py_None);
361 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000362}
363
Guido van Rossumd8faa362007-04-27 19:54:29 +0000364static void
365imp_modules_reloading_clear(void)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 PyInterpreterState *interp = PyThreadState_Get()->interp;
368 if (interp->modules_reloading != NULL)
369 PyDict_Clear(interp->modules_reloading);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000370}
371
Guido van Rossum25ce5661997-08-02 03:10:38 +0000372/* Helper for sys */
373
374PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000375PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 PyInterpreterState *interp = PyThreadState_GET()->interp;
378 if (interp->modules == NULL)
379 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
380 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000381}
382
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000384/* List of names to clear in sys */
385static char* sys_deletes[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 "path", "argv", "ps1", "ps2",
387 "last_type", "last_value", "last_traceback",
388 "path_hooks", "path_importer_cache", "meta_path",
389 /* misc stuff */
390 "flags", "float_info",
391 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000392};
393
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000394static char* sys_files[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 "stdin", "__stdin__",
396 "stdout", "__stdout__",
397 "stderr", "__stderr__",
398 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000399};
400
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000401
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000402/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000403
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000405PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 Py_ssize_t pos, ndone;
408 char *name;
409 PyObject *key, *value, *dict;
410 PyInterpreterState *interp = PyThreadState_GET()->interp;
411 PyObject *modules = interp->modules;
Guido van Rossum758eec01998-01-19 21:58:26 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 if (modules == NULL)
414 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 /* Delete some special variables first. These are common
417 places where user values hide and people complain when their
418 destructors fail. Since the modules containing them are
419 deleted *last* of all, they would come too late in the normal
420 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 value = PyDict_GetItemString(modules, "builtins");
423 if (value != NULL && PyModule_Check(value)) {
424 dict = PyModule_GetDict(value);
425 if (Py_VerboseFlag)
426 PySys_WriteStderr("# clear builtins._\n");
427 PyDict_SetItemString(dict, "_", Py_None);
428 }
429 value = PyDict_GetItemString(modules, "sys");
430 if (value != NULL && PyModule_Check(value)) {
431 char **p;
432 PyObject *v;
433 dict = PyModule_GetDict(value);
434 for (p = sys_deletes; *p != NULL; p++) {
435 if (Py_VerboseFlag)
436 PySys_WriteStderr("# clear sys.%s\n", *p);
437 PyDict_SetItemString(dict, *p, Py_None);
438 }
439 for (p = sys_files; *p != NULL; p+=2) {
440 if (Py_VerboseFlag)
441 PySys_WriteStderr("# restore sys.%s\n", *p);
442 v = PyDict_GetItemString(dict, *(p+1));
443 if (v == NULL)
444 v = Py_None;
445 PyDict_SetItemString(dict, *p, v);
446 }
447 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 /* First, delete __main__ */
450 value = PyDict_GetItemString(modules, "__main__");
451 if (value != NULL && PyModule_Check(value)) {
452 if (Py_VerboseFlag)
453 PySys_WriteStderr("# cleanup __main__\n");
454 _PyModule_Clear(value);
455 PyDict_SetItemString(modules, "__main__", Py_None);
456 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 /* The special treatment of "builtins" here is because even
459 when it's not referenced as a module, its dictionary is
460 referenced by almost every module's __builtins__. Since
461 deleting a module clears its dictionary (even if there are
462 references left to it), we need to delete the "builtins"
463 module last. Likewise, we don't delete sys until the very
464 end because it is implicitly referenced (e.g. by print).
Guido van Rossum758eec01998-01-19 21:58:26 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 Also note that we 'delete' modules by replacing their entry
467 in the modules dict with None, rather than really deleting
468 them; this avoids a rehash of the modules dictionary and
469 also marks them as "non existent" so they won't be
470 re-imported. */
Guido van Rossum758eec01998-01-19 21:58:26 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 /* Next, repeatedly delete modules with a reference count of
473 one (skipping builtins and sys) and delete them */
474 do {
475 ndone = 0;
476 pos = 0;
477 while (PyDict_Next(modules, &pos, &key, &value)) {
478 if (value->ob_refcnt != 1)
479 continue;
480 if (PyUnicode_Check(key) && PyModule_Check(value)) {
481 name = _PyUnicode_AsString(key);
482 if (strcmp(name, "builtins") == 0)
483 continue;
484 if (strcmp(name, "sys") == 0)
485 continue;
486 if (Py_VerboseFlag)
487 PySys_WriteStderr(
488 "# cleanup[1] %s\n", name);
489 _PyModule_Clear(value);
490 PyDict_SetItem(modules, key, Py_None);
491 ndone++;
492 }
493 }
494 } while (ndone > 0);
Guido van Rossum758eec01998-01-19 21:58:26 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 /* Next, delete all modules (still skipping builtins and sys) */
497 pos = 0;
498 while (PyDict_Next(modules, &pos, &key, &value)) {
499 if (PyUnicode_Check(key) && PyModule_Check(value)) {
500 name = _PyUnicode_AsString(key);
501 if (strcmp(name, "builtins") == 0)
502 continue;
503 if (strcmp(name, "sys") == 0)
504 continue;
505 if (Py_VerboseFlag)
506 PySys_WriteStderr("# cleanup[2] %s\n", name);
507 _PyModule_Clear(value);
508 PyDict_SetItem(modules, key, Py_None);
509 }
510 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 /* Next, delete sys and builtins (in that order) */
513 value = PyDict_GetItemString(modules, "sys");
514 if (value != NULL && PyModule_Check(value)) {
515 if (Py_VerboseFlag)
516 PySys_WriteStderr("# cleanup sys\n");
517 _PyModule_Clear(value);
518 PyDict_SetItemString(modules, "sys", Py_None);
519 }
520 value = PyDict_GetItemString(modules, "builtins");
521 if (value != NULL && PyModule_Check(value)) {
522 if (Py_VerboseFlag)
523 PySys_WriteStderr("# cleanup builtins\n");
524 _PyModule_Clear(value);
525 PyDict_SetItemString(modules, "builtins", Py_None);
526 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 /* Finally, clear and delete the modules directory */
529 PyDict_Clear(modules);
530 interp->modules = NULL;
531 Py_DECREF(modules);
532 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000533}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000534
535
Barry Warsaw28a691b2010-04-17 00:19:56 +0000536/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537
538long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542}
543
544
Barry Warsaw28a691b2010-04-17 00:19:56 +0000545const char *
546PyImport_GetMagicTag(void)
547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return pyc_tag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000549}
550
Guido van Rossum25ce5661997-08-02 03:10:38 +0000551/* Magic for extension modules (built-in as well as dynamically
552 loaded). To prevent initializing an extension module more than
553 once, we keep a static dictionary 'extensions' keyed by module name
554 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000555 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000556 dictionary is stored by calling _PyImport_FixupExtension()
557 immediately after the module initialization function succeeds. A
558 copy can be retrieved from there by calling
Brett Cannon9a5b25a2010-03-01 02:09:17 +0000559 _PyImport_FindExtension().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000561 Modules which do support multiple initialization set their m_size
562 field to a non-negative number (indicating the size of the
563 module-specific state). They are still recorded in the extensions
564 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000565*/
566
567int
568_PyImport_FixupExtension(PyObject *mod, char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 PyObject *modules, *dict;
571 struct PyModuleDef *def;
572 if (extensions == NULL) {
573 extensions = PyDict_New();
574 if (extensions == NULL)
575 return -1;
576 }
577 if (mod == NULL || !PyModule_Check(mod)) {
578 PyErr_BadInternalCall();
579 return -1;
580 }
581 def = PyModule_GetDef(mod);
582 if (!def) {
583 PyErr_BadInternalCall();
584 return -1;
585 }
586 modules = PyImport_GetModuleDict();
587 if (PyDict_SetItemString(modules, name, mod) < 0)
588 return -1;
589 if (_PyState_AddModule(mod, def) < 0) {
590 PyDict_DelItemString(modules, name);
591 return -1;
592 }
593 if (def->m_size == -1) {
594 if (def->m_base.m_copy) {
595 /* Somebody already imported the module,
596 likely under a different name.
597 XXX this should really not happen. */
598 Py_DECREF(def->m_base.m_copy);
599 def->m_base.m_copy = NULL;
600 }
601 dict = PyModule_GetDict(mod);
602 if (dict == NULL)
603 return -1;
604 def->m_base.m_copy = PyDict_Copy(dict);
605 if (def->m_base.m_copy == NULL)
606 return -1;
607 }
608 PyDict_SetItemString(extensions, filename, (PyObject*)def);
609 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000610}
611
612PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PyObject *mod, *mdict;
616 PyModuleDef* def;
617 if (extensions == NULL)
618 return NULL;
619 def = (PyModuleDef*)PyDict_GetItemString(extensions, filename);
620 if (def == NULL)
621 return NULL;
622 if (def->m_size == -1) {
623 /* Module does not support repeated initialization */
624 if (def->m_base.m_copy == NULL)
625 return NULL;
626 mod = PyImport_AddModule(name);
627 if (mod == NULL)
628 return NULL;
629 mdict = PyModule_GetDict(mod);
630 if (mdict == NULL)
631 return NULL;
632 if (PyDict_Update(mdict, def->m_base.m_copy))
633 return NULL;
634 }
635 else {
636 if (def->m_base.m_init == NULL)
637 return NULL;
638 mod = def->m_base.m_init();
639 if (mod == NULL)
640 return NULL;
641 PyDict_SetItemString(PyImport_GetModuleDict(), name, mod);
642 Py_DECREF(mod);
643 }
644 if (_PyState_AddModule(mod, def) < 0) {
645 PyDict_DelItemString(PyImport_GetModuleDict(), name);
646 Py_DECREF(mod);
647 return NULL;
648 }
649 if (Py_VerboseFlag)
650 PySys_WriteStderr("import %s # previously loaded (%s)\n",
651 name, filename);
652 return mod;
Brett Cannon9a5b25a2010-03-01 02:09:17 +0000653
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654}
655
656
657/* Get the module object corresponding to a module name.
658 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000659 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000660 Because the former action is most common, THIS DOES NOT RETURN A
661 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000664PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 PyObject *modules = PyImport_GetModuleDict();
667 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
670 PyModule_Check(m))
671 return m;
672 m = PyModule_New(name);
673 if (m == NULL)
674 return NULL;
675 if (PyDict_SetItemString(modules, name, m) != 0) {
676 Py_DECREF(m);
677 return NULL;
678 }
679 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682}
683
Tim Peters1cd70172004-08-02 03:52:12 +0000684/* Remove name from sys.modules, if it's there. */
685static void
Benjamin Petersonfa0aeba2010-03-25 23:30:20 +0000686remove_module(const char *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 PyObject *modules = PyImport_GetModuleDict();
689 if (PyDict_GetItemString(modules, name) == NULL)
690 return;
691 if (PyDict_DelItemString(modules, name) < 0)
692 Py_FatalError("import: deleting existing key in"
693 "sys.modules failed");
Tim Peters1cd70172004-08-02 03:52:12 +0000694}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695
Barry Warsaw28a691b2010-04-17 00:19:56 +0000696static PyObject * get_sourcefile(char *file);
697static char *make_source_pathname(char *pathname, char *buf);
698static char *make_compiled_pathname(char *pathname, char *buf, size_t buflen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 int debug);
Christian Heimes3b06e532008-01-07 20:12:44 +0000700
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000701/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000702 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
703 * removed from sys.modules, to avoid leaving damaged module objects
704 * in sys.modules. The caller may wish to restore the original
705 * module object (if any) in this case; PyImport_ReloadModule is an
706 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000707 *
708 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
709 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000710 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return PyImport_ExecCodeModuleWithPathnames(
715 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000716}
717
718PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 return PyImport_ExecCodeModuleWithPathnames(
722 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000723}
724
725PyObject *
726PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 PyObject *modules = PyImport_GetModuleDict();
730 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 m = PyImport_AddModule(name);
733 if (m == NULL)
734 return NULL;
735 /* If the module is being reloaded, we get the old module back
736 and re-use its dict to exec the new code. */
737 d = PyModule_GetDict(m);
738 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
739 if (PyDict_SetItemString(d, "__builtins__",
740 PyEval_GetBuiltins()) != 0)
741 goto error;
742 }
743 /* Remember the filename as the __file__ attribute */
744 v = NULL;
745 if (pathname != NULL) {
746 v = get_sourcefile(pathname);
747 if (v == NULL)
748 PyErr_Clear();
749 }
750 if (v == NULL) {
751 v = ((PyCodeObject *)co)->co_filename;
752 Py_INCREF(v);
753 }
754 if (PyDict_SetItemString(d, "__file__", v) != 0)
755 PyErr_Clear(); /* Not important enough to report */
756 Py_DECREF(v);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 /* Remember the pyc path name as the __cached__ attribute. */
759 if (cpathname == NULL) {
760 v = Py_None;
761 Py_INCREF(v);
762 }
763 else if ((v = PyUnicode_FromString(cpathname)) == NULL) {
764 PyErr_Clear(); /* Not important enough to report */
765 v = Py_None;
766 Py_INCREF(v);
767 }
768 if (PyDict_SetItemString(d, "__cached__", v) != 0)
769 PyErr_Clear(); /* Not important enough to report */
770 Py_DECREF(v);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
773 if (v == NULL)
774 goto error;
775 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
778 PyErr_Format(PyExc_ImportError,
779 "Loaded module %.200s not found in sys.modules",
780 name);
781 return NULL;
782 }
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000787
788 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 remove_module(name);
790 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791}
792
793
Barry Warsaw28a691b2010-04-17 00:19:56 +0000794/* Like strrchr(string, '/') but searches for the rightmost of either SEP
795 or ALTSEP, if the latter is defined.
796*/
797static char *
798rightmost_sep(char *s)
799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 char *found, c;
801 for (found = NULL; (c = *s); s++) {
802 if (c == SEP
Barry Warsaw28a691b2010-04-17 00:19:56 +0000803#ifdef ALTSEP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 || c == ALTSEP
Barry Warsaw28a691b2010-04-17 00:19:56 +0000805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 )
807 {
808 found = s;
809 }
810 }
811 return found;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000812}
813
814
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815/* Given a pathname for a Python source file, fill a buffer with the
816 pathname for the corresponding compiled file. Return the pathname
817 for the compiled file, or NULL if there's no space in the buffer.
818 Doesn't set an exception. */
819
820static char *
Barry Warsaw28a691b2010-04-17 00:19:56 +0000821make_compiled_pathname(char *pathname, char *buf, size_t buflen, int debug)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 /* foo.py -> __pycache__/foo.<tag>.pyc */
824 size_t len = strlen(pathname);
825 size_t i, save;
826 char *pos;
827 int sep = SEP;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 /* Sanity check that the buffer has roughly enough space to hold what
830 will eventually be the full path to the compiled file. The 5 extra
831 bytes include the slash afer __pycache__, the two extra dots, the
832 extra trailing character ('c' or 'o') and null. This isn't exact
833 because the contents of the buffer can affect how many actual
834 characters of the string get into the buffer. We'll do a final
835 sanity check before writing the extension to ensure we do not
836 overflow the buffer.
837 */
838 if (len + strlen(CACHEDIR) + strlen(pyc_tag) + 5 > buflen)
839 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 /* Find the last path separator and copy everything from the start of
842 the source string up to and including the separator.
843 */
844 if ((pos = rightmost_sep(pathname)) == NULL) {
845 i = 0;
846 }
847 else {
848 sep = *pos;
849 i = pos - pathname + 1;
850 strncpy(buf, pathname, i);
851 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 save = i;
854 buf[i++] = '\0';
855 /* Add __pycache__/ */
856 strcat(buf, CACHEDIR);
857 i += strlen(CACHEDIR) - 1;
858 buf[i++] = sep;
859 buf[i++] = '\0';
860 /* Add the base filename, but remove the .py or .pyw extension, since
861 the tag name must go before the extension.
862 */
863 strcat(buf, pathname + save);
864 if ((pos = strrchr(buf, '.')) != NULL)
865 *++pos = '\0';
866 strcat(buf, pyc_tag);
867 /* The length test above assumes that we're only adding one character
868 to the end of what would normally be the extension. What if there
869 is no extension, or the string ends in '.' or '.p', and otherwise
870 fills the buffer? By appending 4 more characters onto the string
871 here, we could overrun the buffer.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 As a simple example, let's say buflen=32 and the input string is
874 'xxx.py'. strlen() would be 6 and the test above would yield:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 (6 + 11 + 10 + 5 == 32) > 32
Barry Warsaw28a691b2010-04-17 00:19:56 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 which is false and so the name mangling would continue. This would
879 be fine because we'd end up with this string in buf:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 __pycache__/xxx.cpython-32.pyc\0
Barry Warsaw28a691b2010-04-17 00:19:56 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 strlen(of that) == 30 + the nul fits inside a 32 character buffer.
884 We can even handle an input string of say 'xxxxx' above because
885 that's (5 + 11 + 10 + 5 == 31) > 32 which is also false. Name
886 mangling that yields:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 __pycache__/xxxxxcpython-32.pyc\0
Barry Warsaw28a691b2010-04-17 00:19:56 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 which is 32 characters including the nul, and thus fits in the
891 buffer. However, an input string of 'xxxxxx' would yield a result
892 string of:
Barry Warsaw28a691b2010-04-17 00:19:56 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 __pycache__/xxxxxxcpython-32.pyc\0
Barry Warsaw28a691b2010-04-17 00:19:56 +0000895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 which is 33 characters long (including the nul), thus overflowing
897 the buffer, even though the first test would fail, i.e.: the input
898 string is also 6 characters long, so 32 > 32 is false.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 The reason the first test fails but we still overflow the buffer is
901 that the test above only expects to add one extra character to be
902 added to the extension, and here we're adding three (pyc). We
903 don't add the first dot, so that reclaims one of expected
904 positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed
905 dot - 1 expected extra == 1 overflowed).
Barry Warsaw28a691b2010-04-17 00:19:56 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 The best we can do is ensure that we still have enough room in the
908 target buffer before we write the extension. Because it's always
909 only the extension that can cause the overflow, and never the other
910 path bytes we've written, it's sufficient to just do one more test
911 here. Still, the assertion that follows can't hurt.
912 */
Barry Warsaw28a691b2010-04-17 00:19:56 +0000913#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 if (strlen(buf) + 5 > buflen)
917 return NULL;
918 strcat(buf, debug ? ".pyc" : ".pyo");
919 assert(strlen(buf) < buflen);
920 return buf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921}
922
923
Barry Warsaw28a691b2010-04-17 00:19:56 +0000924/* Given a pathname to a Python byte compiled file, return the path to the
925 source file, if the path matches the PEP 3147 format. This does not check
926 for any file existence, however, if the pyc file name does not match PEP
927 3147 style, NULL is returned. buf must be at least as big as pathname;
928 the resulting path will always be shorter. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929
Barry Warsaw28a691b2010-04-17 00:19:56 +0000930static char *
931make_source_pathname(char *pathname, char *buf)
932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 /* __pycache__/foo.<tag>.pyc -> foo.py */
934 size_t i, j;
935 char *left, *right, *dot0, *dot1, sep;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 /* Look back two slashes from the end. In between these two slashes
938 must be the string __pycache__ or this is not a PEP 3147 style
939 path. It's possible for there to be only one slash.
940 */
941 if ((right = rightmost_sep(pathname)) == NULL)
942 return NULL;
943 sep = *right;
944 *right = '\0';
945 left = rightmost_sep(pathname);
946 *right = sep;
947 if (left == NULL)
948 left = pathname;
949 else
950 left++;
951 if (right-left != strlen(CACHEDIR) ||
952 strncmp(left, CACHEDIR, right-left) != 0)
953 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 /* Now verify that the path component to the right of the last slash
956 has two dots in it.
957 */
958 if ((dot0 = strchr(right + 1, '.')) == NULL)
959 return NULL;
960 if ((dot1 = strchr(dot0 + 1, '.')) == NULL)
961 return NULL;
962 /* Too many dots? */
963 if (strchr(dot1 + 1, '.') != NULL)
964 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 /* This is a PEP 3147 path. Start by copying everything from the
967 start of pathname up to and including the leftmost slash. Then
968 copy the file's basename, removing the magic tag and adding a .py
969 suffix.
970 */
971 strncpy(buf, pathname, (i=left-pathname));
972 strncpy(buf+i, right+1, (j=dot0-right));
973 strcpy(buf+i+j, "py");
974 return buf;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000975}
976
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977/* Given a pathname for a Python source file, its time of last
978 modification, and a pathname for a compiled file, check whether the
979 compiled file represents the same version of the source. If so,
980 return a FILE pointer for the compiled file, positioned just after
981 the header; if not, return NULL.
982 Doesn't set an exception. */
983
984static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000985check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 FILE *fp;
988 long magic;
989 long pyc_mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 fp = fopen(cpathname, "rb");
992 if (fp == NULL)
993 return NULL;
994 magic = PyMarshal_ReadLongFromFile(fp);
995 if (magic != pyc_magic) {
996 if (Py_VerboseFlag)
997 PySys_WriteStderr("# %s has bad magic\n", cpathname);
998 fclose(fp);
999 return NULL;
1000 }
1001 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
1002 if (pyc_mtime != mtime) {
1003 if (Py_VerboseFlag)
1004 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
1005 fclose(fp);
1006 return NULL;
1007 }
1008 if (Py_VerboseFlag)
1009 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
1010 return fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011}
1012
1013
1014/* Read a code object from a file and check it for validity */
1015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001017read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 co = PyMarshal_ReadLastObjectFromFile(fp);
1022 if (co == NULL)
1023 return NULL;
1024 if (!PyCode_Check(co)) {
1025 PyErr_Format(PyExc_ImportError,
1026 "Non-code object in %.200s", cpathname);
1027 Py_DECREF(co);
1028 return NULL;
1029 }
1030 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031}
1032
1033
1034/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001035 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001038load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 long magic;
1041 PyCodeObject *co;
1042 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 magic = PyMarshal_ReadLongFromFile(fp);
1045 if (magic != pyc_magic) {
1046 PyErr_Format(PyExc_ImportError,
1047 "Bad magic number in %.200s", cpathname);
1048 return NULL;
1049 }
1050 (void) PyMarshal_ReadLongFromFile(fp);
1051 co = read_compiled_module(cpathname, fp);
1052 if (co == NULL)
1053 return NULL;
1054 if (Py_VerboseFlag)
1055 PySys_WriteStderr("import %s # precompiled from %s\n",
1056 name, cpathname);
1057 m = PyImport_ExecCodeModuleWithPathnames(
1058 name, (PyObject *)co, cpathname, cpathname);
1059 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062}
1063
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064/* Parse a source file and return the corresponding code object */
1065
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 PyCodeObject *co = NULL;
1070 mod_ty mod;
1071 PyCompilerFlags flags;
1072 PyArena *arena = PyArena_New();
1073 if (arena == NULL)
1074 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 flags.cf_flags = 0;
1077 mod = PyParser_ASTFromFile(fp, pathname, NULL,
1078 Py_file_input, 0, 0, &flags,
1079 NULL, arena);
1080 if (mod) {
1081 co = PyAST_Compile(mod, pathname, NULL, arena);
1082 }
1083 PyArena_Free(arena);
1084 return co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001085}
1086
1087
Guido van Rossum55a83382000-09-20 20:31:38 +00001088/* Helper to open a bytecode file for writing in exclusive mode */
1089
1090static FILE *
Christian Heimes05e8be12008-02-23 18:30:17 +00001091open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +00001092{
1093#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 /* Use O_EXCL to avoid a race condition when another process tries to
1095 write the same file. When that happens, our open() call fails,
1096 which is just fine (since it's only a cache).
1097 XXX If the file exists and is writable but the directory is not
1098 writable, the file will never be written. Oh well.
1099 */
1100 int fd;
1101 (void) unlink(filename);
1102 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
Tim Peters42c83af2000-09-29 04:03:10 +00001103#ifdef O_BINARY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 |O_BINARY /* necessary for Windows */
Tim Peters42c83af2000-09-29 04:03:10 +00001105#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001106#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001108#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 );
1112 if (fd < 0)
1113 return NULL;
1114 return fdopen(fd, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +00001115#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 /* Best we can do -- on Windows this can't happen anyway */
1117 return fopen(filename, "wb");
Guido van Rossum55a83382000-09-20 20:31:38 +00001118#endif
1119}
1120
1121
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001122/* Write a compiled module to a file, placing the time of last
1123 modification of its source into the header.
1124 Errors are ignored, if a write error occurs an attempt is made to
1125 remove the file. */
1126
1127static void
Christian Heimes05e8be12008-02-23 18:30:17 +00001128write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 FILE *fp;
1131 char *dirpath;
1132 time_t mtime = srcstat->st_mtime;
Alexandre Vassalotti9d58e3e2009-07-17 10:55:50 +00001133#ifdef MS_WINDOWS /* since Windows uses different permissions */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 mode_t mode = srcstat->st_mode & ~S_IEXEC;
1135 mode_t dirmode = srcstat->st_mode | S_IEXEC; /* XXX Is this correct
1136 for Windows?
1137 2010-04-07 BAW */
Alexandre Vassalotti9d58e3e2009-07-17 10:55:50 +00001138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
1140 mode_t dirmode = (srcstat->st_mode |
1141 S_IXUSR | S_IXGRP | S_IXOTH |
1142 S_IWUSR | S_IWGRP | S_IWOTH);
Brett Cannon9a5b25a2010-03-01 02:09:17 +00001143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 int saved;
Barry Warsaw28a691b2010-04-17 00:19:56 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 /* Ensure that the __pycache__ directory exists. */
1147 dirpath = rightmost_sep(cpathname);
1148 if (dirpath == NULL) {
1149 if (Py_VerboseFlag)
1150 PySys_WriteStderr(
1151 "# no %s path found %s\n",
1152 CACHEDIR, cpathname);
1153 return;
1154 }
1155 saved = *dirpath;
1156 *dirpath = '\0';
1157 /* XXX call os.mkdir() or maybe CreateDirectoryA() on Windows? */
1158 if (mkdir(cpathname, dirmode) < 0 && errno != EEXIST) {
1159 *dirpath = saved;
1160 if (Py_VerboseFlag)
1161 PySys_WriteStderr(
1162 "# cannot create cache dir %s\n", cpathname);
1163 return;
1164 }
1165 *dirpath = saved;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 fp = open_exclusive(cpathname, mode);
1168 if (fp == NULL) {
1169 if (Py_VerboseFlag)
1170 PySys_WriteStderr(
1171 "# can't create %s\n", cpathname);
1172 return;
1173 }
1174 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
1175 /* First write a 0 for mtime */
1176 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
1177 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
1178 if (fflush(fp) != 0 || ferror(fp)) {
1179 if (Py_VerboseFlag)
1180 PySys_WriteStderr("# can't write %s\n", cpathname);
1181 /* Don't keep partial file */
1182 fclose(fp);
1183 (void) unlink(cpathname);
1184 return;
1185 }
1186 /* Now write the true mtime */
1187 fseek(fp, 4L, 0);
1188 assert(mtime < LONG_MAX);
1189 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
1190 fflush(fp);
1191 fclose(fp);
1192 if (Py_VerboseFlag)
1193 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194}
1195
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001196static void
1197update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 PyObject *constants, *tmp;
1200 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 if (PyUnicode_Compare(co->co_filename, oldname))
1203 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 tmp = co->co_filename;
1206 co->co_filename = newname;
1207 Py_INCREF(co->co_filename);
1208 Py_DECREF(tmp);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 constants = co->co_consts;
1211 n = PyTuple_GET_SIZE(constants);
1212 for (i = 0; i < n; i++) {
1213 tmp = PyTuple_GET_ITEM(constants, i);
1214 if (PyCode_Check(tmp))
1215 update_code_filenames((PyCodeObject *)tmp,
1216 oldname, newname);
1217 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001218}
1219
1220static int
1221update_compiled_module(PyCodeObject *co, char *pathname)
1222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 PyObject *oldname, *newname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 newname = PyUnicode_DecodeFSDefault(pathname);
1226 if (newname == NULL)
1227 return -1;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 if (!PyUnicode_Compare(co->co_filename, newname)) {
1230 Py_DECREF(newname);
1231 return 0;
1232 }
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 oldname = co->co_filename;
1235 Py_INCREF(oldname);
1236 update_code_filenames(co, oldname, newname);
1237 Py_DECREF(oldname);
1238 Py_DECREF(newname);
1239 return 1;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001240}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241
1242/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001243 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
1244 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001247load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 struct stat st;
1250 FILE *fpc;
1251 char buf[MAXPATHLEN+1];
1252 char *cpathname;
1253 PyCodeObject *co;
1254 PyObject *m;
Brett Cannon9a5b25a2010-03-01 02:09:17 +00001255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 if (fstat(fileno(fp), &st) != 0) {
1257 PyErr_Format(PyExc_RuntimeError,
1258 "unable to get file status from '%s'",
1259 pathname);
1260 return NULL;
1261 }
Fred Drake4c82b232000-06-30 16:18:57 +00001262#if SIZEOF_TIME_T > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 /* Python's .pyc timestamp handling presumes that the timestamp fits
1264 in 4 bytes. This will be fine until sometime in the year 2038,
1265 when a 4-byte signed time_t will overflow.
1266 */
1267 if (st.st_mtime >> 32) {
1268 PyErr_SetString(PyExc_OverflowError,
1269 "modification time overflows a 4 byte field");
1270 return NULL;
1271 }
Fred Drake4c82b232000-06-30 16:18:57 +00001272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 cpathname = make_compiled_pathname(
1274 pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag);
1275 if (cpathname != NULL &&
1276 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
1277 co = read_compiled_module(cpathname, fpc);
1278 fclose(fpc);
1279 if (co == NULL)
1280 return NULL;
1281 if (update_compiled_module(co, pathname) < 0)
1282 return NULL;
1283 if (Py_VerboseFlag)
1284 PySys_WriteStderr("import %s # precompiled from %s\n",
1285 name, cpathname);
1286 pathname = cpathname;
1287 }
1288 else {
1289 co = parse_source_module(pathname, fp);
1290 if (co == NULL)
1291 return NULL;
1292 if (Py_VerboseFlag)
1293 PySys_WriteStderr("import %s # from %s\n",
1294 name, pathname);
1295 if (cpathname) {
1296 PyObject *ro = PySys_GetObject("dont_write_bytecode");
1297 if (ro == NULL || !PyObject_IsTrue(ro))
1298 write_compiled_module(co, cpathname, &st);
1299 }
1300 }
1301 m = PyImport_ExecCodeModuleWithPathnames(
1302 name, (PyObject *)co, pathname, cpathname);
1303 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306}
1307
Christian Heimes3b06e532008-01-07 20:12:44 +00001308/* Get source file -> unicode or None
1309 * Returns the path to the py file if available, else the given path
1310 */
1311static PyObject *
Barry Warsaw28a691b2010-04-17 00:19:56 +00001312get_sourcefile(char *file)
Christian Heimes3b06e532008-01-07 20:12:44 +00001313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 char py[MAXPATHLEN + 1];
1315 Py_ssize_t len;
1316 PyObject *u;
1317 struct stat statbuf;
Christian Heimes3b06e532008-01-07 20:12:44 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 if (!file || !*file) {
1320 Py_RETURN_NONE;
1321 }
Christian Heimes3b06e532008-01-07 20:12:44 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 len = strlen(file);
1324 /* match '*.py?' */
1325 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
1326 return PyUnicode_DecodeFSDefault(file);
1327 }
Christian Heimes3b06e532008-01-07 20:12:44 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 /* Start by trying to turn PEP 3147 path into source path. If that
1330 * fails, just chop off the trailing character, i.e. legacy pyc path
1331 * to py.
1332 */
1333 if (make_source_pathname(file, py) == NULL) {
1334 strncpy(py, file, len-1);
1335 py[len-1] = '\0';
1336 }
Barry Warsaw28a691b2010-04-17 00:19:56 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 if (stat(py, &statbuf) == 0 &&
1339 S_ISREG(statbuf.st_mode)) {
1340 u = PyUnicode_DecodeFSDefault(py);
1341 }
1342 else {
1343 u = PyUnicode_DecodeFSDefault(file);
1344 }
1345 return u;
Christian Heimes3b06e532008-01-07 20:12:44 +00001346}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001347
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001348/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001349static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1350static struct filedescr *find_module(char *, char *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001352static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001353
1354/* Load a package and return its module object WITH INCREMENTED
1355 REFERENCE COUNT */
1356
1357static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyObject *m, *d;
1361 PyObject *file = NULL;
1362 PyObject *path = NULL;
1363 int err;
1364 char buf[MAXPATHLEN+1];
1365 FILE *fp = NULL;
1366 struct filedescr *fdp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 m = PyImport_AddModule(name);
1369 if (m == NULL)
1370 return NULL;
1371 if (Py_VerboseFlag)
1372 PySys_WriteStderr("import %s # directory %s\n",
1373 name, pathname);
1374 d = PyModule_GetDict(m);
1375 file = get_sourcefile(pathname);
1376 if (file == NULL)
1377 goto error;
1378 path = Py_BuildValue("[O]", file);
1379 if (path == NULL)
1380 goto error;
1381 err = PyDict_SetItemString(d, "__file__", file);
1382 if (err == 0)
1383 err = PyDict_SetItemString(d, "__path__", path);
1384 if (err != 0)
1385 goto error;
1386 buf[0] = '\0';
1387 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
1388 if (fdp == NULL) {
1389 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1390 PyErr_Clear();
1391 Py_INCREF(m);
1392 }
1393 else
1394 m = NULL;
1395 goto cleanup;
1396 }
1397 m = load_module(name, fp, buf, fdp->type, NULL);
1398 if (fp != NULL)
1399 fclose(fp);
1400 goto cleanup;
Tim Peters1cd70172004-08-02 03:52:12 +00001401
1402 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001404 cleanup:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 Py_XDECREF(path);
1406 Py_XDECREF(file);
1407 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001408}
1409
1410
1411/* Helper to test for built-in module */
1412
1413static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 int i;
1417 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1418 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1419 if (PyImport_Inittab[i].initfunc == NULL)
1420 return -1;
1421 else
1422 return 1;
1423 }
1424 }
1425 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001426}
1427
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001428
Just van Rossum52e14d62002-12-30 22:08:05 +00001429/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1430 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001431 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001432 that can handle the path item. Return None if no hook could;
1433 this tells our caller it should fall back to the builtin
1434 import mechanism. Cache the result in path_importer_cache.
1435 Returns a borrowed reference. */
1436
1437static PyObject *
1438get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 PyObject *importer;
1442 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 /* These conditions are the caller's responsibility: */
1445 assert(PyList_Check(path_hooks));
1446 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 nhooks = PyList_Size(path_hooks);
1449 if (nhooks < 0)
1450 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 importer = PyDict_GetItem(path_importer_cache, p);
1453 if (importer != NULL)
1454 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 /* set path_importer_cache[p] to None to avoid recursion */
1457 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1458 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 for (j = 0; j < nhooks; j++) {
1461 PyObject *hook = PyList_GetItem(path_hooks, j);
1462 if (hook == NULL)
1463 return NULL;
1464 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
1465 if (importer != NULL)
1466 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1469 return NULL;
1470 }
1471 PyErr_Clear();
1472 }
1473 if (importer == NULL) {
1474 importer = PyObject_CallFunctionObjArgs(
1475 (PyObject *)&PyNullImporter_Type, p, NULL
1476 );
1477 if (importer == NULL) {
1478 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1479 PyErr_Clear();
1480 return Py_None;
1481 }
1482 }
1483 }
1484 if (importer != NULL) {
1485 int err = PyDict_SetItem(path_importer_cache, p, importer);
1486 Py_DECREF(importer);
1487 if (err != 0)
1488 return NULL;
1489 }
1490 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001491}
1492
Christian Heimes9cd17752007-11-18 19:35:23 +00001493PyAPI_FUNC(PyObject *)
1494PyImport_GetImporter(PyObject *path) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1498 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1499 importer = get_path_importer(path_importer_cache,
1500 path_hooks, path);
1501 }
1502 }
1503 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1504 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001505}
1506
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001507/* Search the path (default sys.path) for a module. Return the
1508 corresponding filedescr struct, and (via return arguments) the
1509 pathname and an open file. Return NULL if the module is not found. */
1510
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001511#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001512extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001514#endif
1515
Martin v. Löwis18e16552006-02-15 17:27:45 +00001516static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001517static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001518static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001519
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001520static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001521find_module(char *fullname, char *subname, PyObject *path, char *buf,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 Py_ssize_t i, npath;
1525 size_t len, namelen;
1526 struct filedescr *fdp = NULL;
1527 char *filemode;
1528 FILE *fp = NULL;
1529 PyObject *path_hooks, *path_importer_cache;
1530 struct stat statbuf;
1531 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1532 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1533 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
1534 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001535#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 size_t saved_len;
1537 size_t saved_namelen;
1538 char *saved_buf = NULL;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 if (p_loader != NULL)
1541 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 if (strlen(subname) > MAXPATHLEN) {
1544 PyErr_SetString(PyExc_OverflowError,
1545 "module name is too long");
1546 return NULL;
1547 }
1548 strcpy(name, subname);
Just van Rossum52e14d62002-12-30 22:08:05 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 /* sys.meta_path import hook */
1551 if (p_loader != NULL) {
1552 PyObject *meta_path;
Just van Rossum52e14d62002-12-30 22:08:05 +00001553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 meta_path = PySys_GetObject("meta_path");
1555 if (meta_path == NULL || !PyList_Check(meta_path)) {
1556 PyErr_SetString(PyExc_ImportError,
1557 "sys.meta_path must be a list of "
1558 "import hooks");
1559 return NULL;
1560 }
1561 Py_INCREF(meta_path); /* zap guard */
1562 npath = PyList_Size(meta_path);
1563 for (i = 0; i < npath; i++) {
1564 PyObject *loader;
1565 PyObject *hook = PyList_GetItem(meta_path, i);
1566 loader = PyObject_CallMethod(hook, "find_module",
1567 "sO", fullname,
1568 path != NULL ?
1569 path : Py_None);
1570 if (loader == NULL) {
1571 Py_DECREF(meta_path);
1572 return NULL; /* true error */
1573 }
1574 if (loader != Py_None) {
1575 /* a loader was found */
1576 *p_loader = loader;
1577 Py_DECREF(meta_path);
1578 return &importhookdescr;
1579 }
1580 Py_DECREF(loader);
1581 }
1582 Py_DECREF(meta_path);
1583 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 if (find_frozen(fullname) != NULL) {
1586 strcpy(buf, fullname);
1587 return &fd_frozen;
1588 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 if (path == NULL) {
1591 if (is_builtin(name)) {
1592 strcpy(buf, name);
1593 return &fd_builtin;
1594 }
Guido van Rossumac279101996-08-22 23:10:58 +00001595#ifdef MS_COREDLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1597 if (fp != NULL) {
1598 *p_fp = fp;
1599 return fdp;
1600 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 path = PySys_GetObject("path");
1603 }
Benjamin Petersond968e272008-11-05 22:48:33 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (path == NULL || !PyList_Check(path)) {
1606 PyErr_SetString(PyExc_ImportError,
1607 "sys.path must be a list of directory names");
1608 return NULL;
1609 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 path_hooks = PySys_GetObject("path_hooks");
1612 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1613 PyErr_SetString(PyExc_ImportError,
1614 "sys.path_hooks must be a list of "
1615 "import hooks");
1616 return NULL;
1617 }
1618 path_importer_cache = PySys_GetObject("path_importer_cache");
1619 if (path_importer_cache == NULL ||
1620 !PyDict_Check(path_importer_cache)) {
1621 PyErr_SetString(PyExc_ImportError,
1622 "sys.path_importer_cache must be a dict");
1623 return NULL;
1624 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 npath = PyList_Size(path);
1627 namelen = strlen(name);
1628 for (i = 0; i < npath; i++) {
1629 PyObject *v = PyList_GetItem(path, i);
1630 PyObject *origv = v;
1631 const char *base;
1632 Py_ssize_t size;
1633 if (!v)
1634 return NULL;
1635 if (PyUnicode_Check(v)) {
Victor Stinnerae6265f2010-05-15 16:27:27 +00001636 v = PyUnicode_EncodeFSDefault(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 if (v == NULL)
1638 return NULL;
1639 }
1640 else if (!PyBytes_Check(v))
1641 continue;
1642 else
1643 Py_INCREF(v);
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 base = PyBytes_AS_STRING(v);
1646 size = PyBytes_GET_SIZE(v);
1647 len = size;
1648 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
1649 Py_DECREF(v);
1650 continue; /* Too long */
1651 }
1652 strcpy(buf, base);
1653 Py_DECREF(v);
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +00001654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 if (strlen(buf) != len) {
1656 continue; /* v contains '\0' */
1657 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 /* sys.path_hooks import hook */
1660 if (p_loader != NULL) {
1661 PyObject *importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 importer = get_path_importer(path_importer_cache,
1664 path_hooks, origv);
1665 if (importer == NULL) {
1666 return NULL;
1667 }
1668 /* Note: importer is a borrowed reference */
1669 if (importer != Py_None) {
1670 PyObject *loader;
1671 loader = PyObject_CallMethod(importer,
1672 "find_module",
1673 "s", fullname);
1674 if (loader == NULL)
1675 return NULL; /* error */
1676 if (loader != Py_None) {
1677 /* a loader was found */
1678 *p_loader = loader;
1679 return &importhookdescr;
1680 }
1681 Py_DECREF(loader);
1682 continue;
1683 }
1684 }
1685 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 if (len > 0 && buf[len-1] != SEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001688#ifdef ALTSEP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 && buf[len-1] != ALTSEP
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 )
1692 buf[len++] = SEP;
1693 strcpy(buf+len, name);
1694 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 /* Check for package import (buf holds a directory name,
1697 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001698#ifdef HAVE_STAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 if (stat(buf, &statbuf) == 0 && /* it exists */
1700 S_ISDIR(statbuf.st_mode) && /* it's a directory */
1701 case_ok(buf, len, namelen, name)) { /* case matches */
1702 if (find_init_module(buf)) { /* and has __init__.py */
1703 return &fd_package;
1704 }
1705 else {
1706 char warnstr[MAXPATHLEN+80];
1707 sprintf(warnstr, "Not importing directory "
1708 "'%.*s': missing __init__.py",
1709 MAXPATHLEN, buf);
1710 if (PyErr_WarnEx(PyExc_ImportWarning,
1711 warnstr, 1)) {
1712 return NULL;
1713 }
1714 }
1715 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001716#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001717#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 /* take a snapshot of the module spec for restoration
1719 * after the 8 character DLL hackery
1720 */
1721 saved_buf = strdup(buf);
1722 saved_len = len;
1723 saved_namelen = namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001724#endif /* PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001726#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 /* OS/2 limits DLLs to 8 character names (w/o
1728 extension)
1729 * so if the name is longer than that and its a
1730 * dynamically loaded module we're going to try,
1731 * truncate the name before trying
1732 */
1733 if (strlen(subname) > 8) {
1734 /* is this an attempt to load a C extension? */
1735 const struct filedescr *scan;
1736 scan = _PyImport_DynLoadFiletab;
1737 while (scan->suffix != NULL) {
1738 if (!strcmp(scan->suffix, fdp->suffix))
1739 break;
1740 else
1741 scan++;
1742 }
1743 if (scan->suffix != NULL) {
1744 /* yes, so truncate the name */
1745 namelen = 8;
1746 len -= strlen(subname) - namelen;
1747 buf[len] = '\0';
1748 }
1749 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001750#endif /* PYOS_OS2 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 strcpy(buf+len, fdp->suffix);
1752 if (Py_VerboseFlag > 1)
1753 PySys_WriteStderr("# trying %s\n", buf);
1754 filemode = fdp->mode;
1755 if (filemode[0] == 'U')
1756 filemode = "r" PY_STDIOTEXTMODE;
1757 fp = fopen(buf, filemode);
1758 if (fp != NULL) {
1759 if (case_ok(buf, len, namelen, name))
1760 break;
1761 else { /* continue search */
1762 fclose(fp);
1763 fp = NULL;
1764 }
1765 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001766#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 /* restore the saved snapshot */
1768 strcpy(buf, saved_buf);
1769 len = saved_len;
1770 namelen = saved_namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001773#if defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 /* don't need/want the module name snapshot anymore */
1775 if (saved_buf)
1776 {
1777 free(saved_buf);
1778 saved_buf = NULL;
1779 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 if (fp != NULL)
1782 break;
1783 }
1784 if (fp == NULL) {
1785 PyErr_Format(PyExc_ImportError,
1786 "No module named %.200s", name);
1787 return NULL;
1788 }
1789 *p_fp = fp;
1790 return fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791}
1792
Martin v. Löwis18e16552006-02-15 17:27:45 +00001793/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001794 * The arguments here are tricky, best shown by example:
1795 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1796 * ^ ^ ^ ^
1797 * |--------------------- buf ---------------------|
1798 * |------------------- len ------------------|
1799 * |------ name -------|
1800 * |----- namelen -----|
1801 * buf is the full path, but len only counts up to (& exclusive of) the
1802 * extension. name is the module name, also exclusive of extension.
1803 *
1804 * We've already done a successful stat() or fopen() on buf, so know that
1805 * there's some match, possibly case-insensitive.
1806 *
Tim Peters50d8d372001-02-28 05:34:27 +00001807 * case_ok() is to return 1 if there's a case-sensitive match for
1808 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1809 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001810 *
Tim Peters50d8d372001-02-28 05:34:27 +00001811 * case_ok() is used to implement case-sensitive import semantics even
1812 * on platforms with case-insensitive filesystems. It's trivial to implement
1813 * for case-sensitive filesystems. It's pretty much a cross-platform
1814 * nightmare for systems with case-insensitive filesystems.
1815 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001816
Tim Peters50d8d372001-02-28 05:34:27 +00001817/* First we may need a pile of platform-specific header files; the sequence
1818 * of #if's here should match the sequence in the body of case_ok().
1819 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001820#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001821#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001822
Tim Peters50d8d372001-02-28 05:34:27 +00001823#elif defined(DJGPP)
1824#include <dir.h>
1825
Jason Tishler7961aa62005-05-20 00:56:54 +00001826#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001827#include <sys/types.h>
1828#include <dirent.h>
1829
Andrew MacIntyred9400542002-02-26 11:41:34 +00001830#elif defined(PYOS_OS2)
1831#define INCL_DOS
1832#define INCL_DOSERRORS
1833#define INCL_NOPMAPI
1834#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001835#endif
1836
Guido van Rossum0980bd91998-02-13 17:18:36 +00001837static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001838case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001839{
Tim Peters50d8d372001-02-28 05:34:27 +00001840/* Pick a platform-specific implementation; the sequence of #if's here should
1841 * match the sequence just above.
1842 */
1843
Jason Tishler7961aa62005-05-20 00:56:54 +00001844/* MS_WINDOWS */
1845#if defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 WIN32_FIND_DATA data;
1847 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 if (Py_GETENV("PYTHONCASEOK") != NULL)
1850 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 h = FindFirstFile(buf, &data);
1853 if (h == INVALID_HANDLE_VALUE) {
1854 PyErr_Format(PyExc_NameError,
1855 "Can't find file for module %.100s\n(filename %.300s)",
1856 name, buf);
1857 return 0;
1858 }
1859 FindClose(h);
1860 return strncmp(data.cFileName, name, namelen) == 0;
Tim Peters50d8d372001-02-28 05:34:27 +00001861
1862/* DJGPP */
1863#elif defined(DJGPP)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 struct ffblk ffblk;
1865 int done;
Tim Peters50d8d372001-02-28 05:34:27 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (Py_GETENV("PYTHONCASEOK") != NULL)
1868 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1871 if (done) {
1872 PyErr_Format(PyExc_NameError,
1873 "Can't find file for module %.100s\n(filename %.300s)",
1874 name, buf);
1875 return 0;
1876 }
1877 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001878
Jason Tishler7961aa62005-05-20 00:56:54 +00001879/* new-fangled macintosh (macosx) or Cygwin */
1880#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 DIR *dirp;
1882 struct dirent *dp;
1883 char dirname[MAXPATHLEN + 1];
1884 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (Py_GETENV("PYTHONCASEOK") != NULL)
1887 return 1;
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 /* Copy the dir component into dirname; substitute "." if empty */
1890 if (dirlen <= 0) {
1891 dirname[0] = '.';
1892 dirname[1] = '\0';
1893 }
1894 else {
1895 assert(dirlen <= MAXPATHLEN);
1896 memcpy(dirname, buf, dirlen);
1897 dirname[dirlen] = '\0';
1898 }
1899 /* Open the directory and search the entries for an exact match. */
1900 dirp = opendir(dirname);
1901 if (dirp) {
1902 char *nameWithExt = buf + len - namelen;
1903 while ((dp = readdir(dirp)) != NULL) {
1904 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001905#ifdef _DIRENT_HAVE_D_NAMELEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001907#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 if (thislen >= namelen &&
1911 strcmp(dp->d_name, nameWithExt) == 0) {
1912 (void)closedir(dirp);
1913 return 1; /* Found */
1914 }
1915 }
1916 (void)closedir(dirp);
1917 }
1918 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001919
Andrew MacIntyred9400542002-02-26 11:41:34 +00001920/* OS/2 */
1921#elif defined(PYOS_OS2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 HDIR hdir = 1;
1923 ULONG srchcnt = 1;
1924 FILEFINDBUF3 ffbuf;
1925 APIRET rc;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 if (Py_GETENV("PYTHONCASEOK") != NULL)
1928 return 1;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 rc = DosFindFirst(buf,
1931 &hdir,
1932 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1933 &ffbuf, sizeof(ffbuf),
1934 &srchcnt,
1935 FIL_STANDARD);
1936 if (rc != NO_ERROR)
1937 return 0;
1938 return strncmp(ffbuf.achName, name, namelen) == 0;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001939
Tim Peters50d8d372001-02-28 05:34:27 +00001940/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001943
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001944#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001945}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001946
Victor Stinnerf52b7052010-08-14 17:06:04 +00001947/* Call _wfopen() on Windows, or fopen() otherwise. Return the new file
1948 object on success, or NULL if the file cannot be open or (if
1949 PyErr_Occurred()) on unicode error */
1950
1951FILE*
1952_Py_fopen(PyObject *unicode, const char *mode)
1953{
1954#ifdef MS_WINDOWS
1955 wchar_t path[MAXPATHLEN+1];
1956 wchar_t wmode[10];
1957 Py_ssize_t len;
1958 int usize;
1959
1960 len = PyUnicode_AsWideChar((PyUnicodeObject*)unicode, path, MAXPATHLEN);
1961 if (len == -1)
1962 return NULL;
1963 path[len] = L'\0';
1964
1965 usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));
1966 if (usize == 0)
1967 return NULL;
1968
1969 return _wfopen(path, wmode);
1970#else
1971 FILE *f;
1972 PyObject *bytes = PyUnicode_EncodeFSDefault(unicode);
1973 if (bytes == NULL)
1974 return NULL;
1975 f = fopen(PyBytes_AS_STRING(bytes), mode);
1976 Py_DECREF(bytes);
1977 return f;
1978#endif
1979}
Guido van Rossum0980bd91998-02-13 17:18:36 +00001980
Guido van Rossum197346f1997-10-31 18:38:52 +00001981#ifdef HAVE_STAT
Victor Stinner4f4402c2010-08-14 14:50:26 +00001982
1983/* Call _wstat() on Windows, or stat() otherwise. Only fill st_mode
1984 attribute on Windows. Return 0 on success, -1 on stat error or (if
1985 PyErr_Occurred()) unicode error. */
1986
1987int
1988_Py_stat(PyObject *unicode, struct stat *statbuf)
1989{
1990#ifdef MS_WINDOWS
1991 wchar_t path[MAXPATHLEN+1];
1992 Py_ssize_t len;
1993 int err;
1994 struct _stat wstatbuf;
1995
Victor Stinner8a79dcc2010-08-14 16:59:08 +00001996 len = PyUnicode_AsWideChar((PyUnicodeObject*)unicode, path, MAXPATHLEN);
Victor Stinner4f4402c2010-08-14 14:50:26 +00001997 if (len == -1)
1998 return -1;
Victor Stinner8a79dcc2010-08-14 16:59:08 +00001999 path[len] = L'\0';
2000
Victor Stinner4f4402c2010-08-14 14:50:26 +00002001 err = _wstat(path, &wstatbuf);
2002 if (!err)
2003 statbuf->st_mode = wstatbuf.st_mode;
2004 return err;
2005#else
2006 int ret;
2007 PyObject *bytes = PyUnicode_EncodeFSDefault(unicode);
2008 if (bytes == NULL)
2009 return -1;
2010 ret = stat(PyBytes_AS_STRING(bytes), statbuf);
2011 Py_DECREF(bytes);
2012 return ret;
2013#endif
2014}
2015
Guido van Rossum197346f1997-10-31 18:38:52 +00002016/* Helper to look for __init__.py or __init__.py[co] in potential package */
2017static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002018find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00002019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 const size_t save_len = strlen(buf);
2021 size_t i = save_len;
2022 char *pname; /* pointer to start of __init__ */
2023 struct stat statbuf;
Guido van Rossum197346f1997-10-31 18:38:52 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025/* For calling case_ok(buf, len, namelen, name):
2026 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
2027 * ^ ^ ^ ^
2028 * |--------------------- buf ---------------------|
2029 * |------------------- len ------------------|
2030 * |------ name -------|
2031 * |----- namelen -----|
Tim Peters0f9431f2001-07-05 03:47:53 +00002032 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 if (save_len + 13 >= MAXPATHLEN)
2034 return 0;
2035 buf[i++] = SEP;
2036 pname = buf + i;
2037 strcpy(pname, "__init__.py");
2038 if (stat(buf, &statbuf) == 0) {
2039 if (case_ok(buf,
2040 save_len + 9, /* len("/__init__") */
2041 8, /* len("__init__") */
2042 pname)) {
2043 buf[save_len] = '\0';
2044 return 1;
2045 }
2046 }
2047 i += strlen(pname);
2048 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
2049 if (stat(buf, &statbuf) == 0) {
2050 if (case_ok(buf,
2051 save_len + 9, /* len("/__init__") */
2052 8, /* len("__init__") */
2053 pname)) {
2054 buf[save_len] = '\0';
2055 return 1;
2056 }
2057 }
2058 buf[save_len] = '\0';
2059 return 0;
Guido van Rossum197346f1997-10-31 18:38:52 +00002060}
Guido van Rossum48a680c2001-03-02 06:34:14 +00002061
Guido van Rossum197346f1997-10-31 18:38:52 +00002062#endif /* HAVE_STAT */
2063
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002064
Tim Petersdbd9ba62000-07-09 03:09:57 +00002065static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002066
Victor Stinner44c6c152010-08-09 00:59:10 +00002067static PyObject*
2068load_builtin(char *name, char *pathname, int type)
2069{
2070 PyObject *m, *modules;
2071 int err;
2072
2073 if (pathname != NULL && pathname[0] != '\0')
2074 name = pathname;
2075
2076 if (type == C_BUILTIN)
2077 err = init_builtin(name);
2078 else
2079 err = PyImport_ImportFrozenModule(name);
2080 if (err < 0)
2081 return NULL;
2082 if (err == 0) {
2083 PyErr_Format(PyExc_ImportError,
2084 "Purported %s module %.200s not found",
2085 type == C_BUILTIN ?
2086 "builtin" : "frozen",
2087 name);
2088 return NULL;
2089 }
2090
2091 modules = PyImport_GetModuleDict();
2092 m = PyDict_GetItemString(modules, name);
2093 if (m == NULL) {
2094 PyErr_Format(
2095 PyExc_ImportError,
2096 "%s module %.200s not properly initialized",
2097 type == C_BUILTIN ?
2098 "builtin" : "frozen",
2099 name);
2100 return NULL;
2101 }
2102 Py_INCREF(m);
2103 return m;
2104}
2105
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002107 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002108
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109static PyObject *
Alexandre Vassalottie223eb82009-07-29 20:12:15 +00002110load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 /* First check that there's an open file (if we need one) */
2115 switch (type) {
2116 case PY_SOURCE:
2117 case PY_COMPILED:
2118 if (fp == NULL) {
2119 PyErr_Format(PyExc_ValueError,
2120 "file object required for import (type code %d)",
2121 type);
2122 return NULL;
2123 }
2124 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 case PY_SOURCE:
2129 m = load_source_module(name, pathname, fp);
2130 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 case PY_COMPILED:
2133 m = load_compiled_module(name, pathname, fp);
2134 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002135
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002136#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 case C_EXTENSION:
2138 m = _PyImport_LoadDynamicModule(name, pathname, fp);
2139 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002140#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 case PKG_DIRECTORY:
2143 m = load_package(name, pathname);
2144 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 case C_BUILTIN:
2147 case PY_FROZEN:
Victor Stinner44c6c152010-08-09 00:59:10 +00002148 m = load_builtin(name, pathname, type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 break;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 case IMP_HOOK: {
2152 if (loader == NULL) {
2153 PyErr_SetString(PyExc_ImportError,
2154 "import hook without loader");
2155 return NULL;
2156 }
2157 m = PyObject_CallMethod(loader, "load_module", "s", name);
2158 break;
2159 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 default:
2162 PyErr_Format(PyExc_ImportError,
2163 "Don't know how to import %.200s (type code %d)",
2164 name, type);
2165 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002170}
2171
2172
2173/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00002174 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002176
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002177static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002178init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 if (_PyImport_FindExtension(name, name) != NULL)
2183 return 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 for (p = PyImport_Inittab; p->name != NULL; p++) {
2186 PyObject *mod;
2187 if (strcmp(name, p->name) == 0) {
2188 if (p->initfunc == NULL) {
2189 PyErr_Format(PyExc_ImportError,
2190 "Cannot re-init internal module %.200s",
2191 name);
2192 return -1;
2193 }
2194 if (Py_VerboseFlag)
2195 PySys_WriteStderr("import %s # builtin\n", name);
2196 mod = (*p->initfunc)();
2197 if (mod == 0)
2198 return -1;
2199 if (_PyImport_FixupExtension(mod, name, name) < 0)
2200 return -1;
2201 /* FixupExtension has put the module into sys.modules,
2202 so we can release our own reference. */
2203 Py_DECREF(mod);
2204 return 1;
2205 }
2206 }
2207 return 0;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00002208}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002209
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002211/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002212
Guido van Rossumcfd0a221996-06-17 17:06:34 +00002213static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002214find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 if (!name)
2219 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 for (p = PyImport_FrozenModules; ; p++) {
2222 if (p->name == NULL)
2223 return NULL;
2224 if (strcmp(p->name, name) == 0)
2225 break;
2226 }
2227 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002228}
2229
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002231get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 struct _frozen *p = find_frozen(name);
2234 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 if (p == NULL) {
2237 PyErr_Format(PyExc_ImportError,
2238 "No such frozen object named %.200s",
2239 name);
2240 return NULL;
2241 }
2242 if (p->code == NULL) {
2243 PyErr_Format(PyExc_ImportError,
2244 "Excluded frozen object named %.200s",
2245 name);
2246 return NULL;
2247 }
2248 size = p->size;
2249 if (size < 0)
2250 size = -size;
2251 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002252}
2253
Brett Cannon8d110132009-03-15 02:20:16 +00002254static PyObject *
2255is_frozen_package(char *name)
2256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 struct _frozen *p = find_frozen(name);
2258 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (p == NULL) {
2261 PyErr_Format(PyExc_ImportError,
2262 "No such frozen object named %.200s",
2263 name);
2264 return NULL;
2265 }
Brett Cannon8d110132009-03-15 02:20:16 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 if (size < 0)
2270 Py_RETURN_TRUE;
2271 else
2272 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00002273}
2274
2275
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002276/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00002277 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002278 an exception set if the initialization failed.
2279 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00002280
2281int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 struct _frozen *p = find_frozen(name);
2285 PyObject *co;
2286 PyObject *m;
2287 int ispackage;
2288 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 if (p == NULL)
2291 return 0;
2292 if (p->code == NULL) {
2293 PyErr_Format(PyExc_ImportError,
2294 "Excluded frozen object named %.200s",
2295 name);
2296 return -1;
2297 }
2298 size = p->size;
2299 ispackage = (size < 0);
2300 if (ispackage)
2301 size = -size;
2302 if (Py_VerboseFlag)
2303 PySys_WriteStderr("import %s # frozen%s\n",
2304 name, ispackage ? " package" : "");
2305 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
2306 if (co == NULL)
2307 return -1;
2308 if (!PyCode_Check(co)) {
2309 PyErr_Format(PyExc_TypeError,
2310 "frozen object %.200s is not a code object",
2311 name);
2312 goto err_return;
2313 }
2314 if (ispackage) {
2315 /* Set __path__ to the package name */
2316 PyObject *d, *s, *l;
2317 int err;
2318 m = PyImport_AddModule(name);
2319 if (m == NULL)
2320 goto err_return;
2321 d = PyModule_GetDict(m);
2322 s = PyUnicode_InternFromString(name);
2323 if (s == NULL)
2324 goto err_return;
2325 l = PyList_New(1);
2326 if (l == NULL) {
2327 Py_DECREF(s);
2328 goto err_return;
2329 }
2330 PyList_SET_ITEM(l, 0, s);
2331 err = PyDict_SetItemString(d, "__path__", l);
2332 Py_DECREF(l);
2333 if (err != 0)
2334 goto err_return;
2335 }
2336 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
2337 if (m == NULL)
2338 goto err_return;
2339 Py_DECREF(co);
2340 Py_DECREF(m);
2341 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002342err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 Py_DECREF(co);
2344 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00002345}
Guido van Rossum74e6a111994-08-29 12:54:38 +00002346
2347
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002348/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002349 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00002350
Guido van Rossum79f25d91997-04-29 20:08:16 +00002351PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002352PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00002353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 PyObject *pname;
2355 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 pname = PyUnicode_FromString(name);
2358 if (pname == NULL)
2359 return NULL;
2360 result = PyImport_Import(pname);
2361 Py_DECREF(pname);
2362 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002363}
2364
Christian Heimes072c0f12008-01-03 23:01:04 +00002365/* Import a module without blocking
2366 *
2367 * At first it tries to fetch the module from sys.modules. If the module was
2368 * never loaded before it loads it with PyImport_ImportModule() unless another
2369 * thread holds the import lock. In the latter case the function raises an
2370 * ImportError instead of blocking.
2371 *
2372 * Returns the module object with incremented ref count.
2373 */
2374PyObject *
2375PyImport_ImportModuleNoBlock(const char *name)
2376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 PyObject *result;
2378 PyObject *modules;
2379 long me;
Christian Heimes072c0f12008-01-03 23:01:04 +00002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 /* Try to get the module from sys.modules[name] */
2382 modules = PyImport_GetModuleDict();
2383 if (modules == NULL)
2384 return NULL;
Christian Heimes072c0f12008-01-03 23:01:04 +00002385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 result = PyDict_GetItemString(modules, name);
2387 if (result != NULL) {
2388 Py_INCREF(result);
2389 return result;
2390 }
2391 else {
2392 PyErr_Clear();
2393 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002394#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 /* check the import lock
2396 * me might be -1 but I ignore the error here, the lock function
2397 * takes care of the problem */
2398 me = PyThread_get_thread_ident();
2399 if (import_lock_thread == -1 || import_lock_thread == me) {
2400 /* no thread or me is holding the lock */
2401 return PyImport_ImportModule(name);
2402 }
2403 else {
2404 PyErr_Format(PyExc_ImportError,
2405 "Failed to import %.200s because the import lock"
2406 "is held by another thread.",
2407 name);
2408 return NULL;
2409 }
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002410#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 return PyImport_ImportModule(name);
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002412#endif
Christian Heimes072c0f12008-01-03 23:01:04 +00002413}
2414
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002415/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002416static PyObject *get_parent(PyObject *globals, char *buf,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002418static PyObject *load_next(PyObject *mod, PyObject *altmod,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002420static int mark_miss(char *name);
2421static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00002423static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002424
2425/* The Magnum Opus of dotted-name import :-) */
2426
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002427static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002428import_module_level(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 char buf[MAXPATHLEN+1];
2432 Py_ssize_t buflen = 0;
2433 PyObject *parent, *head, *next, *tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (strchr(name, '/') != NULL
Christian Heimes454f37b2008-01-10 00:10:02 +00002436#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 || strchr(name, '\\') != NULL
Christian Heimes454f37b2008-01-10 00:10:02 +00002438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 ) {
2440 PyErr_SetString(PyExc_ImportError,
2441 "Import by filename is not supported.");
2442 return NULL;
2443 }
Christian Heimes454f37b2008-01-10 00:10:02 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 parent = get_parent(globals, buf, &buflen, level);
2446 if (parent == NULL)
2447 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002448
Benjamin Peterson556d8002010-06-27 22:37:28 +00002449 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
2450 &buflen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (head == NULL)
2452 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 tail = head;
2455 Py_INCREF(tail);
2456 while (name) {
2457 next = load_next(tail, tail, &name, buf, &buflen);
2458 Py_DECREF(tail);
2459 if (next == NULL) {
2460 Py_DECREF(head);
2461 return NULL;
2462 }
2463 tail = next;
2464 }
2465 if (tail == Py_None) {
2466 /* If tail is Py_None, both get_parent and load_next found
2467 an empty module name: someone called __import__("") or
2468 doctored faulty bytecode */
2469 Py_DECREF(tail);
2470 Py_DECREF(head);
2471 PyErr_SetString(PyExc_ValueError,
2472 "Empty module name");
2473 return NULL;
2474 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 if (fromlist != NULL) {
2477 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2478 fromlist = NULL;
2479 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 if (fromlist == NULL) {
2482 Py_DECREF(tail);
2483 return head;
2484 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 Py_DECREF(head);
2487 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
2488 Py_DECREF(tail);
2489 return NULL;
2490 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 return tail;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002493}
2494
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002495PyObject *
2496PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 PyObject *fromlist, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 PyObject *result;
2500 _PyImport_AcquireLock();
2501 result = import_module_level(name, globals, locals, fromlist, level);
2502 if (_PyImport_ReleaseLock() < 0) {
2503 Py_XDECREF(result);
2504 PyErr_SetString(PyExc_RuntimeError,
2505 "not holding the import lock");
2506 return NULL;
2507 }
2508 return result;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002509}
2510
Fred Drake87590902004-05-28 20:21:36 +00002511/* Return the package that an import is being performed in. If globals comes
2512 from the module foo.bar.bat (not itself a package), this returns the
2513 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002514 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002515
2516 The *name* of the returned package is returned in buf, with the length of
2517 the name in *p_buflen.
2518
2519 If globals doesn't come from a package or a module in a package, or a
2520 corresponding entry is not found in sys.modules, Py_None is returned.
2521*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002522static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002523get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 static PyObject *namestr = NULL;
2526 static PyObject *pathstr = NULL;
2527 static PyObject *pkgstr = NULL;
2528 PyObject *pkgname, *modname, *modpath, *modules, *parent;
2529 int orig_level = level;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 if (globals == NULL || !PyDict_Check(globals) || !level)
2532 return Py_None;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (namestr == NULL) {
2535 namestr = PyUnicode_InternFromString("__name__");
2536 if (namestr == NULL)
2537 return NULL;
2538 }
2539 if (pathstr == NULL) {
2540 pathstr = PyUnicode_InternFromString("__path__");
2541 if (pathstr == NULL)
2542 return NULL;
2543 }
2544 if (pkgstr == NULL) {
2545 pkgstr = PyUnicode_InternFromString("__package__");
2546 if (pkgstr == NULL)
2547 return NULL;
2548 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 *buf = '\0';
2551 *p_buflen = 0;
2552 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 if ((pkgname != NULL) && (pkgname != Py_None)) {
2555 /* __package__ is set, so use it */
2556 char *pkgname_str;
2557 Py_ssize_t len;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (!PyUnicode_Check(pkgname)) {
2560 PyErr_SetString(PyExc_ValueError,
2561 "__package__ set to non-string");
2562 return NULL;
2563 }
2564 pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
2565 if (len == 0) {
2566 if (level > 0) {
2567 PyErr_SetString(PyExc_ValueError,
2568 "Attempted relative import in non-package");
2569 return NULL;
2570 }
2571 return Py_None;
2572 }
2573 if (len > MAXPATHLEN) {
2574 PyErr_SetString(PyExc_ValueError,
2575 "Package name too long");
2576 return NULL;
2577 }
2578 strcpy(buf, pkgname_str);
2579 } else {
2580 /* __package__ not set, so figure it out and set it */
2581 modname = PyDict_GetItem(globals, namestr);
2582 if (modname == NULL || !PyUnicode_Check(modname))
2583 return Py_None;
Brett Cannon9a5b25a2010-03-01 02:09:17 +00002584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 modpath = PyDict_GetItem(globals, pathstr);
2586 if (modpath != NULL) {
2587 /* __path__ is set, so modname is already the package name */
2588 char *modname_str;
2589 Py_ssize_t len;
2590 int error;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 modname_str = _PyUnicode_AsStringAndSize(modname, &len);
2593 if (len > MAXPATHLEN) {
2594 PyErr_SetString(PyExc_ValueError,
2595 "Module name too long");
2596 return NULL;
2597 }
2598 strcpy(buf, modname_str);
2599 error = PyDict_SetItem(globals, pkgstr, modname);
2600 if (error) {
2601 PyErr_SetString(PyExc_ValueError,
2602 "Could not set __package__");
2603 return NULL;
2604 }
2605 } else {
2606 /* Normal module, so work out the package name if any */
2607 char *start = _PyUnicode_AsString(modname);
2608 char *lastdot = strrchr(start, '.');
2609 size_t len;
2610 int error;
2611 if (lastdot == NULL && level > 0) {
2612 PyErr_SetString(PyExc_ValueError,
2613 "Attempted relative import in non-package");
2614 return NULL;
2615 }
2616 if (lastdot == NULL) {
2617 error = PyDict_SetItem(globals, pkgstr, Py_None);
2618 if (error) {
2619 PyErr_SetString(PyExc_ValueError,
2620 "Could not set __package__");
2621 return NULL;
2622 }
2623 return Py_None;
2624 }
2625 len = lastdot - start;
2626 if (len >= MAXPATHLEN) {
2627 PyErr_SetString(PyExc_ValueError,
2628 "Module name too long");
2629 return NULL;
2630 }
2631 strncpy(buf, start, len);
2632 buf[len] = '\0';
2633 pkgname = PyUnicode_FromString(buf);
2634 if (pkgname == NULL) {
2635 return NULL;
2636 }
2637 error = PyDict_SetItem(globals, pkgstr, pkgname);
2638 Py_DECREF(pkgname);
2639 if (error) {
2640 PyErr_SetString(PyExc_ValueError,
2641 "Could not set __package__");
2642 return NULL;
2643 }
2644 }
2645 }
2646 while (--level > 0) {
2647 char *dot = strrchr(buf, '.');
2648 if (dot == NULL) {
2649 PyErr_SetString(PyExc_ValueError,
2650 "Attempted relative import beyond "
2651 "toplevel package");
2652 return NULL;
2653 }
2654 *dot = '\0';
2655 }
2656 *p_buflen = strlen(buf);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 modules = PyImport_GetModuleDict();
2659 parent = PyDict_GetItemString(modules, buf);
2660 if (parent == NULL) {
2661 if (orig_level < 1) {
2662 PyObject *err_msg = PyBytes_FromFormat(
2663 "Parent module '%.200s' not found "
2664 "while handling absolute import", buf);
2665 if (err_msg == NULL) {
2666 return NULL;
2667 }
2668 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
2669 PyBytes_AsString(err_msg), 1)) {
2670 *buf = '\0';
2671 *p_buflen = 0;
2672 parent = Py_None;
2673 }
2674 Py_DECREF(err_msg);
2675 } else {
2676 PyErr_Format(PyExc_SystemError,
2677 "Parent module '%.200s' not loaded, "
2678 "cannot perform relative import", buf);
2679 }
2680 }
2681 return parent;
2682 /* We expect, but can't guarantee, if parent != None, that:
2683 - parent.__name__ == buf
2684 - parent.__dict__ is globals
2685 If this is violated... Who cares? */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002686}
2687
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002688/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002689static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002690load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 char *name = *p_name;
2694 char *dot = strchr(name, '.');
2695 size_t len;
2696 char *p;
2697 PyObject *result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 if (strlen(name) == 0) {
2700 /* completely empty module name should only happen in
2701 'from . import' (or '__import__("")')*/
2702 Py_INCREF(mod);
2703 *p_name = NULL;
2704 return mod;
2705 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 if (dot == NULL) {
2708 *p_name = NULL;
2709 len = strlen(name);
2710 }
2711 else {
2712 *p_name = dot+1;
2713 len = dot-name;
2714 }
2715 if (len == 0) {
2716 PyErr_SetString(PyExc_ValueError,
2717 "Empty module name");
2718 return NULL;
2719 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 p = buf + *p_buflen;
2722 if (p != buf)
2723 *p++ = '.';
2724 if (p+len-buf >= MAXPATHLEN) {
2725 PyErr_SetString(PyExc_ValueError,
2726 "Module name too long");
2727 return NULL;
2728 }
2729 strncpy(p, name, len);
2730 p[len] = '\0';
2731 *p_buflen = p+len-buf;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 result = import_submodule(mod, p, buf);
2734 if (result == Py_None && altmod != mod) {
2735 Py_DECREF(result);
2736 /* Here, altmod must be None and mod must not be None */
2737 result = import_submodule(altmod, p, p);
2738 if (result != NULL && result != Py_None) {
2739 if (mark_miss(buf) != 0) {
2740 Py_DECREF(result);
2741 return NULL;
2742 }
2743 strncpy(buf, name, len);
2744 buf[len] = '\0';
2745 *p_buflen = len;
2746 }
2747 }
2748 if (result == NULL)
2749 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 if (result == Py_None) {
2752 Py_DECREF(result);
2753 PyErr_Format(PyExc_ImportError,
2754 "No module named %.200s", name);
2755 return NULL;
2756 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 return result;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002759}
2760
2761static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002762mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 PyObject *modules = PyImport_GetModuleDict();
2765 return PyDict_SetItemString(modules, name, Py_None);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002766}
2767
2768static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002769ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 int i;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 if (!PyObject_HasAttrString(mod, "__path__"))
2775 return 1;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 for (i = 0; ; i++) {
2778 PyObject *item = PySequence_GetItem(fromlist, i);
2779 int hasit;
2780 if (item == NULL) {
2781 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2782 PyErr_Clear();
2783 return 1;
2784 }
2785 return 0;
2786 }
2787 if (!PyUnicode_Check(item)) {
2788 PyErr_SetString(PyExc_TypeError,
2789 "Item in ``from list'' not a string");
2790 Py_DECREF(item);
2791 return 0;
2792 }
2793 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
2794 PyObject *all;
2795 Py_DECREF(item);
2796 /* See if the package defines __all__ */
2797 if (recursive)
2798 continue; /* Avoid endless recursion */
2799 all = PyObject_GetAttrString(mod, "__all__");
2800 if (all == NULL)
2801 PyErr_Clear();
2802 else {
2803 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
2804 Py_DECREF(all);
2805 if (!ret)
2806 return 0;
2807 }
2808 continue;
2809 }
2810 hasit = PyObject_HasAttr(mod, item);
2811 if (!hasit) {
2812 PyObject *item8;
2813 char *subname;
2814 PyObject *submod;
2815 char *p;
Victor Stinnerae6265f2010-05-15 16:27:27 +00002816 item8 = PyUnicode_EncodeFSDefault(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 if (!item8) {
2818 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2819 return 0;
2820 }
2821 subname = PyBytes_AS_STRING(item8);
2822 if (buflen + strlen(subname) >= MAXPATHLEN) {
2823 PyErr_SetString(PyExc_ValueError,
2824 "Module name too long");
2825 Py_DECREF(item);
2826 return 0;
2827 }
2828 p = buf + buflen;
2829 *p++ = '.';
2830 strcpy(p, subname);
2831 submod = import_submodule(mod, subname, buf);
2832 Py_DECREF(item8);
2833 Py_XDECREF(submod);
2834 if (submod == NULL) {
2835 Py_DECREF(item);
2836 return 0;
2837 }
2838 }
2839 Py_DECREF(item);
2840 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002843}
2844
Neil Schemenauer00b09662003-06-16 21:03:07 +00002845static int
2846add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 PyObject *modules)
Neil Schemenauer00b09662003-06-16 21:03:07 +00002848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (mod == Py_None)
2850 return 1;
2851 /* Irrespective of the success of this load, make a
2852 reference to it in the parent package module. A copy gets
2853 saved in the modules dictionary under the full name, so get a
2854 reference from there, if need be. (The exception is when the
2855 load failed with a SyntaxError -- then there's no trace in
2856 sys.modules. In that case, of course, do nothing extra.) */
2857 if (submod == NULL) {
2858 submod = PyDict_GetItemString(modules, fullname);
2859 if (submod == NULL)
2860 return 1;
2861 }
2862 if (PyModule_Check(mod)) {
2863 /* We can't use setattr here since it can give a
2864 * spurious warning if the submodule name shadows a
2865 * builtin name */
2866 PyObject *dict = PyModule_GetDict(mod);
2867 if (!dict)
2868 return 0;
2869 if (PyDict_SetItemString(dict, subname, submod) < 0)
2870 return 0;
2871 }
2872 else {
2873 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2874 return 0;
2875 }
2876 return 1;
Neil Schemenauer00b09662003-06-16 21:03:07 +00002877}
2878
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002879static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 PyObject *modules = PyImport_GetModuleDict();
2883 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 /* Require:
2886 if mod == None: subname == fullname
2887 else: mod.__name__ + "." + subname == fullname
2888 */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
2891 Py_INCREF(m);
2892 }
2893 else {
2894 PyObject *path, *loader = NULL;
2895 char buf[MAXPATHLEN+1];
2896 struct filedescr *fdp;
2897 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 if (mod == Py_None)
2900 path = NULL;
2901 else {
2902 path = PyObject_GetAttrString(mod, "__path__");
2903 if (path == NULL) {
2904 PyErr_Clear();
2905 Py_INCREF(Py_None);
2906 return Py_None;
2907 }
2908 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 buf[0] = '\0';
2911 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2912 &fp, &loader);
2913 Py_XDECREF(path);
2914 if (fdp == NULL) {
2915 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2916 return NULL;
2917 PyErr_Clear();
2918 Py_INCREF(Py_None);
2919 return Py_None;
2920 }
2921 m = load_module(fullname, fp, buf, fdp->type, loader);
2922 Py_XDECREF(loader);
2923 if (fp)
2924 fclose(fp);
2925 if (!add_submodule(mod, m, fullname, subname, modules)) {
2926 Py_XDECREF(m);
2927 m = NULL;
2928 }
2929 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002932}
2933
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002934
2935/* Re-import a module of any kind and return its module object, WITH
2936 INCREMENTED REFERENCE COUNT */
2937
Guido van Rossum79f25d91997-04-29 20:08:16 +00002938PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002939PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 PyInterpreterState *interp = PyThreadState_Get()->interp;
2942 PyObject *modules_reloading = interp->modules_reloading;
2943 PyObject *modules = PyImport_GetModuleDict();
2944 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
2945 char *name, *subname;
2946 char buf[MAXPATHLEN+1];
2947 struct filedescr *fdp;
2948 FILE *fp = NULL;
2949 PyObject *newm;
Brett Cannon9a5b25a2010-03-01 02:09:17 +00002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 if (modules_reloading == NULL) {
2952 Py_FatalError("PyImport_ReloadModule: "
2953 "no modules_reloading dictionary!");
2954 return NULL;
2955 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 if (m == NULL || !PyModule_Check(m)) {
2958 PyErr_SetString(PyExc_TypeError,
2959 "reload() argument must be module");
2960 return NULL;
2961 }
2962 name = (char*)PyModule_GetName(m);
2963 if (name == NULL)
2964 return NULL;
2965 if (m != PyDict_GetItemString(modules, name)) {
2966 PyErr_Format(PyExc_ImportError,
2967 "reload(): module %.200s not in sys.modules",
2968 name);
2969 return NULL;
2970 }
2971 existing_m = PyDict_GetItemString(modules_reloading, name);
2972 if (existing_m != NULL) {
2973 /* Due to a recursive reload, this module is already
2974 being reloaded. */
2975 Py_INCREF(existing_m);
2976 return existing_m;
2977 }
2978 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2979 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 subname = strrchr(name, '.');
2982 if (subname == NULL)
2983 subname = name;
2984 else {
2985 PyObject *parentname, *parent;
2986 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
2987 if (parentname == NULL) {
2988 imp_modules_reloading_clear();
2989 return NULL;
2990 }
2991 parent = PyDict_GetItem(modules, parentname);
2992 if (parent == NULL) {
2993 PyErr_Format(PyExc_ImportError,
2994 "reload(): parent %U not in sys.modules",
2995 parentname);
2996 Py_DECREF(parentname);
2997 imp_modules_reloading_clear();
2998 return NULL;
2999 }
3000 Py_DECREF(parentname);
3001 subname++;
3002 path = PyObject_GetAttrString(parent, "__path__");
3003 if (path == NULL)
3004 PyErr_Clear();
3005 }
3006 buf[0] = '\0';
3007 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
3008 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00003009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003010 if (fdp == NULL) {
3011 Py_XDECREF(loader);
3012 imp_modules_reloading_clear();
3013 return NULL;
3014 }
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00003015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 newm = load_module(name, fp, buf, fdp->type, loader);
3017 Py_XDECREF(loader);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00003018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 if (fp)
3020 fclose(fp);
3021 if (newm == NULL) {
3022 /* load_module probably removed name from modules because of
3023 * the error. Put back the original module object. We're
3024 * going to return NULL in this case regardless of whether
3025 * replacing name succeeds, so the return value is ignored.
3026 */
3027 PyDict_SetItemString(modules, name, m);
3028 }
3029 imp_modules_reloading_clear();
3030 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003031}
3032
3033
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003034/* Higher-level import emulator which emulates the "import" statement
3035 more accurately -- it invokes the __import__() function from the
3036 builtins of the current globals. This means that the import is
3037 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00003038 environment, e.g. by "rexec".
3039 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00003040 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00003041 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003042
3043PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003044PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 static PyObject *silly_list = NULL;
3047 static PyObject *builtins_str = NULL;
3048 static PyObject *import_str = NULL;
3049 PyObject *globals = NULL;
3050 PyObject *import = NULL;
3051 PyObject *builtins = NULL;
3052 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 /* Initialize constant string objects */
3055 if (silly_list == NULL) {
3056 import_str = PyUnicode_InternFromString("__import__");
3057 if (import_str == NULL)
3058 return NULL;
3059 builtins_str = PyUnicode_InternFromString("__builtins__");
3060 if (builtins_str == NULL)
3061 return NULL;
3062 silly_list = Py_BuildValue("[s]", "__doc__");
3063 if (silly_list == NULL)
3064 return NULL;
3065 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 /* Get the builtins from current globals */
3068 globals = PyEval_GetGlobals();
3069 if (globals != NULL) {
3070 Py_INCREF(globals);
3071 builtins = PyObject_GetItem(globals, builtins_str);
3072 if (builtins == NULL)
3073 goto err;
3074 }
3075 else {
3076 /* No globals -- use standard builtins, and fake globals */
3077 builtins = PyImport_ImportModuleLevel("builtins",
3078 NULL, NULL, NULL, 0);
3079 if (builtins == NULL)
3080 return NULL;
3081 globals = Py_BuildValue("{OO}", builtins_str, builtins);
3082 if (globals == NULL)
3083 goto err;
3084 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 /* Get the __import__ function from the builtins */
3087 if (PyDict_Check(builtins)) {
3088 import = PyObject_GetItem(builtins, import_str);
3089 if (import == NULL)
3090 PyErr_SetObject(PyExc_KeyError, import_str);
3091 }
3092 else
3093 import = PyObject_GetAttr(builtins, import_str);
3094 if (import == NULL)
3095 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 /* Call the __import__ function with the proper argument list
3098 * Always use absolute import here. */
3099 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
3100 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003101
3102 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 Py_XDECREF(globals);
3104 Py_XDECREF(builtins);
3105 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00003106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00003108}
3109
3110
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003111/* Module 'imp' provides Python access to the primitives used for
3112 importing modules.
3113*/
3114
Guido van Rossum79f25d91997-04-29 20:08:16 +00003115static PyObject *
Barry Warsaw28a691b2010-04-17 00:19:56 +00003116imp_make_magic(long magic)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 char buf[4];
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 buf[0] = (char) ((magic >> 0) & 0xff);
3121 buf[1] = (char) ((magic >> 8) & 0xff);
3122 buf[2] = (char) ((magic >> 16) & 0xff);
3123 buf[3] = (char) ((magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 return PyBytes_FromStringAndSize(buf, 4);
3126};
Barry Warsaw28a691b2010-04-17 00:19:56 +00003127
3128static PyObject *
3129imp_get_magic(PyObject *self, PyObject *noargs)
3130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 return imp_make_magic(pyc_magic);
Barry Warsaw28a691b2010-04-17 00:19:56 +00003132}
3133
3134static PyObject *
3135imp_get_tag(PyObject *self, PyObject *noargs)
3136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 return PyUnicode_FromString(pyc_tag);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003138}
3139
Guido van Rossum79f25d91997-04-29 20:08:16 +00003140static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003141imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 PyObject *list;
3144 struct filedescr *fdp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 list = PyList_New(0);
3147 if (list == NULL)
3148 return NULL;
3149 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
3150 PyObject *item = Py_BuildValue("ssi",
3151 fdp->suffix, fdp->mode, fdp->type);
3152 if (item == NULL) {
3153 Py_DECREF(list);
3154 return NULL;
3155 }
3156 if (PyList_Append(list, item) < 0) {
3157 Py_DECREF(list);
3158 Py_DECREF(item);
3159 return NULL;
3160 }
3161 Py_DECREF(item);
3162 }
3163 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003164}
3165
Guido van Rossum79f25d91997-04-29 20:08:16 +00003166static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003167call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 extern int fclose(FILE *);
3170 PyObject *fob, *ret;
3171 PyObject *pathobj;
3172 struct filedescr *fdp;
3173 char pathname[MAXPATHLEN+1];
3174 FILE *fp = NULL;
3175 int fd = -1;
3176 char *found_encoding = NULL;
3177 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 pathname[0] = '\0';
3180 if (path == Py_None)
3181 path = NULL;
3182 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
3183 if (fdp == NULL)
3184 return NULL;
3185 if (fp != NULL) {
3186 fd = fileno(fp);
3187 if (fd != -1)
3188 fd = dup(fd);
3189 fclose(fp);
3190 fp = NULL;
3191 }
3192 if (fd != -1) {
3193 if (strchr(fdp->mode, 'b') == NULL) {
3194 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
3195 memory. */
3196 found_encoding = PyTokenizer_FindEncoding(fd);
3197 lseek(fd, 0, 0); /* Reset position */
3198 if (found_encoding == NULL && PyErr_Occurred())
3199 return NULL;
3200 encoding = (found_encoding != NULL) ? found_encoding :
3201 (char*)PyUnicode_GetDefaultEncoding();
3202 }
3203 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
3204 (char*)encoding, NULL, NULL, 1);
3205 if (fob == NULL) {
3206 close(fd);
3207 PyMem_FREE(found_encoding);
3208 return NULL;
3209 }
3210 }
3211 else {
3212 fob = Py_None;
3213 Py_INCREF(fob);
3214 }
3215 pathobj = PyUnicode_DecodeFSDefault(pathname);
3216 ret = Py_BuildValue("NN(ssi)",
3217 fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
3218 PyMem_FREE(found_encoding);
Brett Cannon3bb42d92007-10-20 03:43:15 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 return ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003221}
3222
Guido van Rossum79f25d91997-04-29 20:08:16 +00003223static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003224imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 char *name;
3227 PyObject *ret, *path = NULL;
3228 if (!PyArg_ParseTuple(args, "es|O:find_module",
3229 Py_FileSystemDefaultEncoding, &name,
3230 &path))
3231 return NULL;
3232 ret = call_find_module(name, path);
3233 PyMem_Free(name);
3234 return ret;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003235}
3236
3237static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003238imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 char *name;
3241 int ret;
3242 PyObject *m;
3243 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
3244 return NULL;
3245 ret = init_builtin(name);
3246 if (ret < 0)
3247 return NULL;
3248 if (ret == 0) {
3249 Py_INCREF(Py_None);
3250 return Py_None;
3251 }
3252 m = PyImport_AddModule(name);
3253 Py_XINCREF(m);
3254 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003255}
3256
Guido van Rossum79f25d91997-04-29 20:08:16 +00003257static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003258imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 char *name;
3261 int ret;
3262 PyObject *m;
3263 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
3264 return NULL;
3265 ret = PyImport_ImportFrozenModule(name);
3266 if (ret < 0)
3267 return NULL;
3268 if (ret == 0) {
3269 Py_INCREF(Py_None);
3270 return Py_None;
3271 }
3272 m = PyImport_AddModule(name);
3273 Py_XINCREF(m);
3274 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003275}
3276
Guido van Rossum79f25d91997-04-29 20:08:16 +00003277static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003278imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00003281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
3283 return NULL;
3284 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00003285}
3286
Guido van Rossum79f25d91997-04-29 20:08:16 +00003287static PyObject *
Brett Cannon8d110132009-03-15 02:20:16 +00003288imp_is_frozen_package(PyObject *self, PyObject *args)
3289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 char *name;
Brett Cannon8d110132009-03-15 02:20:16 +00003291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
3293 return NULL;
3294 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00003295}
3296
3297static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003298imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 char *name;
3301 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
3302 return NULL;
3303 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003304}
3305
Guido van Rossum79f25d91997-04-29 20:08:16 +00003306static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 char *name;
3310 struct _frozen *p;
3311 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
3312 return NULL;
3313 p = find_frozen(name);
3314 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003315}
3316
3317static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003318get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 FILE *fp;
3321 if (mode[0] == 'U')
3322 mode = "r" PY_STDIOTEXTMODE;
3323 if (fob == NULL) {
3324 fp = fopen(pathname, mode);
3325 }
3326 else {
3327 int fd = PyObject_AsFileDescriptor(fob);
3328 if (fd == -1)
3329 return NULL;
3330 if (!_PyVerify_fd(fd))
3331 goto error;
3332 /* the FILE struct gets a new fd, so that it can be closed
3333 * independently of the file descriptor given
3334 */
3335 fd = dup(fd);
3336 if (fd == -1)
3337 goto error;
3338 fp = fdopen(fd, mode);
3339 }
3340 if (fp)
3341 return fp;
Kristján Valur Jónssone1b04452009-03-31 17:43:39 +00003342error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 PyErr_SetFromErrno(PyExc_IOError);
3344 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003345}
3346
Guido van Rossum79f25d91997-04-29 20:08:16 +00003347static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003348imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 char *name;
3351 char *pathname;
3352 PyObject *fob = NULL;
3353 PyObject *m;
3354 FILE *fp;
3355 if (!PyArg_ParseTuple(args, "ses|O:load_compiled",
3356 &name,
3357 Py_FileSystemDefaultEncoding, &pathname,
3358 &fob))
3359 return NULL;
3360 fp = get_file(pathname, fob, "rb");
3361 if (fp == NULL) {
3362 PyMem_Free(pathname);
3363 return NULL;
3364 }
3365 m = load_compiled_module(name, pathname, fp);
3366 fclose(fp);
3367 PyMem_Free(pathname);
3368 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003369}
3370
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003371#ifdef HAVE_DYNAMIC_LOADING
3372
Guido van Rossum79f25d91997-04-29 20:08:16 +00003373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003374imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 char *name;
3377 char *pathname;
3378 PyObject *fob = NULL;
3379 PyObject *m;
3380 FILE *fp = NULL;
3381 if (!PyArg_ParseTuple(args, "ses|O:load_dynamic",
3382 &name,
3383 Py_FileSystemDefaultEncoding, &pathname,
3384 &fob))
3385 return NULL;
3386 if (fob) {
3387 fp = get_file(pathname, fob, "r");
3388 if (fp == NULL) {
3389 PyMem_Free(pathname);
3390 return NULL;
3391 }
3392 }
3393 m = _PyImport_LoadDynamicModule(name, pathname, fp);
3394 PyMem_Free(pathname);
3395 if (fp)
3396 fclose(fp);
3397 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003398}
3399
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003400#endif /* HAVE_DYNAMIC_LOADING */
3401
Guido van Rossum79f25d91997-04-29 20:08:16 +00003402static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003403imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 char *name;
3406 char *pathname;
3407 PyObject *fob = NULL;
3408 PyObject *m;
3409 FILE *fp;
3410 if (!PyArg_ParseTuple(args, "ses|O:load_source",
3411 &name,
3412 Py_FileSystemDefaultEncoding, &pathname,
3413 &fob))
3414 return NULL;
3415 fp = get_file(pathname, fob, "r");
3416 if (fp == NULL) {
3417 PyMem_Free(pathname);
3418 return NULL;
3419 }
3420 m = load_source_module(name, pathname, fp);
3421 PyMem_Free(pathname);
3422 fclose(fp);
3423 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003424}
3425
Guido van Rossum79f25d91997-04-29 20:08:16 +00003426static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 char *name;
3430 PyObject *fob;
3431 char *pathname;
3432 PyObject * ret;
3433 char *suffix; /* Unused */
3434 char *mode;
3435 int type;
3436 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 if (!PyArg_ParseTuple(args, "sOes(ssi):load_module",
3439 &name, &fob,
3440 Py_FileSystemDefaultEncoding, &pathname,
3441 &suffix, &mode, &type))
3442 return NULL;
3443 if (*mode) {
3444 /* Mode must start with 'r' or 'U' and must not contain '+'.
3445 Implicit in this test is the assumption that the mode
3446 may contain other modifiers like 'b' or 't'. */
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
3449 PyErr_Format(PyExc_ValueError,
3450 "invalid file open mode %.200s", mode);
3451 PyMem_Free(pathname);
3452 return NULL;
3453 }
3454 }
3455 if (fob == Py_None)
3456 fp = NULL;
3457 else {
3458 fp = get_file(NULL, fob, mode);
3459 if (fp == NULL) {
3460 PyMem_Free(pathname);
3461 return NULL;
3462 }
3463 }
3464 ret = load_module(name, fp, pathname, type, NULL);
3465 PyMem_Free(pathname);
3466 if (fp)
3467 fclose(fp);
3468 return ret;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003469}
3470
3471static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003472imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 char *name;
3475 char *pathname;
3476 PyObject * ret;
3477 if (!PyArg_ParseTuple(args, "ses:load_package",
3478 &name, Py_FileSystemDefaultEncoding, &pathname))
3479 return NULL;
3480 ret = load_package(name, pathname);
3481 PyMem_Free(pathname);
3482 return ret;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003483}
3484
3485static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003486imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 char *name;
3489 if (!PyArg_ParseTuple(args, "s:new_module", &name))
3490 return NULL;
3491 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003492}
3493
Christian Heimes13a7a212008-01-07 17:13:09 +00003494static PyObject *
3495imp_reload(PyObject *self, PyObject *v)
3496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 return PyImport_ReloadModule(v);
Christian Heimes13a7a212008-01-07 17:13:09 +00003498}
3499
3500PyDoc_STRVAR(doc_reload,
3501"reload(module) -> module\n\
3502\n\
3503Reload the module. The module must have been successfully imported before.");
3504
Barry Warsaw28a691b2010-04-17 00:19:56 +00003505static PyObject *
3506imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws)
3507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 static char *kwlist[] = {"path", "debug_override", NULL};
Barry Warsaw28a691b2010-04-17 00:19:56 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 char buf[MAXPATHLEN+1];
3511 char *pathname, *cpathname;
3512 PyObject *debug_override = Py_None;
3513 int debug = !Py_OptimizeFlag;
Barry Warsaw28a691b2010-04-17 00:19:56 +00003514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 if (!PyArg_ParseTupleAndKeywords(
3516 args, kws, "es|O", kwlist,
3517 Py_FileSystemDefaultEncoding, &pathname, &debug_override))
3518 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +00003519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 if (debug_override != Py_None)
3521 if ((debug = PyObject_IsTrue(debug_override)) < 0)
3522 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +00003523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1, debug);
3525 PyMem_Free(pathname);
Barry Warsaw28a691b2010-04-17 00:19:56 +00003526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003527 if (cpathname == NULL) {
3528 PyErr_Format(PyExc_SystemError, "path buffer too short");
3529 return NULL;
3530 }
3531 return PyUnicode_FromString(buf);
Barry Warsaw28a691b2010-04-17 00:19:56 +00003532}
3533
3534PyDoc_STRVAR(doc_cache_from_source,
3535"Given the path to a .py file, return the path to its .pyc/.pyo file.\n\
3536\n\
3537The .py file does not need to exist; this simply returns the path to the\n\
3538.pyc/.pyo file calculated as if the .py file were imported. The extension\n\
3539will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\
3540\n\
3541If debug_override is not None, then it must be a boolean and is taken as\n\
3542the value of __debug__ instead.");
3543
3544static PyObject *
3545imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
3546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 static char *kwlist[] = {"path", NULL};
Barry Warsaw28a691b2010-04-17 00:19:56 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 char *pathname;
3550 char buf[MAXPATHLEN+1];
Barry Warsaw28a691b2010-04-17 00:19:56 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 if (!PyArg_ParseTupleAndKeywords(
3553 args, kws, "es", kwlist,
3554 Py_FileSystemDefaultEncoding, &pathname))
3555 return NULL;
Barry Warsaw28a691b2010-04-17 00:19:56 +00003556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 if (make_source_pathname(pathname, buf) == NULL) {
3558 PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %s",
3559 pathname);
3560 PyMem_Free(pathname);
3561 return NULL;
3562 }
3563 PyMem_Free(pathname);
3564 return PyUnicode_FromString(buf);
Barry Warsaw28a691b2010-04-17 00:19:56 +00003565}
3566
3567PyDoc_STRVAR(doc_source_from_cache,
3568"Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
3569\n\
3570The .pyc/.pyo file does not need to exist; this simply returns the path to\n\
3571the .py file calculated to correspond to the .pyc/.pyo file. If path\n\
3572does not conform to PEP 3147 format, ValueError will be raised.");
3573
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003574/* Doc strings */
3575
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003576PyDoc_STRVAR(doc_imp,
3577"This module provides the components needed to build your own\n\
3578__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003580PyDoc_STRVAR(doc_find_module,
3581"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003582Search for a module. If path is omitted or None, search for a\n\
3583built-in, frozen or special module and continue search in sys.path.\n\
3584The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003585package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003586
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003587PyDoc_STRVAR(doc_load_module,
3588"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003589Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003590The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003592PyDoc_STRVAR(doc_get_magic,
3593"get_magic() -> string\n\
3594Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003595
Barry Warsaw28a691b2010-04-17 00:19:56 +00003596PyDoc_STRVAR(doc_get_tag,
3597"get_tag() -> string\n\
3598Return the magic tag for .pyc or .pyo files.");
3599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003600PyDoc_STRVAR(doc_get_suffixes,
3601"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003602Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003603that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003605PyDoc_STRVAR(doc_new_module,
3606"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003607Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003608The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003610PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003611"lock_held() -> boolean\n\
3612Return True if the import lock is currently held, else False.\n\
3613On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003614
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003615PyDoc_STRVAR(doc_acquire_lock,
3616"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003617Acquires the interpreter's import lock for the current thread.\n\
3618This lock should be used by import hooks to ensure thread-safety\n\
3619when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003620On platforms without threads, this function does nothing.");
3621
3622PyDoc_STRVAR(doc_release_lock,
3623"release_lock() -> None\n\
3624Release the interpreter's import lock.\n\
3625On platforms without threads, this function does nothing.");
3626
Guido van Rossum79f25d91997-04-29 20:08:16 +00003627static PyMethodDef imp_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3629 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3630 {"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
3631 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3632 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3633 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3634 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3635 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3636 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
3637 {"reload", imp_reload, METH_O, doc_reload},
3638 {"cache_from_source", (PyCFunction)imp_cache_from_source,
3639 METH_VARARGS | METH_KEYWORDS, doc_cache_from_source},
3640 {"source_from_cache", (PyCFunction)imp_source_from_cache,
3641 METH_VARARGS | METH_KEYWORDS, doc_source_from_cache},
3642 /* The rest are obsolete */
3643 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3644 {"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
3645 {"init_builtin", imp_init_builtin, METH_VARARGS},
3646 {"init_frozen", imp_init_frozen, METH_VARARGS},
3647 {"is_builtin", imp_is_builtin, METH_VARARGS},
3648 {"is_frozen", imp_is_frozen, METH_VARARGS},
3649 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003650#ifdef HAVE_DYNAMIC_LOADING
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 {"load_package", imp_load_package, METH_VARARGS},
3654 {"load_source", imp_load_source, METH_VARARGS},
3655 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003656};
3657
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003658static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003659setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 PyObject *v;
3662 int err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 v = PyLong_FromLong((long)value);
3665 err = PyDict_SetItemString(d, name, v);
3666 Py_XDECREF(v);
3667 return err;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003668}
3669
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003670typedef struct {
3671 PyObject_HEAD
3672} NullImporter;
3673
3674static int
3675NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3676{
Victor Stinner1a4d12d2010-08-13 13:07:29 +00003677#ifndef MS_WINDOWS
3678 PyObject *path;
3679 struct stat statbuf;
3680 int rv;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3683 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003684
Victor Stinner1a4d12d2010-08-13 13:07:29 +00003685 if (!PyArg_ParseTuple(args, "O&:NullImporter",
3686 PyUnicode_FSConverter, &path))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003688
Victor Stinner1a4d12d2010-08-13 13:07:29 +00003689 if (PyBytes_GET_SIZE(path) == 0) {
3690 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 PyErr_SetString(PyExc_ImportError, "empty pathname");
3692 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 }
Victor Stinner1a4d12d2010-08-13 13:07:29 +00003694
3695 rv = stat(PyBytes_AS_STRING(path), &statbuf);
3696 Py_DECREF(path);
3697 if (rv == 0) {
3698 /* it exists */
3699 if (S_ISDIR(statbuf.st_mode)) {
3700 /* it's a directory */
3701 PyErr_SetString(PyExc_ImportError, "existing directory");
3702 return -1;
3703 }
3704 }
3705#else /* MS_WINDOWS */
3706 PyObject *pathobj;
3707 DWORD rv;
3708 wchar_t path[MAXPATHLEN+1];
3709 Py_ssize_t len;
3710
3711 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3712 return -1;
3713
3714 if (!PyArg_ParseTuple(args, "U:NullImporter",
3715 &pathobj))
3716 return -1;
3717
3718 if (PyUnicode_GET_SIZE(pathobj) == 0) {
3719 PyErr_SetString(PyExc_ImportError, "empty pathname");
3720 return -1;
3721 }
3722
3723 len = PyUnicode_AsWideChar((PyUnicodeObject*)pathobj,
3724 path, sizeof(path) / sizeof(path[0]));
3725 if (len == -1)
3726 return -1;
3727 /* see issue1293 and issue3677:
3728 * stat() on Windows doesn't recognise paths like
3729 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
3730 */
3731 rv = GetFileAttributesW(path);
3732 if (rv != INVALID_FILE_ATTRIBUTES) {
3733 /* it exists */
3734 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
3735 /* it's a directory */
3736 PyErr_SetString(PyExc_ImportError, "existing directory");
3737 return -1;
3738 }
3739 }
3740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 return 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003742}
3743
3744static PyObject *
3745NullImporter_find_module(NullImporter *self, PyObject *args)
3746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003748}
3749
3750static PyMethodDef NullImporter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3752 "Always return None"
3753 },
3754 {NULL} /* Sentinel */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003755};
3756
3757
Christian Heimes9cd17752007-11-18 19:35:23 +00003758PyTypeObject PyNullImporter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 PyVarObject_HEAD_INIT(NULL, 0)
3760 "imp.NullImporter", /*tp_name*/
3761 sizeof(NullImporter), /*tp_basicsize*/
3762 0, /*tp_itemsize*/
3763 0, /*tp_dealloc*/
3764 0, /*tp_print*/
3765 0, /*tp_getattr*/
3766 0, /*tp_setattr*/
3767 0, /*tp_reserved*/
3768 0, /*tp_repr*/
3769 0, /*tp_as_number*/
3770 0, /*tp_as_sequence*/
3771 0, /*tp_as_mapping*/
3772 0, /*tp_hash */
3773 0, /*tp_call*/
3774 0, /*tp_str*/
3775 0, /*tp_getattro*/
3776 0, /*tp_setattro*/
3777 0, /*tp_as_buffer*/
3778 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3779 "Null importer object", /* tp_doc */
3780 0, /* tp_traverse */
3781 0, /* tp_clear */
3782 0, /* tp_richcompare */
3783 0, /* tp_weaklistoffset */
3784 0, /* tp_iter */
3785 0, /* tp_iternext */
3786 NullImporter_methods, /* tp_methods */
3787 0, /* tp_members */
3788 0, /* tp_getset */
3789 0, /* tp_base */
3790 0, /* tp_dict */
3791 0, /* tp_descr_get */
3792 0, /* tp_descr_set */
3793 0, /* tp_dictoffset */
3794 (initproc)NullImporter_init, /* tp_init */
3795 0, /* tp_alloc */
3796 PyType_GenericNew /* tp_new */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003797};
3798
Martin v. Löwis1a214512008-06-11 05:26:20 +00003799static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 PyModuleDef_HEAD_INIT,
3801 "imp",
3802 doc_imp,
3803 0,
3804 imp_methods,
3805 NULL,
3806 NULL,
3807 NULL,
3808 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003809};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003810
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003811PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003812PyInit_imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 if (PyType_Ready(&PyNullImporter_Type) < 0)
3817 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 m = PyModule_Create(&impmodule);
3820 if (m == NULL)
3821 goto failure;
3822 d = PyModule_GetDict(m);
3823 if (d == NULL)
3824 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003826 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3827 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3828 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3829 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3830 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3831 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3832 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3833 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
3834 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
3835 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 Py_INCREF(&PyNullImporter_Type);
3838 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
3839 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003840 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 Py_XDECREF(m);
3842 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003843}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003844
3845
Guido van Rossumb18618d2000-05-03 23:44:39 +00003846/* API for embedding applications that want to add their own entries
3847 to the table of built-in modules. This should normally be called
3848 *before* Py_Initialize(). When the table resize fails, -1 is
3849 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003850
3851 After a similar function by Just van Rossum. */
3852
3853int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003854PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 static struct _inittab *our_copy = NULL;
3857 struct _inittab *p;
3858 int i, n;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003860 /* Count the number of entries in both tables */
3861 for (n = 0; newtab[n].name != NULL; n++)
3862 ;
3863 if (n == 0)
3864 return 0; /* Nothing to do */
3865 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3866 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 /* Allocate new memory for the combined table */
3869 p = our_copy;
3870 PyMem_RESIZE(p, struct _inittab, i+n+1);
3871 if (p == NULL)
3872 return -1;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 /* Copy the tables into the new memory */
3875 if (our_copy != PyImport_Inittab)
3876 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3877 PyImport_Inittab = our_copy = p;
3878 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003880 return 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003881}
3882
3883/* Shorthand to add a single entry given a name and a function */
3884
3885int
Brett Cannona826f322009-04-02 03:41:46 +00003886PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003890 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 newtab[0].name = (char *)name;
3893 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003896}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003897
3898#ifdef __cplusplus
3899}
3900#endif