blob: 22fc4ac7dd2c47a241a78943076218660e489a57 [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
22extern "C" {
23#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000024
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000025extern time_t PyOS_GetLastModificationTime(char *, FILE *);
26 /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000027
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000028/* Magic word to reject .pyc files generated by other Python versions.
29 It should change for each incompatible change to the bytecode.
30
31 The value of CR and LF is incorporated so if you ever read or write
Guido van Rossum7faeab31995-07-07 22:50:36 +000032 a .pyc file in text mode the magic number will be wrong; also, the
Tim Peters36515e22001-11-18 04:06:29 +000033 Apple MPW compiler swaps their values, botching string constants.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000034
Guido van Rossum45aecf42006-03-15 04:58:47 +000035 The magic numbers must be spaced apart at least 2 values, as the
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000036 -U interpeter flag will cause MAGIC+1 being used. They have been
37 odd numbers for some time now.
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000038
Jeremy Hyltond4ceb312004-04-01 02:45:22 +000039 There were a variety of old schemes for setting the magic number.
40 The current working scheme is to increment the previous value by
41 10.
Guido van Rossumf6894922002-08-31 15:16:14 +000042
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000043 Known values:
44 Python 1.5: 20121
45 Python 1.5.1: 20121
46 Python 1.5.2: 20121
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000047 Python 1.6: 50428
Marc-André Lemburgbd3be8f2002-02-07 11:33:49 +000048 Python 2.0: 50823
49 Python 2.0.1: 50823
50 Python 2.1: 60202
51 Python 2.1.1: 60202
52 Python 2.1.2: 60202
53 Python 2.2: 60717
Neal Norwitz7fdcb412002-06-14 01:07:39 +000054 Python 2.3a0: 62011
Michael W. Hudsondd32a912002-08-15 14:59:02 +000055 Python 2.3a0: 62021
Guido van Rossumf6894922002-08-31 15:16:14 +000056 Python 2.3a0: 62011 (!)
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000057 Python 2.4a0: 62041
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +000058 Python 2.4a3: 62051
Raymond Hettinger2c31a052004-09-22 18:44:21 +000059 Python 2.4b1: 62061
Michael W. Hudsondf888462005-06-03 14:41:55 +000060 Python 2.5a0: 62071
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000061 Python 2.5a0: 62081 (ast-branch)
Guido van Rossumc2e20742006-02-27 22:32:47 +000062 Python 2.5a0: 62091 (with)
Guido van Rossumf6694362006-03-10 02:28:35 +000063 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000064 Python 2.5b3: 62101 (fix wrong code: for x, in ...)
65 Python 2.5b3: 62111 (fix wrong code: x += yield)
66 Python 2.5c1: 62121 (fix wrong lnotab with for loops and
67 storing constants that should have been removed)
Thomas Wouters89f507f2006-12-13 04:49:30 +000068 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
Christian Heimes99170a52007-12-19 02:07:34 +000069 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
Guido van Rossum45aecf42006-03-15 04:58:47 +000070 Python 3000: 3000
Brett Cannone2e23ef2006-08-25 05:05:30 +000071 3010 (removed UNARY_CONVERT)
Guido van Rossum86e58e22006-08-28 15:27:34 +000072 3020 (added BUILD_SET)
Guido van Rossum4f72a782006-10-27 23:31:49 +000073 3030 (added keyword-only parameters)
Guido van Rossum3203bdc2006-12-28 21:03:31 +000074 3040 (added signature annotations)
Guido van Rossum452bf512007-02-09 05:32:43 +000075 3050 (print becomes a function)
Guido van Rossum52cc1d82007-03-18 15:41:51 +000076 3060 (PEP 3115 metaclass syntax)
Guido van Rossum00bc0e02007-10-15 02:52:41 +000077 3070 (PEP 3109 raise changes)
78 3080 (PEP 3137 make __file__ and __name__ unicode)
Guido van Rossum98297ee2007-11-06 21:34:58 +000079 3090 (kill str8 interning)
Christian Heimes99170a52007-12-19 02:07:34 +000080 3100 (merge from 2.6a0, see 62151)
Christian Heimes3b06e532008-01-07 20:12:44 +000081 3102 (__file__ points to source file)
Michael W. Hudsonaee2e282005-10-21 11:32:20 +000082.
Tim Peters36515e22001-11-18 04:06:29 +000083*/
Christian Heimes3b06e532008-01-07 20:12:44 +000084#define MAGIC (3102 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000085
Guido van Rossum96774c12000-05-01 20:19:08 +000086/* Magic word as global; note that _PyImport_Init() can change the
Jeremy Hylton9262b8a2000-06-30 04:59:17 +000087 value of this global to accommodate for alterations of how the
Guido van Rossum96774c12000-05-01 20:19:08 +000088 compiler works which are enabled by command line switches. */
89static long pyc_magic = MAGIC;
90
Guido van Rossum25ce5661997-08-02 03:10:38 +000091/* See _PyImport_FixupExtension() below */
92static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000093
Guido van Rossum771c6c81997-10-31 18:37:24 +000094/* This table is defined in config.c: */
95extern struct _inittab _PyImport_Inittab[];
96
Guido van Rossumce3a72a2007-10-19 23:16:50 +000097/* Method from Parser/tokenizer.c */
Guido van Rossum40d20bc2007-10-22 00:09:51 +000098extern char * PyTokenizer_FindEncoding(int);
Guido van Rossumce3a72a2007-10-19 23:16:50 +000099
Guido van Rossum771c6c81997-10-31 18:37:24 +0000100struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000101
Guido van Rossumed1170e1999-12-20 21:23:41 +0000102/* these tables define the module suffixes that Python recognizes */
103struct filedescr * _PyImport_Filetab = NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000104
Guido van Rossumed1170e1999-12-20 21:23:41 +0000105static const struct filedescr _PyImport_StandardFiletab[] = {
Jack Jansenc88da1f2002-05-28 10:58:19 +0000106 {".py", "U", PY_SOURCE},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000107#ifdef MS_WINDOWS
Jack Jansenc88da1f2002-05-28 10:58:19 +0000108 {".pyw", "U", PY_SOURCE},
Tim Peters36515e22001-11-18 04:06:29 +0000109#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000110 {".pyc", "rb", PY_COMPILED},
111 {0, 0}
112};
113
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000114
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000115/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116
117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118_PyImport_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119{
Guido van Rossumed1170e1999-12-20 21:23:41 +0000120 const struct filedescr *scan;
121 struct filedescr *filetab;
122 int countD = 0;
123 int countS = 0;
124
125 /* prepare _PyImport_Filetab: copy entries from
126 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
127 */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000128#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumed1170e1999-12-20 21:23:41 +0000129 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
130 ++countD;
Guido van Rossum04110fb2007-08-24 16:32:05 +0000131#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000132 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
133 ++countS;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000134 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000135 if (filetab == NULL)
136 Py_FatalError("Can't initialize import file table.");
Guido van Rossum04110fb2007-08-24 16:32:05 +0000137#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossumed1170e1999-12-20 21:23:41 +0000138 memcpy(filetab, _PyImport_DynLoadFiletab,
139 countD * sizeof(struct filedescr));
Guido van Rossum04110fb2007-08-24 16:32:05 +0000140#endif
Guido van Rossumed1170e1999-12-20 21:23:41 +0000141 memcpy(filetab + countD, _PyImport_StandardFiletab,
142 countS * sizeof(struct filedescr));
143 filetab[countD + countS].suffix = NULL;
144
145 _PyImport_Filetab = filetab;
146
Guido van Rossum0824f631997-03-11 18:37:35 +0000147 if (Py_OptimizeFlag) {
Guido van Rossumed1170e1999-12-20 21:23:41 +0000148 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
149 for (; filetab->suffix != NULL; filetab++) {
150 if (strcmp(filetab->suffix, ".pyc") == 0)
151 filetab->suffix = ".pyo";
Guido van Rossum0824f631997-03-11 18:37:35 +0000152 }
153 }
Guido van Rossum96774c12000-05-01 20:19:08 +0000154
Guido van Rossum572dbf82007-04-27 23:53:51 +0000155 {
Guido van Rossum96774c12000-05-01 20:19:08 +0000156 /* Fix the pyc_magic so that byte compiled code created
157 using the all-Unicode method doesn't interfere with
158 code created in normal operation mode. */
159 pyc_magic = MAGIC + 1;
160 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
Guido van Rossum25ce5661997-08-02 03:10:38 +0000163void
Just van Rossum52e14d62002-12-30 22:08:05 +0000164_PyImportHooks_Init(void)
165{
166 PyObject *v, *path_hooks = NULL, *zimpimport;
167 int err = 0;
168
169 /* adding sys.path_hooks and sys.path_importer_cache, setting up
170 zipimport */
Christian Heimes9cd17752007-11-18 19:35:23 +0000171 if (PyType_Ready(&PyNullImporter_Type) < 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000172 goto error;
Just van Rossum52e14d62002-12-30 22:08:05 +0000173
174 if (Py_VerboseFlag)
175 PySys_WriteStderr("# installing zipimport hook\n");
176
177 v = PyList_New(0);
178 if (v == NULL)
179 goto error;
180 err = PySys_SetObject("meta_path", v);
181 Py_DECREF(v);
182 if (err)
183 goto error;
184 v = PyDict_New();
185 if (v == NULL)
186 goto error;
187 err = PySys_SetObject("path_importer_cache", v);
188 Py_DECREF(v);
189 if (err)
190 goto error;
191 path_hooks = PyList_New(0);
192 if (path_hooks == NULL)
193 goto error;
194 err = PySys_SetObject("path_hooks", path_hooks);
195 if (err) {
196 error:
197 PyErr_Print();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000198 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
199 "path_importer_cache, or NullImporter failed"
200 );
Just van Rossum52e14d62002-12-30 22:08:05 +0000201 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000202
Just van Rossum52e14d62002-12-30 22:08:05 +0000203 zimpimport = PyImport_ImportModule("zipimport");
204 if (zimpimport == NULL) {
205 PyErr_Clear(); /* No zip import module -- okay */
206 if (Py_VerboseFlag)
207 PySys_WriteStderr("# can't import zipimport\n");
208 }
209 else {
210 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
211 "zipimporter");
212 Py_DECREF(zimpimport);
213 if (zipimporter == NULL) {
214 PyErr_Clear(); /* No zipimporter object -- okay */
215 if (Py_VerboseFlag)
216 PySys_WriteStderr(
Fred Drake1e5fc552003-07-11 15:01:02 +0000217 "# can't import zipimport.zipimporter\n");
Just van Rossum52e14d62002-12-30 22:08:05 +0000218 }
219 else {
220 /* sys.path_hooks.append(zipimporter) */
221 err = PyList_Append(path_hooks, zipimporter);
222 Py_DECREF(zipimporter);
223 if (err)
224 goto error;
225 if (Py_VerboseFlag)
226 PySys_WriteStderr(
227 "# installed zipimport hook\n");
228 }
229 }
230 Py_DECREF(path_hooks);
231}
232
233void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000234_PyImport_Fini(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000235{
236 Py_XDECREF(extensions);
237 extensions = NULL;
Barry Warsaw84294482000-10-03 16:02:05 +0000238 PyMem_DEL(_PyImport_Filetab);
239 _PyImport_Filetab = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240}
241
242
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000243/* Locking primitives to prevent parallel imports of the same module
244 in different threads to return with a partially loaded module.
245 These calls are serialized by the global interpreter lock. */
246
247#ifdef WITH_THREAD
248
Guido van Rossum49b56061998-10-01 20:42:43 +0000249#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000250
Guido van Rossum65d5b571998-12-21 19:32:43 +0000251static PyThread_type_lock import_lock = 0;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000252static long import_lock_thread = -1;
253static int import_lock_level = 0;
254
255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000256lock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000257{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 long me = PyThread_get_thread_ident();
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000259 if (me == -1)
260 return; /* Too bad */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261 if (import_lock == NULL) {
Guido van Rossum65d5b571998-12-21 19:32:43 +0000262 import_lock = PyThread_allocate_lock();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000263 if (import_lock == NULL)
264 return; /* Nothing much we can do. */
265 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000266 if (import_lock_thread == me) {
267 import_lock_level++;
268 return;
269 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000270 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
271 {
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000272 PyThreadState *tstate = PyEval_SaveThread();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_acquire_lock(import_lock, 1);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000274 PyEval_RestoreThread(tstate);
275 }
276 import_lock_thread = me;
277 import_lock_level = 1;
278}
279
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000280static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281unlock_import(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000282{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000283 long me = PyThread_get_thread_ident();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000284 if (me == -1 || import_lock == NULL)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000285 return 0; /* Too bad */
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000286 if (import_lock_thread != me)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000287 return -1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000288 import_lock_level--;
289 if (import_lock_level == 0) {
290 import_lock_thread = -1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000291 PyThread_release_lock(import_lock);
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000292 }
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000293 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000294}
295
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000296/* This function is called from PyOS_AfterFork to ensure that newly
297 created child processes do not share locks with the parent. */
298
299void
300_PyImport_ReInitLock(void)
301{
302#ifdef _AIX
303 if (import_lock != NULL)
304 import_lock = PyThread_allocate_lock();
305#endif
306}
307
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000308#else
309
310#define lock_import()
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000311#define unlock_import() 0
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000312
313#endif
314
Tim Peters69232342001-08-30 05:16:13 +0000315static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000316imp_lock_held(PyObject *self, PyObject *noargs)
Tim Peters69232342001-08-30 05:16:13 +0000317{
Tim Peters69232342001-08-30 05:16:13 +0000318#ifdef WITH_THREAD
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000319 return PyBool_FromLong(import_lock_thread != -1);
Tim Peters69232342001-08-30 05:16:13 +0000320#else
Guido van Rossumb8bff3f2002-04-07 06:34:38 +0000321 return PyBool_FromLong(0);
Tim Peters69232342001-08-30 05:16:13 +0000322#endif
323}
324
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000325static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000326imp_acquire_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000327{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000328#ifdef WITH_THREAD
329 lock_import();
330#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000331 Py_INCREF(Py_None);
332 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000333}
334
335static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +0000336imp_release_lock(PyObject *self, PyObject *noargs)
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000337{
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000338#ifdef WITH_THREAD
339 if (unlock_import() < 0) {
340 PyErr_SetString(PyExc_RuntimeError,
341 "not holding the import lock");
342 return NULL;
343 }
344#endif
Neal Norwitz2294c0d2003-02-12 23:02:21 +0000345 Py_INCREF(Py_None);
346 return Py_None;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000347}
348
Guido van Rossumd8faa362007-04-27 19:54:29 +0000349static void
350imp_modules_reloading_clear(void)
351{
352 PyInterpreterState *interp = PyThreadState_Get()->interp;
353 if (interp->modules_reloading != NULL)
354 PyDict_Clear(interp->modules_reloading);
355}
356
Guido van Rossum25ce5661997-08-02 03:10:38 +0000357/* Helper for sys */
358
359PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000361{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000362 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000363 if (interp->modules == NULL)
364 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
365 return interp->modules;
366}
367
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000369/* List of names to clear in sys */
370static char* sys_deletes[] = {
Collin Winter670e6922007-03-21 02:57:17 +0000371 "path", "argv", "ps1", "ps2",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000372 "last_type", "last_value", "last_traceback",
Just van Rossum52e14d62002-12-30 22:08:05 +0000373 "path_hooks", "path_importer_cache", "meta_path",
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000374 /* misc stuff */
375 "flags", "float_info",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000376 NULL
377};
378
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000379static char* sys_files[] = {
380 "stdin", "__stdin__",
381 "stdout", "__stdout__",
382 "stderr", "__stderr__",
383 NULL
384};
385
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000386
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000392 Py_ssize_t pos, ndone;
Guido van Rossum758eec01998-01-19 21:58:26 +0000393 char *name;
394 PyObject *key, *value, *dict;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000395 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000396 PyObject *modules = interp->modules;
397
398 if (modules == NULL)
399 return; /* Already done */
400
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000401 /* Delete some special variables first. These are common
402 places where user values hide and people complain when their
403 destructors fail. Since the modules containing them are
404 deleted *last* of all, they would come too late in the normal
405 destruction order. Sigh. */
406
Georg Brandl1a3284e2007-12-02 09:40:06 +0000407 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000408 if (value != NULL && PyModule_Check(value)) {
409 dict = PyModule_GetDict(value);
410 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000411 PySys_WriteStderr("# clear builtins._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000412 PyDict_SetItemString(dict, "_", Py_None);
413 }
414 value = PyDict_GetItemString(modules, "sys");
415 if (value != NULL && PyModule_Check(value)) {
416 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000417 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000418 dict = PyModule_GetDict(value);
419 for (p = sys_deletes; *p != NULL; p++) {
420 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000421 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000422 PyDict_SetItemString(dict, *p, Py_None);
423 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000424 for (p = sys_files; *p != NULL; p+=2) {
425 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000426 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000427 v = PyDict_GetItemString(dict, *(p+1));
428 if (v == NULL)
429 v = Py_None;
430 PyDict_SetItemString(dict, *p, v);
431 }
432 }
433
434 /* First, delete __main__ */
435 value = PyDict_GetItemString(modules, "__main__");
436 if (value != NULL && PyModule_Check(value)) {
437 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000438 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000439 _PyModule_Clear(value);
440 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000441 }
442
Georg Brandl1a3284e2007-12-02 09:40:06 +0000443 /* The special treatment of "builtins" here is because even
Guido van Rossum758eec01998-01-19 21:58:26 +0000444 when it's not referenced as a module, its dictionary is
445 referenced by almost every module's __builtins__. Since
446 deleting a module clears its dictionary (even if there are
Georg Brandl1a3284e2007-12-02 09:40:06 +0000447 references left to it), we need to delete the "builtins"
Guido van Rossum758eec01998-01-19 21:58:26 +0000448 module last. Likewise, we don't delete sys until the very
449 end because it is implicitly referenced (e.g. by print).
450
451 Also note that we 'delete' modules by replacing their entry
452 in the modules dict with None, rather than really deleting
453 them; this avoids a rehash of the modules dictionary and
454 also marks them as "non existent" so they won't be
455 re-imported. */
456
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000457 /* Next, repeatedly delete modules with a reference count of
Georg Brandl1a3284e2007-12-02 09:40:06 +0000458 one (skipping builtins and sys) and delete them */
Guido van Rossum758eec01998-01-19 21:58:26 +0000459 do {
460 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000461 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000462 while (PyDict_Next(modules, &pos, &key, &value)) {
463 if (value->ob_refcnt != 1)
464 continue;
Neal Norwitz80e7f272007-08-26 06:45:23 +0000465 if (PyUnicode_Check(key) && PyModule_Check(value)) {
466 name = PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000467 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000468 continue;
469 if (strcmp(name, "sys") == 0)
470 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000471 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000472 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000473 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000474 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000475 PyDict_SetItem(modules, key, Py_None);
476 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000477 }
478 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000479 } while (ndone > 0);
480
Georg Brandl1a3284e2007-12-02 09:40:06 +0000481 /* Next, delete all modules (still skipping builtins and sys) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000482 pos = 0;
483 while (PyDict_Next(modules, &pos, &key, &value)) {
Neal Norwitz80e7f272007-08-26 06:45:23 +0000484 if (PyUnicode_Check(key) && PyModule_Check(value)) {
485 name = PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000486 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000487 continue;
488 if (strcmp(name, "sys") == 0)
489 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000490 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000491 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000492 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000493 PyDict_SetItem(modules, key, Py_None);
494 }
495 }
496
Georg Brandl1a3284e2007-12-02 09:40:06 +0000497 /* Next, delete sys and builtins (in that order) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000498 value = PyDict_GetItemString(modules, "sys");
499 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000500 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000501 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000502 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000503 PyDict_SetItemString(modules, "sys", Py_None);
504 }
Georg Brandl1a3284e2007-12-02 09:40:06 +0000505 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossum758eec01998-01-19 21:58:26 +0000506 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000507 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000508 PySys_WriteStderr("# cleanup builtins\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000509 _PyModule_Clear(value);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000510 PyDict_SetItemString(modules, "builtins", Py_None);
Guido van Rossum758eec01998-01-19 21:58:26 +0000511 }
512
513 /* Finally, clear and delete the modules directory */
514 PyDict_Clear(modules);
515 interp->modules = NULL;
516 Py_DECREF(modules);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000518}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000519
520
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521/* Helper for pythonrun.c -- return magic number */
522
523long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000524PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525{
Guido van Rossum96774c12000-05-01 20:19:08 +0000526 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527}
528
529
Guido van Rossum25ce5661997-08-02 03:10:38 +0000530/* Magic for extension modules (built-in as well as dynamically
531 loaded). To prevent initializing an extension module more than
532 once, we keep a static dictionary 'extensions' keyed by module name
533 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000534 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000535 dictionary is stored by calling _PyImport_FixupExtension()
536 immediately after the module initialization function succeeds. A
537 copy can be retrieved from there by calling
538 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000539
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000543 PyObject *modules, *mod, *dict, *copy;
544 if (extensions == NULL) {
545 extensions = PyDict_New();
546 if (extensions == NULL)
547 return NULL;
548 }
549 modules = PyImport_GetModuleDict();
550 mod = PyDict_GetItemString(modules, name);
551 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000552 PyErr_Format(PyExc_SystemError,
553 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000554 return NULL;
555 }
556 dict = PyModule_GetDict(mod);
557 if (dict == NULL)
558 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000559 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000560 if (copy == NULL)
561 return NULL;
562 PyDict_SetItemString(extensions, filename, copy);
563 Py_DECREF(copy);
564 return copy;
565}
566
567PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000568_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000569{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000570 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000571 if (extensions == NULL)
572 return NULL;
573 dict = PyDict_GetItemString(extensions, filename);
574 if (dict == NULL)
575 return NULL;
576 mod = PyImport_AddModule(name);
577 if (mod == NULL)
578 return NULL;
579 mdict = PyModule_GetDict(mod);
580 if (mdict == NULL)
581 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000582 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000583 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000584 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000585 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000586 name, filename);
587 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588}
589
590
591/* Get the module object corresponding to a module name.
592 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000593 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000594 Because the former action is most common, THIS DOES NOT RETURN A
595 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000598PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602
Guido van Rossum25ce5661997-08-02 03:10:38 +0000603 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 if (m == NULL)
608 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000609 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611 return NULL;
612 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614
615 return m;
616}
617
Tim Peters1cd70172004-08-02 03:52:12 +0000618/* Remove name from sys.modules, if it's there. */
619static void
620_RemoveModule(const char *name)
621{
622 PyObject *modules = PyImport_GetModuleDict();
623 if (PyDict_GetItemString(modules, name) == NULL)
624 return;
625 if (PyDict_DelItemString(modules, name) < 0)
626 Py_FatalError("import: deleting existing key in"
627 "sys.modules failed");
628}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000629
Christian Heimes3b06e532008-01-07 20:12:44 +0000630static PyObject * get_sourcefile(const char *file);
631
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000632/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000633 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
634 * removed from sys.modules, to avoid leaving damaged module objects
635 * in sys.modules. The caller may wish to restore the original
636 * module object (if any) in this case; PyImport_ReloadModule is an
637 * example.
638 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000640PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000642 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
643}
644
645PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000646PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000647{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000648 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652 if (m == NULL)
653 return NULL;
Jeremy Hyltonecd91292004-01-02 23:25:32 +0000654 /* If the module is being reloaded, we get the old module back
655 and re-use its dict to exec the new code. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 d = PyModule_GetDict(m);
657 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
658 if (PyDict_SetItemString(d, "__builtins__",
659 PyEval_GetBuiltins()) != 0)
Tim Peters1cd70172004-08-02 03:52:12 +0000660 goto error;
Guido van Rossum6135a871995-01-09 17:53:26 +0000661 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000662 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000663 v = NULL;
664 if (pathname != NULL) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000665 v = get_sourcefile(pathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000666 if (v == NULL)
667 PyErr_Clear();
668 }
669 if (v == NULL) {
670 v = ((PyCodeObject *)co)->co_filename;
671 Py_INCREF(v);
672 }
673 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000675 Py_DECREF(v);
676
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000677 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 if (v == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000679 goto error;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000681
Guido van Rossum25ce5661997-08-02 03:10:38 +0000682 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000683 PyErr_Format(PyExc_ImportError,
684 "Loaded module %.200s not found in sys.modules",
685 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000686 return NULL;
687 }
688
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690
691 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000692
693 error:
694 _RemoveModule(name);
695 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696}
697
698
699/* Given a pathname for a Python source file, fill a buffer with the
700 pathname for the corresponding compiled file. Return the pathname
701 for the compiled file, or NULL if there's no space in the buffer.
702 Doesn't set an exception. */
703
704static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000705make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706{
Tim Petersc1731372001-08-04 08:12:36 +0000707 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 if (len+2 > buflen)
709 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000710
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000711#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000712 /* Treat .pyw as if it were .py. The case of ".pyw" must match
713 that used in _PyImport_StandardFiletab. */
714 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
715 --len; /* pretend 'w' isn't there */
716#endif
717 memcpy(buf, pathname, len);
718 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
719 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
721 return buf;
722}
723
724
725/* Given a pathname for a Python source file, its time of last
726 modification, and a pathname for a compiled file, check whether the
727 compiled file represents the same version of the source. If so,
728 return a FILE pointer for the compiled file, positioned just after
729 the header; if not, return NULL.
730 Doesn't set an exception. */
731
732static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000733check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734{
735 FILE *fp;
736 long magic;
737 long pyc_mtime;
738
739 fp = fopen(cpathname, "rb");
740 if (fp == NULL)
741 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000743 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000745 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 fclose(fp);
747 return NULL;
748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000752 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 fclose(fp);
754 return NULL;
755 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000757 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 return fp;
759}
760
761
762/* Read a code object from a file and check it for validity */
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
Tim Petersd9b9ac82001-01-28 00:27:39 +0000769 co = PyMarshal_ReadLastObjectFromFile(fp);
Armin Rigo01ab2792004-03-26 15:09:27 +0000770 if (co == NULL)
771 return NULL;
772 if (!PyCode_Check(co)) {
773 PyErr_Format(PyExc_ImportError,
774 "Non-code object in %.200s", cpathname);
775 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000776 return NULL;
777 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779}
780
781
782/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000783 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000786load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787{
788 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 PyCodeObject *co;
790 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000793 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000794 PyErr_Format(PyExc_ImportError,
795 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 return NULL;
797 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000799 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 if (co == NULL)
801 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000803 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000805 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
808 return m;
809}
810
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811/* Parse a source file and return the corresponding code object */
812
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 PyCodeObject *co = NULL;
817 mod_ty mod;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000818 PyArena *arena = PyArena_New();
819 if (arena == NULL)
820 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000822 mod = PyParser_ASTFromFile(fp, pathname, NULL,
823 Py_file_input, 0, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000824 NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 if (mod) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000826 co = PyAST_Compile(mod, pathname, NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000828 PyArena_Free(arena);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829 return co;
830}
831
832
Guido van Rossum55a83382000-09-20 20:31:38 +0000833/* Helper to open a bytecode file for writing in exclusive mode */
834
835static FILE *
Christian Heimes05e8be12008-02-23 18:30:17 +0000836open_exclusive(char *filename, mode_t mode)
Guido van Rossum55a83382000-09-20 20:31:38 +0000837{
838#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
839 /* Use O_EXCL to avoid a race condition when another process tries to
840 write the same file. When that happens, our open() call fails,
841 which is just fine (since it's only a cache).
842 XXX If the file exists and is writable but the directory is not
843 writable, the file will never be written. Oh well.
844 */
845 int fd;
846 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000847 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
848#ifdef O_BINARY
849 |O_BINARY /* necessary for Windows */
850#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000851#ifdef __VMS
Christian Heimes05e8be12008-02-23 18:30:17 +0000852 , mode, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000853#else
Christian Heimes05e8be12008-02-23 18:30:17 +0000854 , mode
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000855#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856 );
Guido van Rossum55a83382000-09-20 20:31:38 +0000857 if (fd < 0)
858 return NULL;
859 return fdopen(fd, "wb");
860#else
861 /* Best we can do -- on Windows this can't happen anyway */
862 return fopen(filename, "wb");
863#endif
864}
865
866
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867/* Write a compiled module to a file, placing the time of last
868 modification of its source into the header.
869 Errors are ignored, if a write error occurs an attempt is made to
870 remove the file. */
871
872static void
Christian Heimes05e8be12008-02-23 18:30:17 +0000873write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874{
875 FILE *fp;
Christian Heimes05e8be12008-02-23 18:30:17 +0000876 time_t mtime = srcstat->st_mtime;
877 mode_t mode = srcstat->st_mode;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
Christian Heimes05e8be12008-02-23 18:30:17 +0000879 fp = open_exclusive(cpathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000882 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 "# can't create %s\n", cpathname);
884 return;
885 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000886 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000888 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
889 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000890 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000892 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 /* Don't keep partial file */
894 fclose(fp);
895 (void) unlink(cpathname);
896 return;
897 }
898 /* Now write the true mtime */
899 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000900 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000901 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 fflush(fp);
903 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000905 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000906}
907
908
909/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000910 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
911 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000914load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915{
Christian Heimes05e8be12008-02-23 18:30:17 +0000916 struct stat st;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000917 FILE *fpc;
918 char buf[MAXPATHLEN+1];
919 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyCodeObject *co;
921 PyObject *m;
Christian Heimes05e8be12008-02-23 18:30:17 +0000922
923 if (fstat(fileno(fp), &st) != 0) {
Neal Norwitz708e51a2005-10-03 04:48:15 +0000924 PyErr_Format(PyExc_RuntimeError,
Christian Heimes05e8be12008-02-23 18:30:17 +0000925 "unable to get file status from '%s'",
Neal Norwitz708e51a2005-10-03 04:48:15 +0000926 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000927 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000928 }
Fred Drake4c82b232000-06-30 16:18:57 +0000929#if SIZEOF_TIME_T > 4
930 /* Python's .pyc timestamp handling presumes that the timestamp fits
931 in 4 bytes. This will be fine until sometime in the year 2038,
932 when a 4-byte signed time_t will overflow.
933 */
Christian Heimes05e8be12008-02-23 18:30:17 +0000934 if (st.st_mtime >> 32) {
Fred Drake4c82b232000-06-30 16:18:57 +0000935 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000936 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000937 return NULL;
938 }
939#endif
Tim Peters36515e22001-11-18 04:06:29 +0000940 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000941 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 if (cpathname != NULL &&
Christian Heimes05e8be12008-02-23 18:30:17 +0000943 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000944 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945 fclose(fpc);
946 if (co == NULL)
947 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000949 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000950 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000951 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952 }
953 else {
954 co = parse_source_module(pathname, fp);
955 if (co == NULL)
956 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000958 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 name, pathname);
Christian Heimes790c8232008-01-07 21:14:23 +0000960 if (cpathname) {
961 PyObject *ro = PySys_GetObject("dont_write_bytecode");
962 if (ro == NULL || !PyObject_IsTrue(ro))
Christian Heimes05e8be12008-02-23 18:30:17 +0000963 write_compiled_module(co, cpathname, &st);
Christian Heimes790c8232008-01-07 21:14:23 +0000964 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000966 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000968
969 return m;
970}
971
Christian Heimes3b06e532008-01-07 20:12:44 +0000972/* Get source file -> unicode or None
973 * Returns the path to the py file if available, else the given path
974 */
975static PyObject *
976get_sourcefile(const char *file)
977{
978 char py[MAXPATHLEN + 1];
979 Py_ssize_t len;
980 PyObject *u;
981 struct stat statbuf;
982
983 if (!file || !*file) {
984 Py_RETURN_NONE;
985 }
986
987 len = strlen(file);
Christian Heimes3540b502008-01-11 07:03:05 +0000988 /* match '*.py?' */
989 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000990 return PyUnicode_DecodeFSDefault(file);
991 }
992
993 strncpy(py, file, len-1);
994 py[len] = '\0';
995 if (stat(py, &statbuf) == 0 &&
996 S_ISREG(statbuf.st_mode)) {
997 u = PyUnicode_DecodeFSDefault(py);
998 }
999 else {
1000 u = PyUnicode_DecodeFSDefault(file);
1001 }
1002 return u;
1003}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001005/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001006static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1007static struct filedescr *find_module(char *, char *, PyObject *,
1008 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001009static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001010
1011/* Load a package and return its module object WITH INCREMENTED
1012 REFERENCE COUNT */
1013
1014static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001015load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001016{
Tim Peters1cd70172004-08-02 03:52:12 +00001017 PyObject *m, *d;
1018 PyObject *file = NULL;
1019 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001020 int err;
1021 char buf[MAXPATHLEN+1];
1022 FILE *fp = NULL;
1023 struct filedescr *fdp;
1024
1025 m = PyImport_AddModule(name);
1026 if (m == NULL)
1027 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001028 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001029 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001030 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001031 d = PyModule_GetDict(m);
Christian Heimes3b06e532008-01-07 20:12:44 +00001032 file = get_sourcefile(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001033 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001034 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001035 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001036 if (path == NULL)
1037 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001038 err = PyDict_SetItemString(d, "__file__", file);
1039 if (err == 0)
1040 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001041 if (err != 0)
1042 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001043 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001044 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001045 if (fdp == NULL) {
1046 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1047 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001048 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001049 }
1050 else
1051 m = NULL;
1052 goto cleanup;
1053 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001054 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001055 if (fp != NULL)
1056 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001057 goto cleanup;
1058
1059 error:
1060 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001061 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001062 Py_XDECREF(path);
1063 Py_XDECREF(file);
1064 return m;
1065}
1066
1067
1068/* Helper to test for built-in module */
1069
1070static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001071is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001072{
1073 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001074 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1075 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1076 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001077 return -1;
1078 else
1079 return 1;
1080 }
1081 }
1082 return 0;
1083}
1084
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001085
Just van Rossum52e14d62002-12-30 22:08:05 +00001086/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1087 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001088 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001089 that can handle the path item. Return None if no hook could;
1090 this tells our caller it should fall back to the builtin
1091 import mechanism. Cache the result in path_importer_cache.
1092 Returns a borrowed reference. */
1093
1094static PyObject *
1095get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1096 PyObject *p)
1097{
1098 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001099 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001100
1101 /* These conditions are the caller's responsibility: */
1102 assert(PyList_Check(path_hooks));
1103 assert(PyDict_Check(path_importer_cache));
1104
1105 nhooks = PyList_Size(path_hooks);
1106 if (nhooks < 0)
1107 return NULL; /* Shouldn't happen */
1108
1109 importer = PyDict_GetItem(path_importer_cache, p);
1110 if (importer != NULL)
1111 return importer;
1112
1113 /* set path_importer_cache[p] to None to avoid recursion */
1114 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1115 return NULL;
1116
1117 for (j = 0; j < nhooks; j++) {
1118 PyObject *hook = PyList_GetItem(path_hooks, j);
1119 if (hook == NULL)
1120 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001122 if (importer != NULL)
1123 break;
1124
1125 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1126 return NULL;
1127 }
1128 PyErr_Clear();
1129 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001130 if (importer == NULL) {
1131 importer = PyObject_CallFunctionObjArgs(
Christian Heimes9cd17752007-11-18 19:35:23 +00001132 (PyObject *)&PyNullImporter_Type, p, NULL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001133 );
1134 if (importer == NULL) {
1135 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1136 PyErr_Clear();
1137 return Py_None;
1138 }
1139 }
1140 }
1141 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001142 int err = PyDict_SetItem(path_importer_cache, p, importer);
1143 Py_DECREF(importer);
1144 if (err != 0)
1145 return NULL;
1146 }
1147 return importer;
1148}
1149
Christian Heimes9cd17752007-11-18 19:35:23 +00001150PyAPI_FUNC(PyObject *)
1151PyImport_GetImporter(PyObject *path) {
1152 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1153
1154 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1155 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1156 importer = get_path_importer(path_importer_cache,
1157 path_hooks, path);
1158 }
1159 }
1160 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1161 return importer;
1162}
1163
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164/* Search the path (default sys.path) for a module. Return the
1165 corresponding filedescr struct, and (via return arguments) the
1166 pathname and an open file. Return NULL if the module is not found. */
1167
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001168#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001169extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001170 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001171#endif
1172
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001174static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001175static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001176
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001178find_module(char *fullname, char *subname, PyObject *path, char *buf,
1179 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001181 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001182 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001183 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001184 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001185 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001186 PyObject *path_hooks, *path_importer_cache;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001187 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001188 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1189 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1190 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001191 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001192#if defined(PYOS_OS2)
1193 size_t saved_len;
1194 size_t saved_namelen;
1195 char *saved_buf = NULL;
1196#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001197 if (p_loader != NULL)
1198 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001199
Just van Rossum52e14d62002-12-30 22:08:05 +00001200 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001201 PyErr_SetString(PyExc_OverflowError,
1202 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001203 return NULL;
1204 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001205 strcpy(name, subname);
1206
1207 /* sys.meta_path import hook */
1208 if (p_loader != NULL) {
1209 PyObject *meta_path;
1210
1211 meta_path = PySys_GetObject("meta_path");
1212 if (meta_path == NULL || !PyList_Check(meta_path)) {
1213 PyErr_SetString(PyExc_ImportError,
1214 "sys.meta_path must be a list of "
1215 "import hooks");
1216 return NULL;
1217 }
1218 Py_INCREF(meta_path); /* zap guard */
1219 npath = PyList_Size(meta_path);
1220 for (i = 0; i < npath; i++) {
1221 PyObject *loader;
1222 PyObject *hook = PyList_GetItem(meta_path, i);
1223 loader = PyObject_CallMethod(hook, "find_module",
1224 "sO", fullname,
1225 path != NULL ?
1226 path : Py_None);
1227 if (loader == NULL) {
1228 Py_DECREF(meta_path);
1229 return NULL; /* true error */
1230 }
1231 if (loader != Py_None) {
1232 /* a loader was found */
1233 *p_loader = loader;
1234 Py_DECREF(meta_path);
1235 return &importhookdescr;
1236 }
1237 Py_DECREF(loader);
1238 }
1239 Py_DECREF(meta_path);
1240 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001241
Guido van Rossum13d77992007-07-23 03:16:50 +00001242 if (path != NULL && PyUnicode_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001243 /* The only type of submodule allowed inside a "frozen"
1244 package are other frozen modules or packages. */
Guido van Rossum13d77992007-07-23 03:16:50 +00001245 char *p = PyUnicode_AsString(path);
1246 if (strlen(p) + 1 + strlen(name) >= (size_t)buflen) {
Guido van Rossum0506a431998-08-11 15:07:39 +00001247 PyErr_SetString(PyExc_ImportError,
1248 "full frozen module name too long");
1249 return NULL;
1250 }
Guido van Rossum13d77992007-07-23 03:16:50 +00001251 strcpy(buf, p);
Guido van Rossum0506a431998-08-11 15:07:39 +00001252 strcat(buf, ".");
1253 strcat(buf, name);
1254 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001255 if (find_frozen(name) != NULL) {
1256 strcpy(buf, name);
1257 return &fd_frozen;
1258 }
1259 PyErr_Format(PyExc_ImportError,
1260 "No frozen submodule named %.200s", name);
1261 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001262 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001263 if (path == NULL) {
1264 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001265 strcpy(buf, name);
1266 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001267 }
Greg Ward201baee2001-10-04 14:52:06 +00001268 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001269 strcpy(buf, name);
1270 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001271 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272
Guido van Rossumac279101996-08-22 23:10:58 +00001273#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001274 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1275 if (fp != NULL) {
1276 *p_fp = fp;
1277 return fdp;
1278 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001279#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001280 path = PySys_GetObject("path");
1281 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282 if (path == NULL || !PyList_Check(path)) {
1283 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001284 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285 return NULL;
1286 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001287
1288 path_hooks = PySys_GetObject("path_hooks");
1289 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1290 PyErr_SetString(PyExc_ImportError,
1291 "sys.path_hooks must be a list of "
1292 "import hooks");
1293 return NULL;
1294 }
1295 path_importer_cache = PySys_GetObject("path_importer_cache");
1296 if (path_importer_cache == NULL ||
1297 !PyDict_Check(path_importer_cache)) {
1298 PyErr_SetString(PyExc_ImportError,
1299 "sys.path_importer_cache must be a dict");
1300 return NULL;
1301 }
1302
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304 namelen = strlen(name);
1305 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 PyObject *v = PyList_GetItem(path, i);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001307 PyObject *origv = v;
Guido van Rossum6262cc72007-05-09 23:29:27 +00001308 const char *base;
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001309 Py_ssize_t size;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001310 if (!v)
1311 return NULL;
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001312 if (PyUnicode_Check(v)) {
1313 v = _PyUnicode_AsDefaultEncodedString(v, NULL);
1314 if (v == NULL)
1315 return NULL;
1316 }
1317 if (!PyString_Check(v))
1318 continue;
1319 base = PyString_AS_STRING(v);
1320 size = PyString_GET_SIZE(v);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001321 len = size;
Walter Dörwald3430d702002-06-17 10:43:59 +00001322 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001324 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001325 strcpy(buf, base);
Walter Dörwald3430d702002-06-17 10:43:59 +00001326 if (strlen(buf) != len) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001327 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001328 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001329
1330 /* sys.path_hooks import hook */
1331 if (p_loader != NULL) {
1332 PyObject *importer;
1333
1334 importer = get_path_importer(path_importer_cache,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001335 path_hooks, origv);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001336 if (importer == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001337 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001339 /* Note: importer is a borrowed reference */
1340 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001341 PyObject *loader;
1342 loader = PyObject_CallMethod(importer,
1343 "find_module",
1344 "s", fullname);
1345 if (loader == NULL)
1346 return NULL; /* error */
1347 if (loader != Py_None) {
1348 /* a loader was found */
1349 *p_loader = loader;
1350 return &importhookdescr;
1351 }
1352 Py_DECREF(loader);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001354 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001355 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001356 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001357
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001358 if (len > 0 && buf[len-1] != SEP
1359#ifdef ALTSEP
1360 && buf[len-1] != ALTSEP
1361#endif
1362 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001363 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001364 strcpy(buf+len, name);
1365 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001366
1367 /* Check for package import (buf holds a directory name,
1368 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001369#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001370 if (stat(buf, &statbuf) == 0 && /* it exists */
1371 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001372 case_ok(buf, len, namelen, name)) { /* case matches */
1373 if (find_init_module(buf)) { /* and has __init__.py */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374 return &fd_package;
1375 }
1376 else {
1377 char warnstr[MAXPATHLEN+80];
1378 sprintf(warnstr, "Not importing directory "
1379 "'%.*s': missing __init__.py",
1380 MAXPATHLEN, buf);
Skip Montanaro46fc3372007-08-12 11:44:53 +00001381 if (PyErr_WarnEx(PyExc_ImportWarning,
1382 warnstr, 1)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001383 return NULL;
1384 }
1385 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001386 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001387#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001388#if defined(PYOS_OS2)
1389 /* take a snapshot of the module spec for restoration
1390 * after the 8 character DLL hackery
1391 */
1392 saved_buf = strdup(buf);
1393 saved_len = len;
1394 saved_namelen = namelen;
1395#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001397#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001398 /* OS/2 limits DLLs to 8 character names (w/o
1399 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001400 * so if the name is longer than that and its a
1401 * dynamically loaded module we're going to try,
1402 * truncate the name before trying
1403 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001404 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001405 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001406 const struct filedescr *scan;
1407 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001408 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001409 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001410 break;
1411 else
1412 scan++;
1413 }
1414 if (scan->suffix != NULL) {
1415 /* yes, so truncate the name */
1416 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001417 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001418 buf[len] = '\0';
1419 }
1420 }
1421#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001424 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001425 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001426 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001427 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001428 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001429 if (fp != NULL) {
1430 if (case_ok(buf, len, namelen, name))
1431 break;
1432 else { /* continue search */
1433 fclose(fp);
1434 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001435 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001436 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001437#if defined(PYOS_OS2)
1438 /* restore the saved snapshot */
1439 strcpy(buf, saved_buf);
1440 len = saved_len;
1441 namelen = saved_namelen;
1442#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001443 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001444#if defined(PYOS_OS2)
1445 /* don't need/want the module name snapshot anymore */
1446 if (saved_buf)
1447 {
1448 free(saved_buf);
1449 saved_buf = NULL;
1450 }
1451#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001452 if (fp != NULL)
1453 break;
1454 }
1455 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001456 PyErr_Format(PyExc_ImportError,
1457 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001458 return NULL;
1459 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001460 *p_fp = fp;
1461 return fdp;
1462}
1463
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001464/* Helpers for main.c
1465 * Find the source file corresponding to a named module
1466 */
1467struct filedescr *
1468_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1469 size_t buflen, FILE **p_fp, PyObject **p_loader)
1470{
1471 return find_module((char *) name, (char *) name, path,
1472 buf, buflen, p_fp, p_loader);
1473}
1474
1475PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1476{
1477 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1478}
1479
Martin v. Löwis18e16552006-02-15 17:27:45 +00001480/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001481 * The arguments here are tricky, best shown by example:
1482 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1483 * ^ ^ ^ ^
1484 * |--------------------- buf ---------------------|
1485 * |------------------- len ------------------|
1486 * |------ name -------|
1487 * |----- namelen -----|
1488 * buf is the full path, but len only counts up to (& exclusive of) the
1489 * extension. name is the module name, also exclusive of extension.
1490 *
1491 * We've already done a successful stat() or fopen() on buf, so know that
1492 * there's some match, possibly case-insensitive.
1493 *
Tim Peters50d8d372001-02-28 05:34:27 +00001494 * case_ok() is to return 1 if there's a case-sensitive match for
1495 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1496 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001497 *
Tim Peters50d8d372001-02-28 05:34:27 +00001498 * case_ok() is used to implement case-sensitive import semantics even
1499 * on platforms with case-insensitive filesystems. It's trivial to implement
1500 * for case-sensitive filesystems. It's pretty much a cross-platform
1501 * nightmare for systems with case-insensitive filesystems.
1502 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001503
Tim Peters50d8d372001-02-28 05:34:27 +00001504/* First we may need a pile of platform-specific header files; the sequence
1505 * of #if's here should match the sequence in the body of case_ok().
1506 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001507#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001508#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001509
Tim Peters50d8d372001-02-28 05:34:27 +00001510#elif defined(DJGPP)
1511#include <dir.h>
1512
Jason Tishler7961aa62005-05-20 00:56:54 +00001513#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001514#include <sys/types.h>
1515#include <dirent.h>
1516
Andrew MacIntyred9400542002-02-26 11:41:34 +00001517#elif defined(PYOS_OS2)
1518#define INCL_DOS
1519#define INCL_DOSERRORS
1520#define INCL_NOPMAPI
1521#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001522#endif
1523
Guido van Rossum0980bd91998-02-13 17:18:36 +00001524static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001525case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001526{
Tim Peters50d8d372001-02-28 05:34:27 +00001527/* Pick a platform-specific implementation; the sequence of #if's here should
1528 * match the sequence just above.
1529 */
1530
Jason Tishler7961aa62005-05-20 00:56:54 +00001531/* MS_WINDOWS */
1532#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001533 WIN32_FIND_DATA data;
1534 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001535
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001536 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001537 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001538
Guido van Rossum0980bd91998-02-13 17:18:36 +00001539 h = FindFirstFile(buf, &data);
1540 if (h == INVALID_HANDLE_VALUE) {
1541 PyErr_Format(PyExc_NameError,
1542 "Can't find file for module %.100s\n(filename %.300s)",
1543 name, buf);
1544 return 0;
1545 }
1546 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001547 return strncmp(data.cFileName, name, namelen) == 0;
1548
1549/* DJGPP */
1550#elif defined(DJGPP)
1551 struct ffblk ffblk;
1552 int done;
1553
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001554 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001555 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001556
1557 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1558 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001559 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001560 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001561 name, buf);
1562 return 0;
1563 }
Tim Peters50d8d372001-02-28 05:34:27 +00001564 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001565
Jason Tishler7961aa62005-05-20 00:56:54 +00001566/* new-fangled macintosh (macosx) or Cygwin */
1567#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001568 DIR *dirp;
1569 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001570 char dirname[MAXPATHLEN + 1];
1571 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001572
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001573 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001574 return 1;
1575
Tim Petersd1e87a82001-03-01 18:12:00 +00001576 /* Copy the dir component into dirname; substitute "." if empty */
1577 if (dirlen <= 0) {
1578 dirname[0] = '.';
1579 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001580 }
1581 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001582 assert(dirlen <= MAXPATHLEN);
1583 memcpy(dirname, buf, dirlen);
1584 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001585 }
1586 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001587 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001588 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001589 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001590 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001591 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001592#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001593 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001594#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001595 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001596#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001597 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001598 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001599 (void)closedir(dirp);
1600 return 1; /* Found */
1601 }
1602 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001603 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001604 }
Tim Peters430f5d42001-03-01 01:30:56 +00001605 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001606
Andrew MacIntyred9400542002-02-26 11:41:34 +00001607/* OS/2 */
1608#elif defined(PYOS_OS2)
1609 HDIR hdir = 1;
1610 ULONG srchcnt = 1;
1611 FILEFINDBUF3 ffbuf;
1612 APIRET rc;
1613
Christian Heimes790c8232008-01-07 21:14:23 +00001614 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001615 return 1;
1616
1617 rc = DosFindFirst(buf,
1618 &hdir,
1619 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1620 &ffbuf, sizeof(ffbuf),
1621 &srchcnt,
1622 FIL_STANDARD);
1623 if (rc != NO_ERROR)
1624 return 0;
1625 return strncmp(ffbuf.achName, name, namelen) == 0;
1626
Tim Peters50d8d372001-02-28 05:34:27 +00001627/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1628#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001629 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001630
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001631#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001632}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001633
Guido van Rossum0980bd91998-02-13 17:18:36 +00001634
Guido van Rossum197346f1997-10-31 18:38:52 +00001635#ifdef HAVE_STAT
1636/* Helper to look for __init__.py or __init__.py[co] in potential package */
1637static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001638find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001639{
Tim Peters0f9431f2001-07-05 03:47:53 +00001640 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001641 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001642 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001643 struct stat statbuf;
1644
Tim Peters0f9431f2001-07-05 03:47:53 +00001645/* For calling case_ok(buf, len, namelen, name):
1646 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1647 * ^ ^ ^ ^
1648 * |--------------------- buf ---------------------|
1649 * |------------------- len ------------------|
1650 * |------ name -------|
1651 * |----- namelen -----|
1652 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001653 if (save_len + 13 >= MAXPATHLEN)
1654 return 0;
1655 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001656 pname = buf + i;
1657 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001658 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001659 if (case_ok(buf,
1660 save_len + 9, /* len("/__init__") */
1661 8, /* len("__init__") */
1662 pname)) {
1663 buf[save_len] = '\0';
1664 return 1;
1665 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001666 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001667 i += strlen(pname);
1668 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001669 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001670 if (case_ok(buf,
1671 save_len + 9, /* len("/__init__") */
1672 8, /* len("__init__") */
1673 pname)) {
1674 buf[save_len] = '\0';
1675 return 1;
1676 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001677 }
1678 buf[save_len] = '\0';
1679 return 0;
1680}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001681
Guido van Rossum197346f1997-10-31 18:38:52 +00001682#endif /* HAVE_STAT */
1683
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001684
Tim Petersdbd9ba62000-07-09 03:09:57 +00001685static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001686
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001687/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001688 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001691load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001692{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001693 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001695 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001696
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001697 /* First check that there's an open file (if we need one) */
1698 switch (type) {
1699 case PY_SOURCE:
1700 case PY_COMPILED:
1701 if (fp == NULL) {
1702 PyErr_Format(PyExc_ValueError,
1703 "file object required for import (type code %d)",
1704 type);
1705 return NULL;
1706 }
1707 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001708
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001709 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001710
1711 case PY_SOURCE:
1712 m = load_source_module(name, buf, fp);
1713 break;
1714
1715 case PY_COMPILED:
1716 m = load_compiled_module(name, buf, fp);
1717 break;
1718
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001719#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001720 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001722 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001723#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001724
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001725 case PKG_DIRECTORY:
1726 m = load_package(name, buf);
1727 break;
1728
1729 case C_BUILTIN:
1730 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001731 if (buf != NULL && buf[0] != '\0')
1732 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001733 if (type == C_BUILTIN)
1734 err = init_builtin(name);
1735 else
1736 err = PyImport_ImportFrozenModule(name);
1737 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001738 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001739 if (err == 0) {
1740 PyErr_Format(PyExc_ImportError,
1741 "Purported %s module %.200s not found",
1742 type == C_BUILTIN ?
1743 "builtin" : "frozen",
1744 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001745 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001746 }
1747 modules = PyImport_GetModuleDict();
1748 m = PyDict_GetItemString(modules, name);
1749 if (m == NULL) {
1750 PyErr_Format(
1751 PyExc_ImportError,
1752 "%s module %.200s not properly initialized",
1753 type == C_BUILTIN ?
1754 "builtin" : "frozen",
1755 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001756 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001757 }
1758 Py_INCREF(m);
1759 break;
1760
Just van Rossum52e14d62002-12-30 22:08:05 +00001761 case IMP_HOOK: {
1762 if (loader == NULL) {
1763 PyErr_SetString(PyExc_ImportError,
1764 "import hook without loader");
1765 return NULL;
1766 }
1767 m = PyObject_CallMethod(loader, "load_module", "s", name);
1768 break;
1769 }
1770
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001771 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001772 PyErr_Format(PyExc_ImportError,
1773 "Don't know how to import %.200s (type code %d)",
1774 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001775 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001776
1777 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778
1779 return m;
1780}
1781
1782
1783/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001784 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001786
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001787static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001788init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001789{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001790 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001791
Greg Ward201baee2001-10-04 14:52:06 +00001792 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001793 return 1;
1794
Guido van Rossum771c6c81997-10-31 18:37:24 +00001795 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001796 if (strcmp(name, p->name) == 0) {
1797 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001798 PyErr_Format(PyExc_ImportError,
1799 "Cannot re-init internal module %.200s",
1800 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001801 return -1;
1802 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001804 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001805 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001808 if (_PyImport_FixupExtension(name, name) == NULL)
1809 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001810 return 1;
1811 }
1812 }
1813 return 0;
1814}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001815
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001816
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001817/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001818
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001819static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001821{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001822 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001823
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001825 if (p->name == NULL)
1826 return NULL;
1827 if (strcmp(p->name, name) == 0)
1828 break;
1829 }
1830 return p;
1831}
1832
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001835{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001836 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001837 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001838
1839 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001840 PyErr_Format(PyExc_ImportError,
1841 "No such frozen object named %.200s",
1842 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001843 return NULL;
1844 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001845 if (p->code == NULL) {
1846 PyErr_Format(PyExc_ImportError,
1847 "Excluded frozen object named %.200s",
1848 name);
1849 return NULL;
1850 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001851 size = p->size;
1852 if (size < 0)
1853 size = -size;
1854 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001855}
1856
1857/* Initialize a frozen module.
1858 Return 1 for succes, 0 if the module is not found, and -1 with
1859 an exception set if the initialization failed.
1860 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001861
1862int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001863PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001864{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001865 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 PyObject *co;
1867 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001868 int ispackage;
1869 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001870
1871 if (p == NULL)
1872 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001873 if (p->code == NULL) {
1874 PyErr_Format(PyExc_ImportError,
1875 "Excluded frozen object named %.200s",
1876 name);
1877 return -1;
1878 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001879 size = p->size;
1880 ispackage = (size < 0);
1881 if (ispackage)
1882 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001884 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001885 name, ispackage ? " package" : "");
1886 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001887 if (co == NULL)
1888 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001890 PyErr_Format(PyExc_TypeError,
1891 "frozen object %.200s is not a code object",
1892 name);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001893 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001894 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001895 if (ispackage) {
1896 /* Set __path__ to the package name */
1897 PyObject *d, *s;
1898 int err;
1899 m = PyImport_AddModule(name);
1900 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001901 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001902 d = PyModule_GetDict(m);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001903 s = PyUnicode_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001904 if (s == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001905 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001906 err = PyDict_SetItemString(d, "__path__", s);
1907 Py_DECREF(s);
1908 if (err != 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001909 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001910 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001911 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001912 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001913 goto err_return;
1914 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001916 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001917err_return:
1918 Py_DECREF(co);
1919 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001920}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001921
1922
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001923/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001924 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001925
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001927PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001928{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001929 PyObject *pname;
1930 PyObject *result;
1931
Martin v. Löwis5b222132007-06-10 09:51:05 +00001932 pname = PyUnicode_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00001933 if (pname == NULL)
1934 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001935 result = PyImport_Import(pname);
1936 Py_DECREF(pname);
1937 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001938}
1939
Christian Heimes072c0f12008-01-03 23:01:04 +00001940/* Import a module without blocking
1941 *
1942 * At first it tries to fetch the module from sys.modules. If the module was
1943 * never loaded before it loads it with PyImport_ImportModule() unless another
1944 * thread holds the import lock. In the latter case the function raises an
1945 * ImportError instead of blocking.
1946 *
1947 * Returns the module object with incremented ref count.
1948 */
1949PyObject *
1950PyImport_ImportModuleNoBlock(const char *name)
1951{
1952 PyObject *result;
1953 PyObject *modules;
1954 long me;
1955
1956 /* Try to get the module from sys.modules[name] */
1957 modules = PyImport_GetModuleDict();
1958 if (modules == NULL)
1959 return NULL;
1960
1961 result = PyDict_GetItemString(modules, name);
1962 if (result != NULL) {
1963 Py_INCREF(result);
1964 return result;
1965 }
1966 else {
1967 PyErr_Clear();
1968 }
1969
1970 /* check the import lock
1971 * me might be -1 but I ignore the error here, the lock function
1972 * takes care of the problem */
1973 me = PyThread_get_thread_ident();
1974 if (import_lock_thread == -1 || import_lock_thread == me) {
1975 /* no thread or me is holding the lock */
1976 return PyImport_ImportModule(name);
1977 }
1978 else {
1979 PyErr_Format(PyExc_ImportError,
1980 "Failed to import %.200s because the import lock"
1981 "is held by another thread.",
1982 name);
1983 return NULL;
1984 }
1985}
1986
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001987/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001988static PyObject *get_parent(PyObject *globals, char *buf,
1989 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001990static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001992static int mark_miss(char *name);
1993static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001994 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001995static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001996
1997/* The Magnum Opus of dotted-name import :-) */
1998
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001999static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002000import_module_level(char *name, PyObject *globals, PyObject *locals,
2001 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002002{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002003 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002004 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002005 PyObject *parent, *head, *next, *tail;
2006
Christian Heimes454f37b2008-01-10 00:10:02 +00002007 if (strchr(name, '/') != NULL
2008#ifdef MS_WINDOWS
2009 || strchr(name, '\\') != NULL
2010#endif
2011 ) {
2012 PyErr_SetString(PyExc_ImportError,
2013 "Import by filename is not supported.");
2014 return NULL;
2015 }
2016
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002017 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002018 if (parent == NULL)
2019 return NULL;
2020
2021 head = load_next(parent, Py_None, &name, buf, &buflen);
2022 if (head == NULL)
2023 return NULL;
2024
2025 tail = head;
2026 Py_INCREF(tail);
2027 while (name) {
2028 next = load_next(tail, tail, &name, buf, &buflen);
2029 Py_DECREF(tail);
2030 if (next == NULL) {
2031 Py_DECREF(head);
2032 return NULL;
2033 }
2034 tail = next;
2035 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002036 if (tail == Py_None) {
2037 /* If tail is Py_None, both get_parent and load_next found
2038 an empty module name: someone called __import__("") or
2039 doctored faulty bytecode */
2040 Py_DECREF(tail);
2041 Py_DECREF(head);
2042 PyErr_SetString(PyExc_ValueError,
2043 "Empty module name");
2044 return NULL;
2045 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002046
2047 if (fromlist != NULL) {
2048 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2049 fromlist = NULL;
2050 }
2051
2052 if (fromlist == NULL) {
2053 Py_DECREF(tail);
2054 return head;
2055 }
2056
2057 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002058 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002059 Py_DECREF(tail);
2060 return NULL;
2061 }
2062
2063 return tail;
2064}
2065
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002066PyObject *
2067PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2068 PyObject *fromlist, int level)
2069{
2070 PyObject *result;
2071 lock_import();
2072 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002073 if (unlock_import() < 0) {
2074 Py_XDECREF(result);
2075 PyErr_SetString(PyExc_RuntimeError,
2076 "not holding the import lock");
2077 return NULL;
2078 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002079 return result;
2080}
2081
Fred Drake87590902004-05-28 20:21:36 +00002082/* Return the package that an import is being performed in. If globals comes
2083 from the module foo.bar.bat (not itself a package), this returns the
2084 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002085 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002086
2087 The *name* of the returned package is returned in buf, with the length of
2088 the name in *p_buflen.
2089
2090 If globals doesn't come from a package or a module in a package, or a
2091 corresponding entry is not found in sys.modules, Py_None is returned.
2092*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002093static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002094get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002095{
2096 static PyObject *namestr = NULL;
2097 static PyObject *pathstr = NULL;
Nick Coghlande10c852007-12-04 12:22:52 +00002098 static PyObject *pkgstr = NULL;
2099 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002100
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002101 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002102 return Py_None;
2103
2104 if (namestr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002105 namestr = PyUnicode_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002106 if (namestr == NULL)
2107 return NULL;
2108 }
2109 if (pathstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002110 pathstr = PyUnicode_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002111 if (pathstr == NULL)
2112 return NULL;
2113 }
Nick Coghlande10c852007-12-04 12:22:52 +00002114 if (pkgstr == NULL) {
2115 pkgstr = PyUnicode_InternFromString("__package__");
2116 if (pkgstr == NULL)
2117 return NULL;
2118 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002119
2120 *buf = '\0';
2121 *p_buflen = 0;
Nick Coghlande10c852007-12-04 12:22:52 +00002122 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002123
Nick Coghlande10c852007-12-04 12:22:52 +00002124 if ((pkgname != NULL) && (pkgname != Py_None)) {
2125 /* __package__ is set, so use it */
2126 Py_ssize_t len;
2127 if (!PyUnicode_Check(pkgname)) {
2128 PyErr_SetString(PyExc_ValueError,
2129 "__package__ set to non-string");
2130 return NULL;
2131 }
2132 len = PyUnicode_GET_SIZE(pkgname);
2133 if (len == 0) {
2134 if (level > 0) {
2135 PyErr_SetString(PyExc_ValueError,
2136 "Attempted relative import in non-package");
2137 return NULL;
2138 }
2139 return Py_None;
2140 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002141 if (len > MAXPATHLEN) {
2142 PyErr_SetString(PyExc_ValueError,
Nick Coghlande10c852007-12-04 12:22:52 +00002143 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002144 return NULL;
2145 }
Nick Coghlande10c852007-12-04 12:22:52 +00002146 strcpy(buf, PyUnicode_AsString(pkgname));
2147 } else {
2148 /* __package__ not set, so figure it out and set it */
2149 modname = PyDict_GetItem(globals, namestr);
2150 if (modname == NULL || !PyUnicode_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002151 return Py_None;
Nick Coghlande10c852007-12-04 12:22:52 +00002152
2153 modpath = PyDict_GetItem(globals, pathstr);
2154 if (modpath != NULL) {
2155 /* __path__ is set, so modname is already the package name */
2156 Py_ssize_t len = PyUnicode_GET_SIZE(modname);
2157 int error;
2158 if (len > MAXPATHLEN) {
2159 PyErr_SetString(PyExc_ValueError,
2160 "Module name too long");
2161 return NULL;
2162 }
2163 strcpy(buf, PyUnicode_AsString(modname));
2164 error = PyDict_SetItem(globals, pkgstr, modname);
2165 if (error) {
2166 PyErr_SetString(PyExc_ValueError,
2167 "Could not set __package__");
2168 return NULL;
2169 }
2170 } else {
2171 /* Normal module, so work out the package name if any */
2172 char *start = PyUnicode_AsString(modname);
2173 char *lastdot = strrchr(start, '.');
2174 size_t len;
2175 int error;
2176 if (lastdot == NULL && level > 0) {
2177 PyErr_SetString(PyExc_ValueError,
2178 "Attempted relative import in non-package");
2179 return NULL;
2180 }
2181 if (lastdot == NULL) {
2182 error = PyDict_SetItem(globals, pkgstr, Py_None);
2183 if (error) {
2184 PyErr_SetString(PyExc_ValueError,
2185 "Could not set __package__");
2186 return NULL;
2187 }
2188 return Py_None;
2189 }
2190 len = lastdot - start;
2191 if (len >= MAXPATHLEN) {
2192 PyErr_SetString(PyExc_ValueError,
2193 "Module name too long");
2194 return NULL;
2195 }
2196 strncpy(buf, start, len);
2197 buf[len] = '\0';
2198 pkgname = PyUnicode_FromString(buf);
2199 if (pkgname == NULL) {
2200 return NULL;
2201 }
2202 error = PyDict_SetItem(globals, pkgstr, pkgname);
2203 Py_DECREF(pkgname);
2204 if (error) {
2205 PyErr_SetString(PyExc_ValueError,
2206 "Could not set __package__");
2207 return NULL;
2208 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002209 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002210 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002211 while (--level > 0) {
2212 char *dot = strrchr(buf, '.');
2213 if (dot == NULL) {
2214 PyErr_SetString(PyExc_ValueError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002215 "Attempted relative import beyond "
2216 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002217 return NULL;
2218 }
2219 *dot = '\0';
2220 }
2221 *p_buflen = strlen(buf);
2222
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002223 modules = PyImport_GetModuleDict();
2224 parent = PyDict_GetItemString(modules, buf);
2225 if (parent == NULL)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002226 PyErr_Format(PyExc_SystemError,
2227 "Parent module '%.200s' not loaded", buf);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002228 return parent;
2229 /* We expect, but can't guarantee, if parent != None, that:
2230 - parent.__name__ == buf
2231 - parent.__dict__ is globals
2232 If this is violated... Who cares? */
2233}
2234
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002235/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002236static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002238 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002239{
2240 char *name = *p_name;
2241 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002242 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002243 char *p;
2244 PyObject *result;
2245
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002246 if (strlen(name) == 0) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002247 /* completely empty module name should only happen in
2248 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002249 Py_INCREF(mod);
2250 *p_name = NULL;
2251 return mod;
2252 }
2253
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002254 if (dot == NULL) {
2255 *p_name = NULL;
2256 len = strlen(name);
2257 }
2258 else {
2259 *p_name = dot+1;
2260 len = dot-name;
2261 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002262 if (len == 0) {
2263 PyErr_SetString(PyExc_ValueError,
2264 "Empty module name");
2265 return NULL;
2266 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002267
2268 p = buf + *p_buflen;
2269 if (p != buf)
2270 *p++ = '.';
2271 if (p+len-buf >= MAXPATHLEN) {
2272 PyErr_SetString(PyExc_ValueError,
2273 "Module name too long");
2274 return NULL;
2275 }
2276 strncpy(p, name, len);
2277 p[len] = '\0';
2278 *p_buflen = p+len-buf;
2279
2280 result = import_submodule(mod, p, buf);
2281 if (result == Py_None && altmod != mod) {
2282 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002283 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002284 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002285 if (result != NULL && result != Py_None) {
2286 if (mark_miss(buf) != 0) {
2287 Py_DECREF(result);
2288 return NULL;
2289 }
2290 strncpy(buf, name, len);
2291 buf[len] = '\0';
2292 *p_buflen = len;
2293 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002294 }
2295 if (result == NULL)
2296 return NULL;
2297
2298 if (result == Py_None) {
2299 Py_DECREF(result);
2300 PyErr_Format(PyExc_ImportError,
2301 "No module named %.200s", name);
2302 return NULL;
2303 }
2304
2305 return result;
2306}
2307
2308static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002310{
2311 PyObject *modules = PyImport_GetModuleDict();
2312 return PyDict_SetItemString(modules, name, Py_None);
2313}
2314
2315static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002316ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002317 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002318{
2319 int i;
2320
2321 if (!PyObject_HasAttrString(mod, "__path__"))
2322 return 1;
2323
2324 for (i = 0; ; i++) {
2325 PyObject *item = PySequence_GetItem(fromlist, i);
2326 int hasit;
2327 if (item == NULL) {
2328 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2329 PyErr_Clear();
2330 return 1;
2331 }
2332 return 0;
2333 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002334 if (!PyUnicode_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002335 PyErr_SetString(PyExc_TypeError,
Neal Norwitz80e7f272007-08-26 06:45:23 +00002336 "Item in ``from list'' not a string");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002337 Py_DECREF(item);
2338 return 0;
2339 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002340 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002341 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002342 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002343 /* See if the package defines __all__ */
2344 if (recursive)
2345 continue; /* Avoid endless recursion */
2346 all = PyObject_GetAttrString(mod, "__all__");
2347 if (all == NULL)
2348 PyErr_Clear();
2349 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002350 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002351 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002352 if (!ret)
2353 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002354 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002355 continue;
2356 }
2357 hasit = PyObject_HasAttr(mod, item);
2358 if (!hasit) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002359 PyObject *item8;
2360 char *subname;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002361 PyObject *submod;
2362 char *p;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002363 if (!Py_FileSystemDefaultEncoding) {
2364 item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
2365 PyUnicode_GetSize(item),
Martin v. Löwis427dbff2007-06-12 05:53:00 +00002366 NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002367 } else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002368 item8 = PyUnicode_AsEncodedString(item,
2369 Py_FileSystemDefaultEncoding, NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002370 }
2371 if (!item8) {
2372 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2373 return 0;
2374 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002375 subname = PyString_AS_STRING(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002376 if (buflen + strlen(subname) >= MAXPATHLEN) {
2377 PyErr_SetString(PyExc_ValueError,
2378 "Module name too long");
2379 Py_DECREF(item);
2380 return 0;
2381 }
2382 p = buf + buflen;
2383 *p++ = '.';
2384 strcpy(p, subname);
2385 submod = import_submodule(mod, subname, buf);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002386 Py_DECREF(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002387 Py_XDECREF(submod);
2388 if (submod == NULL) {
2389 Py_DECREF(item);
2390 return 0;
2391 }
2392 }
2393 Py_DECREF(item);
2394 }
2395
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002396 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002397}
2398
Neil Schemenauer00b09662003-06-16 21:03:07 +00002399static int
2400add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2401 PyObject *modules)
2402{
2403 if (mod == Py_None)
2404 return 1;
2405 /* Irrespective of the success of this load, make a
2406 reference to it in the parent package module. A copy gets
2407 saved in the modules dictionary under the full name, so get a
2408 reference from there, if need be. (The exception is when the
2409 load failed with a SyntaxError -- then there's no trace in
2410 sys.modules. In that case, of course, do nothing extra.) */
2411 if (submod == NULL) {
2412 submod = PyDict_GetItemString(modules, fullname);
2413 if (submod == NULL)
2414 return 1;
2415 }
2416 if (PyModule_Check(mod)) {
2417 /* We can't use setattr here since it can give a
2418 * spurious warning if the submodule name shadows a
2419 * builtin name */
2420 PyObject *dict = PyModule_GetDict(mod);
2421 if (!dict)
2422 return 0;
2423 if (PyDict_SetItemString(dict, subname, submod) < 0)
2424 return 0;
2425 }
2426 else {
2427 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2428 return 0;
2429 }
2430 return 1;
2431}
2432
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002433static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002434import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002435{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002436 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002437 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002438
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002439 /* Require:
2440 if mod == None: subname == fullname
2441 else: mod.__name__ + "." + subname == fullname
2442 */
2443
Tim Peters50d8d372001-02-28 05:34:27 +00002444 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002445 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002446 }
2447 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002448 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002449 char buf[MAXPATHLEN+1];
2450 struct filedescr *fdp;
2451 FILE *fp = NULL;
2452
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002453 if (mod == Py_None)
2454 path = NULL;
2455 else {
2456 path = PyObject_GetAttrString(mod, "__path__");
2457 if (path == NULL) {
2458 PyErr_Clear();
2459 Py_INCREF(Py_None);
2460 return Py_None;
2461 }
2462 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002463
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002464 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002465 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2466 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002467 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002468 if (fdp == NULL) {
2469 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2470 return NULL;
2471 PyErr_Clear();
2472 Py_INCREF(Py_None);
2473 return Py_None;
2474 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002475 m = load_module(fullname, fp, buf, fdp->type, loader);
2476 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002477 if (fp)
2478 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002479 if (!add_submodule(mod, m, fullname, subname, modules)) {
2480 Py_XDECREF(m);
2481 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002482 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002483 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002484
2485 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002486}
2487
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002488
2489/* Re-import a module of any kind and return its module object, WITH
2490 INCREMENTED REFERENCE COUNT */
2491
Guido van Rossum79f25d91997-04-29 20:08:16 +00002492PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002493PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002494{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002495 PyInterpreterState *interp = PyThreadState_Get()->interp;
2496 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002497 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumd8faa362007-04-27 19:54:29 +00002498 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002499 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002500 char buf[MAXPATHLEN+1];
2501 struct filedescr *fdp;
2502 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002503 PyObject *newm;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002504
2505 if (modules_reloading == NULL) {
2506 Py_FatalError("PyImport_ReloadModule: "
Guido van Rossume7ba4952007-06-06 23:52:48 +00002507 "no modules_reloading dictionary!");
Guido van Rossumd8faa362007-04-27 19:54:29 +00002508 return NULL;
2509 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002510
Guido van Rossum79f25d91997-04-29 20:08:16 +00002511 if (m == NULL || !PyModule_Check(m)) {
2512 PyErr_SetString(PyExc_TypeError,
2513 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002514 return NULL;
2515 }
Neal Norwitz5616c6d2007-08-26 05:32:41 +00002516 name = (char*)PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002517 if (name == NULL)
2518 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002519 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002520 PyErr_Format(PyExc_ImportError,
2521 "reload(): module %.200s not in sys.modules",
2522 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002523 return NULL;
2524 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002525 existing_m = PyDict_GetItemString(modules_reloading, name);
2526 if (existing_m != NULL) {
2527 /* Due to a recursive reload, this module is already
2528 being reloaded. */
2529 Py_INCREF(existing_m);
2530 return existing_m;
2531 }
2532 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2533 return NULL;
2534
Guido van Rossum222ef561997-09-06 19:41:09 +00002535 subname = strrchr(name, '.');
2536 if (subname == NULL)
2537 subname = name;
2538 else {
2539 PyObject *parentname, *parent;
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002540 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002541 if (parentname == NULL) {
2542 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002543 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002544 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002545 parent = PyDict_GetItem(modules, parentname);
2546 if (parent == NULL) {
2547 PyErr_Format(PyExc_ImportError,
2548 "reload(): parent %.200s not in sys.modules",
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002549 PyUnicode_AsString(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002550 Py_DECREF(parentname);
Guido van Rossume7ba4952007-06-06 23:52:48 +00002551 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002552 return NULL;
2553 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002554 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002555 subname++;
2556 path = PyObject_GetAttrString(parent, "__path__");
2557 if (path == NULL)
2558 PyErr_Clear();
2559 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002560 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002561 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002562 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002563
2564 if (fdp == NULL) {
2565 Py_XDECREF(loader);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002566 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002567 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002568 }
2569
2570 newm = load_module(name, fp, buf, fdp->type, loader);
2571 Py_XDECREF(loader);
2572
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002573 if (fp)
2574 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002575 if (newm == NULL) {
2576 /* load_module probably removed name from modules because of
2577 * the error. Put back the original module object. We're
2578 * going to return NULL in this case regardless of whether
2579 * replacing name succeeds, so the return value is ignored.
2580 */
2581 PyDict_SetItemString(modules, name, m);
2582 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002583 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002584 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002585}
2586
2587
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002588/* Higher-level import emulator which emulates the "import" statement
2589 more accurately -- it invokes the __import__() function from the
2590 builtins of the current globals. This means that the import is
2591 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002592 environment, e.g. by "rexec".
2593 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002594 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002595 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002596
2597PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002599{
2600 static PyObject *silly_list = NULL;
2601 static PyObject *builtins_str = NULL;
2602 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002603 PyObject *globals = NULL;
2604 PyObject *import = NULL;
2605 PyObject *builtins = NULL;
2606 PyObject *r = NULL;
2607
2608 /* Initialize constant string objects */
2609 if (silly_list == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002610 import_str = PyUnicode_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002611 if (import_str == NULL)
2612 return NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002613 builtins_str = PyUnicode_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002614 if (builtins_str == NULL)
2615 return NULL;
2616 silly_list = Py_BuildValue("[s]", "__doc__");
2617 if (silly_list == NULL)
2618 return NULL;
2619 }
2620
2621 /* Get the builtins from current globals */
2622 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002623 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002624 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002625 builtins = PyObject_GetItem(globals, builtins_str);
2626 if (builtins == NULL)
2627 goto err;
2628 }
2629 else {
2630 /* No globals -- use standard builtins, and fake globals */
2631 PyErr_Clear();
2632
Georg Brandl1a3284e2007-12-02 09:40:06 +00002633 builtins = PyImport_ImportModuleLevel("builtins",
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002634 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002635 if (builtins == NULL)
2636 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002637 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2638 if (globals == NULL)
2639 goto err;
2640 }
2641
2642 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002643 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002644 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002645 if (import == NULL)
2646 PyErr_SetObject(PyExc_KeyError, import_str);
2647 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002648 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002649 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002650 if (import == NULL)
2651 goto err;
2652
Christian Heimes072c0f12008-01-03 23:01:04 +00002653 /* Call the __import__ function with the proper argument list
2654 * Always use absolute import here. */
2655 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2656 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002657
2658 err:
2659 Py_XDECREF(globals);
2660 Py_XDECREF(builtins);
2661 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002662
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002663 return r;
2664}
2665
2666
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002667/* Module 'imp' provides Python access to the primitives used for
2668 importing modules.
2669*/
2670
Guido van Rossum79f25d91997-04-29 20:08:16 +00002671static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002672imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002673{
2674 char buf[4];
2675
Guido van Rossum96774c12000-05-01 20:19:08 +00002676 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2677 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2678 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2679 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002680
Guido van Rossumad8d3002007-08-03 18:40:49 +00002681 return PyBytes_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002682}
2683
Guido van Rossum79f25d91997-04-29 20:08:16 +00002684static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002685imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002686{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002687 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002688 struct filedescr *fdp;
2689
Guido van Rossum79f25d91997-04-29 20:08:16 +00002690 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002691 if (list == NULL)
2692 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002693 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2694 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002695 fdp->suffix, fdp->mode, fdp->type);
2696 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002697 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002698 return NULL;
2699 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 if (PyList_Append(list, item) < 0) {
2701 Py_DECREF(list);
2702 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002703 return NULL;
2704 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002706 }
2707 return list;
2708}
2709
Guido van Rossum79f25d91997-04-29 20:08:16 +00002710static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002711call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002712{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002713 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002714 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002715 struct filedescr *fdp;
2716 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002717 FILE *fp = NULL;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002718 int fd = -1;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002719 char *found_encoding = NULL;
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002720 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002721
2722 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002723 if (path == Py_None)
2724 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002725 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002726 if (fdp == NULL)
2727 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002728 if (fp != NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002729 fd = fileno(fp);
2730 if (fd != -1)
2731 fd = dup(fd);
2732 fclose(fp);
2733 fp = NULL;
2734 }
2735 if (fd != -1) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002736 if (strchr(fdp->mode, 'b') == NULL) {
Brett Cannon3bb42d92007-10-20 03:43:15 +00002737 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
2738 memory. */
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002739 found_encoding = PyTokenizer_FindEncoding(fd);
2740 lseek(fd, 0, 0); /* Reset position */
Brett Cannon3bb42d92007-10-20 03:43:15 +00002741 encoding = (found_encoding != NULL) ? found_encoding :
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002742 (char*)PyUnicode_GetDefaultEncoding();
2743 }
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002744 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00002745 (char*)encoding, NULL, NULL, 1);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002746 if (fob == NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002747 close(fd);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002748 PyMem_FREE(found_encoding);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002749 return NULL;
2750 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002751 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002752 else {
2753 fob = Py_None;
2754 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002755 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002756 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002757 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002758 Py_DECREF(fob);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002759 PyMem_FREE(found_encoding);
2760
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002761 return ret;
2762}
2763
Guido van Rossum79f25d91997-04-29 20:08:16 +00002764static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002765imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002766{
2767 char *name;
2768 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002769 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002770 return NULL;
2771 return call_find_module(name, path);
2772}
2773
2774static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002775imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002776{
2777 char *name;
2778 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002780 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002781 return NULL;
2782 ret = init_builtin(name);
2783 if (ret < 0)
2784 return NULL;
2785 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 Py_INCREF(Py_None);
2787 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 m = PyImport_AddModule(name);
2790 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002791 return m;
2792}
2793
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002795imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002796{
2797 char *name;
2798 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002800 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002801 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002803 if (ret < 0)
2804 return NULL;
2805 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002806 Py_INCREF(Py_None);
2807 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002808 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002809 m = PyImport_AddModule(name);
2810 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002811 return m;
2812}
2813
Guido van Rossum79f25d91997-04-29 20:08:16 +00002814static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002815imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002816{
2817 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002818
Guido van Rossum43713e52000-02-29 13:59:29 +00002819 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002820 return NULL;
2821 return get_frozen_object(name);
2822}
2823
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002825imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002827 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002828 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002829 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00002830 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002831}
2832
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002834imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002835{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002836 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002837 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002838 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002839 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002840 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002841 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002842}
2843
2844static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002845get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002846{
2847 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002848 if (mode[0] == 'U')
2849 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002850 if (fob == NULL) {
2851 fp = fopen(pathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002852 }
2853 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002854 int fd = PyObject_AsFileDescriptor(fob);
2855 if (fd == -1)
2856 return NULL;
2857 /* XXX This will leak a FILE struct. Fix this!!!!
2858 (But it doesn't leak a file descrioptor!) */
2859 fp = fdopen(fd, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002860 }
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002861 if (fp == NULL)
2862 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002863 return fp;
2864}
2865
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002868{
2869 char *name;
2870 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 PyObject *fob = NULL;
2872 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002873 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002874 if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
2875 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002876 return NULL;
2877 fp = get_file(pathname, fob, "rb");
2878 if (fp == NULL)
2879 return NULL;
2880 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002881 if (fob == NULL)
2882 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002883 return m;
2884}
2885
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002886#ifdef HAVE_DYNAMIC_LOADING
2887
Guido van Rossum79f25d91997-04-29 20:08:16 +00002888static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002889imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002890{
2891 char *name;
2892 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002893 PyObject *fob = NULL;
2894 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002895 FILE *fp = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002896 if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
2897 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002898 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002899 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002900 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002901 if (fp == NULL)
2902 return NULL;
2903 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002904 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002905 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002906}
2907
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002908#endif /* HAVE_DYNAMIC_LOADING */
2909
Guido van Rossum79f25d91997-04-29 20:08:16 +00002910static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002912{
2913 char *name;
2914 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002915 PyObject *fob = NULL;
2916 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002917 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002918 if (!PyArg_ParseTuple(args, "ss|O:load_source",
2919 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002920 return NULL;
2921 fp = get_file(pathname, fob, "r");
2922 if (fp == NULL)
2923 return NULL;
2924 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002925 if (fob == NULL)
2926 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002927 return m;
2928}
2929
Guido van Rossum79f25d91997-04-29 20:08:16 +00002930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002932{
2933 char *name;
2934 PyObject *fob;
2935 char *pathname;
2936 char *suffix; /* Unused */
2937 char *mode;
2938 int type;
2939 FILE *fp;
2940
Guido van Rossum43713e52000-02-29 13:59:29 +00002941 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002942 &name, &fob, &pathname,
2943 &suffix, &mode, &type))
2944 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002945 if (*mode) {
2946 /* Mode must start with 'r' or 'U' and must not contain '+'.
2947 Implicit in this test is the assumption that the mode
2948 may contain other modifiers like 'b' or 't'. */
2949
2950 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002951 PyErr_Format(PyExc_ValueError,
2952 "invalid file open mode %.200s", mode);
2953 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002954 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002955 }
2956 if (fob == Py_None)
2957 fp = NULL;
2958 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002959 fp = get_file(NULL, fob, mode);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002960 if (fp == NULL)
2961 return NULL;
2962 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002963 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002964}
2965
2966static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002968{
2969 char *name;
2970 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002971 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002972 return NULL;
2973 return load_package(name, pathname);
2974}
2975
2976static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002978{
2979 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002980 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002981 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002982 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002983}
2984
Christian Heimes13a7a212008-01-07 17:13:09 +00002985static PyObject *
2986imp_reload(PyObject *self, PyObject *v)
2987{
2988 return PyImport_ReloadModule(v);
2989}
2990
2991PyDoc_STRVAR(doc_reload,
2992"reload(module) -> module\n\
2993\n\
2994Reload the module. The module must have been successfully imported before.");
2995
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002996/* Doc strings */
2997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002998PyDoc_STRVAR(doc_imp,
2999"This module provides the components needed to build your own\n\
3000__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003002PyDoc_STRVAR(doc_find_module,
3003"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003004Search for a module. If path is omitted or None, search for a\n\
3005built-in, frozen or special module and continue search in sys.path.\n\
3006The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003007package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003008
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003009PyDoc_STRVAR(doc_load_module,
3010"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003011Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003012The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003014PyDoc_STRVAR(doc_get_magic,
3015"get_magic() -> string\n\
3016Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003017
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018PyDoc_STRVAR(doc_get_suffixes,
3019"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003020Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003021that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003023PyDoc_STRVAR(doc_new_module,
3024"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003025Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003026The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003028PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003029"lock_held() -> boolean\n\
3030Return True if the import lock is currently held, else False.\n\
3031On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003032
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003033PyDoc_STRVAR(doc_acquire_lock,
3034"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003035Acquires the interpreter's import lock for the current thread.\n\
3036This lock should be used by import hooks to ensure thread-safety\n\
3037when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003038On platforms without threads, this function does nothing.");
3039
3040PyDoc_STRVAR(doc_release_lock,
3041"release_lock() -> None\n\
3042Release the interpreter's import lock.\n\
3043On platforms without threads, this function does nothing.");
3044
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003046 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3047 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3048 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3049 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3050 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3051 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3052 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3053 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Christian Heimes13a7a212008-01-07 17:13:09 +00003054 {"reload", imp_reload, METH_O, doc_reload},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003055 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003056 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3057 {"init_builtin", imp_init_builtin, METH_VARARGS},
3058 {"init_frozen", imp_init_frozen, METH_VARARGS},
3059 {"is_builtin", imp_is_builtin, METH_VARARGS},
3060 {"is_frozen", imp_is_frozen, METH_VARARGS},
3061 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003062#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003063 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003064#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003065 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003066 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003067 {NULL, NULL} /* sentinel */
3068};
3069
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003070static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003071setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003072{
3073 PyObject *v;
3074 int err;
3075
Christian Heimes217cfd12007-12-02 14:31:20 +00003076 v = PyLong_FromLong((long)value);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003077 err = PyDict_SetItemString(d, name, v);
3078 Py_XDECREF(v);
3079 return err;
3080}
3081
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003082typedef struct {
3083 PyObject_HEAD
3084} NullImporter;
3085
3086static int
3087NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3088{
3089 char *path;
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003090 Py_ssize_t pathlen;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003091
3092 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3093 return -1;
3094
3095 if (!PyArg_ParseTuple(args, "s:NullImporter",
3096 &path))
3097 return -1;
3098
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003099 pathlen = strlen(path);
3100 if (pathlen == 0) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003101 PyErr_SetString(PyExc_ImportError, "empty pathname");
3102 return -1;
3103 } else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003104 struct stat statbuf;
3105 int rv;
3106
3107 rv = stat(path, &statbuf);
Guido van Rossumc1bdbc32007-11-07 17:46:34 +00003108#ifdef MS_WINDOWS
3109 /* MS Windows stat() chokes on paths like C:\path\. Try to
3110 * recover *one* time by stripping off a trailing slash or
3111 * backslash. http://bugs.python.org/issue1293
3112 */
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003113 if (rv != 0 && pathlen <= MAXPATHLEN &&
3114 (path[pathlen-1] == '/' || path[pathlen-1] == '\\')) {
3115 char mangled[MAXPATHLEN+1];
3116
3117 strcpy(mangled, path);
3118 mangled[pathlen-1] = '\0';
3119 rv = stat(mangled, &statbuf);
3120 }
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003121#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003122 if (rv == 0) {
3123 /* it exists */
3124 if (S_ISDIR(statbuf.st_mode)) {
3125 /* it's a directory */
3126 PyErr_SetString(PyExc_ImportError,
3127 "existing directory");
3128 return -1;
3129 }
3130 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003131 }
3132 return 0;
3133}
3134
3135static PyObject *
3136NullImporter_find_module(NullImporter *self, PyObject *args)
3137{
3138 Py_RETURN_NONE;
3139}
3140
3141static PyMethodDef NullImporter_methods[] = {
3142 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3143 "Always return None"
3144 },
3145 {NULL} /* Sentinel */
3146};
3147
3148
Christian Heimes9cd17752007-11-18 19:35:23 +00003149PyTypeObject PyNullImporter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003150 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003151 "imp.NullImporter", /*tp_name*/
3152 sizeof(NullImporter), /*tp_basicsize*/
3153 0, /*tp_itemsize*/
3154 0, /*tp_dealloc*/
3155 0, /*tp_print*/
3156 0, /*tp_getattr*/
3157 0, /*tp_setattr*/
3158 0, /*tp_compare*/
3159 0, /*tp_repr*/
3160 0, /*tp_as_number*/
3161 0, /*tp_as_sequence*/
3162 0, /*tp_as_mapping*/
3163 0, /*tp_hash */
3164 0, /*tp_call*/
3165 0, /*tp_str*/
3166 0, /*tp_getattro*/
3167 0, /*tp_setattro*/
3168 0, /*tp_as_buffer*/
3169 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3170 "Null importer object", /* tp_doc */
3171 0, /* tp_traverse */
3172 0, /* tp_clear */
3173 0, /* tp_richcompare */
3174 0, /* tp_weaklistoffset */
3175 0, /* tp_iter */
3176 0, /* tp_iternext */
3177 NullImporter_methods, /* tp_methods */
3178 0, /* tp_members */
3179 0, /* tp_getset */
3180 0, /* tp_base */
3181 0, /* tp_dict */
3182 0, /* tp_descr_get */
3183 0, /* tp_descr_set */
3184 0, /* tp_dictoffset */
3185 (initproc)NullImporter_init, /* tp_init */
3186 0, /* tp_alloc */
3187 PyType_GenericNew /* tp_new */
3188};
3189
3190
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003191PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003193{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003194 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003195
Christian Heimes9cd17752007-11-18 19:35:23 +00003196 if (PyType_Ready(&PyNullImporter_Type) < 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003197 goto failure;
3198
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003199 m = Py_InitModule4("imp", imp_methods, doc_imp,
3200 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003201 if (m == NULL)
3202 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003203 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003204 if (d == NULL)
3205 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003206
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003207 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3208 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3209 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3210 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3211 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3212 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3213 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3214 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003215 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003216 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003217
Christian Heimes9cd17752007-11-18 19:35:23 +00003218 Py_INCREF(&PyNullImporter_Type);
3219 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003220 failure:
3221 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003222}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003223
3224
Guido van Rossumb18618d2000-05-03 23:44:39 +00003225/* API for embedding applications that want to add their own entries
3226 to the table of built-in modules. This should normally be called
3227 *before* Py_Initialize(). When the table resize fails, -1 is
3228 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003229
3230 After a similar function by Just van Rossum. */
3231
3232int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003233PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003234{
3235 static struct _inittab *our_copy = NULL;
3236 struct _inittab *p;
3237 int i, n;
3238
3239 /* Count the number of entries in both tables */
3240 for (n = 0; newtab[n].name != NULL; n++)
3241 ;
3242 if (n == 0)
3243 return 0; /* Nothing to do */
3244 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3245 ;
3246
3247 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003248 p = our_copy;
3249 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003250 if (p == NULL)
3251 return -1;
3252
3253 /* Copy the tables into the new memory */
3254 if (our_copy != PyImport_Inittab)
3255 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3256 PyImport_Inittab = our_copy = p;
3257 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3258
3259 return 0;
3260}
3261
3262/* Shorthand to add a single entry given a name and a function */
3263
3264int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003265PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003266{
3267 struct _inittab newtab[2];
3268
3269 memset(newtab, '\0', sizeof newtab);
3270
3271 newtab[0].name = name;
3272 newtab[0].initfunc = initfunc;
3273
3274 return PyImport_ExtendInittab(newtab);
3275}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003276
3277#ifdef __cplusplus
3278}
3279#endif