blob: 77fe168f4f442278ec50bb07e5087f9877b3b130 [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 *
836open_exclusive(char *filename)
837{
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
Martin v. Löwis18e16552006-02-15 17:27:45 +0000852 , 0666, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000853#else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000854 , 0666
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
Martin v. Löwis18e16552006-02-15 17:27:45 +0000873write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874{
875 FILE *fp;
876
Guido van Rossum55a83382000-09-20 20:31:38 +0000877 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000880 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 "# can't create %s\n", cpathname);
882 return;
883 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000884 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000885 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000886 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
887 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000888 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000890 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 /* Don't keep partial file */
892 fclose(fp);
893 (void) unlink(cpathname);
894 return;
895 }
896 /* Now write the true mtime */
897 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000898 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000899 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 fflush(fp);
901 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000903 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904}
905
906
907/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000908 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
909 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000912load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913{
Fred Drake4c82b232000-06-30 16:18:57 +0000914 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 FILE *fpc;
916 char buf[MAXPATHLEN+1];
917 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 PyCodeObject *co;
919 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000921 mtime = PyOS_GetLastModificationTime(pathname, fp);
Neal Norwitz708e51a2005-10-03 04:48:15 +0000922 if (mtime == (time_t)(-1)) {
923 PyErr_Format(PyExc_RuntimeError,
924 "unable to get modification time from '%s'",
925 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000926 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000927 }
Fred Drake4c82b232000-06-30 16:18:57 +0000928#if SIZEOF_TIME_T > 4
929 /* Python's .pyc timestamp handling presumes that the timestamp fits
930 in 4 bytes. This will be fine until sometime in the year 2038,
931 when a 4-byte signed time_t will overflow.
932 */
933 if (mtime >> 32) {
934 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000935 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000936 return NULL;
937 }
938#endif
Tim Peters36515e22001-11-18 04:06:29 +0000939 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000940 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 if (cpathname != NULL &&
942 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000943 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944 fclose(fpc);
945 if (co == NULL)
946 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000948 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000950 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000951 }
952 else {
953 co = parse_source_module(pathname, fp);
954 if (co == NULL)
955 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000957 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958 name, pathname);
Christian Heimes790c8232008-01-07 21:14:23 +0000959 if (cpathname) {
960 PyObject *ro = PySys_GetObject("dont_write_bytecode");
961 if (ro == NULL || !PyObject_IsTrue(ro))
962 write_compiled_module(co, cpathname, mtime);
963 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000965 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967
968 return m;
969}
970
Christian Heimes3b06e532008-01-07 20:12:44 +0000971/* Get source file -> unicode or None
972 * Returns the path to the py file if available, else the given path
973 */
974static PyObject *
975get_sourcefile(const char *file)
976{
977 char py[MAXPATHLEN + 1];
978 Py_ssize_t len;
979 PyObject *u;
980 struct stat statbuf;
981
982 if (!file || !*file) {
983 Py_RETURN_NONE;
984 }
985
986 len = strlen(file);
Christian Heimes3540b502008-01-11 07:03:05 +0000987 /* match '*.py?' */
988 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000989 return PyUnicode_DecodeFSDefault(file);
990 }
991
992 strncpy(py, file, len-1);
993 py[len] = '\0';
994 if (stat(py, &statbuf) == 0 &&
995 S_ISREG(statbuf.st_mode)) {
996 u = PyUnicode_DecodeFSDefault(py);
997 }
998 else {
999 u = PyUnicode_DecodeFSDefault(file);
1000 }
1001 return u;
1002}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001004/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001005static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1006static struct filedescr *find_module(char *, char *, PyObject *,
1007 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001008static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001009
1010/* Load a package and return its module object WITH INCREMENTED
1011 REFERENCE COUNT */
1012
1013static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001014load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001015{
Tim Peters1cd70172004-08-02 03:52:12 +00001016 PyObject *m, *d;
1017 PyObject *file = NULL;
1018 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001019 int err;
1020 char buf[MAXPATHLEN+1];
1021 FILE *fp = NULL;
1022 struct filedescr *fdp;
1023
1024 m = PyImport_AddModule(name);
1025 if (m == NULL)
1026 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001027 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001028 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001029 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001030 d = PyModule_GetDict(m);
Christian Heimes3b06e532008-01-07 20:12:44 +00001031 file = get_sourcefile(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001032 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001033 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001034 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001035 if (path == NULL)
1036 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001037 err = PyDict_SetItemString(d, "__file__", file);
1038 if (err == 0)
1039 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001040 if (err != 0)
1041 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001042 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001043 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001044 if (fdp == NULL) {
1045 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1046 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001047 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001048 }
1049 else
1050 m = NULL;
1051 goto cleanup;
1052 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001053 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001054 if (fp != NULL)
1055 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001056 goto cleanup;
1057
1058 error:
1059 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001060 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001061 Py_XDECREF(path);
1062 Py_XDECREF(file);
1063 return m;
1064}
1065
1066
1067/* Helper to test for built-in module */
1068
1069static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001071{
1072 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001073 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1074 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1075 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001076 return -1;
1077 else
1078 return 1;
1079 }
1080 }
1081 return 0;
1082}
1083
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001084
Just van Rossum52e14d62002-12-30 22:08:05 +00001085/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1086 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001088 that can handle the path item. Return None if no hook could;
1089 this tells our caller it should fall back to the builtin
1090 import mechanism. Cache the result in path_importer_cache.
1091 Returns a borrowed reference. */
1092
1093static PyObject *
1094get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1095 PyObject *p)
1096{
1097 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001098 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001099
1100 /* These conditions are the caller's responsibility: */
1101 assert(PyList_Check(path_hooks));
1102 assert(PyDict_Check(path_importer_cache));
1103
1104 nhooks = PyList_Size(path_hooks);
1105 if (nhooks < 0)
1106 return NULL; /* Shouldn't happen */
1107
1108 importer = PyDict_GetItem(path_importer_cache, p);
1109 if (importer != NULL)
1110 return importer;
1111
1112 /* set path_importer_cache[p] to None to avoid recursion */
1113 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1114 return NULL;
1115
1116 for (j = 0; j < nhooks; j++) {
1117 PyObject *hook = PyList_GetItem(path_hooks, j);
1118 if (hook == NULL)
1119 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001121 if (importer != NULL)
1122 break;
1123
1124 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1125 return NULL;
1126 }
1127 PyErr_Clear();
1128 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001129 if (importer == NULL) {
1130 importer = PyObject_CallFunctionObjArgs(
Christian Heimes9cd17752007-11-18 19:35:23 +00001131 (PyObject *)&PyNullImporter_Type, p, NULL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001132 );
1133 if (importer == NULL) {
1134 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1135 PyErr_Clear();
1136 return Py_None;
1137 }
1138 }
1139 }
1140 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001141 int err = PyDict_SetItem(path_importer_cache, p, importer);
1142 Py_DECREF(importer);
1143 if (err != 0)
1144 return NULL;
1145 }
1146 return importer;
1147}
1148
Christian Heimes9cd17752007-11-18 19:35:23 +00001149PyAPI_FUNC(PyObject *)
1150PyImport_GetImporter(PyObject *path) {
1151 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1152
1153 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1154 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1155 importer = get_path_importer(path_importer_cache,
1156 path_hooks, path);
1157 }
1158 }
1159 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1160 return importer;
1161}
1162
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163/* Search the path (default sys.path) for a module. Return the
1164 corresponding filedescr struct, and (via return arguments) the
1165 pathname and an open file. Return NULL if the module is not found. */
1166
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001167#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001168extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001169 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001170#endif
1171
Martin v. Löwis18e16552006-02-15 17:27:45 +00001172static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001173static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001174static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001175
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001177find_module(char *fullname, char *subname, PyObject *path, char *buf,
1178 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001180 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001181 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001182 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001183 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001184 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001185 PyObject *path_hooks, *path_importer_cache;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001186 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001187 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1188 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1189 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001190 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001191#if defined(PYOS_OS2)
1192 size_t saved_len;
1193 size_t saved_namelen;
1194 char *saved_buf = NULL;
1195#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001196 if (p_loader != NULL)
1197 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001198
Just van Rossum52e14d62002-12-30 22:08:05 +00001199 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001200 PyErr_SetString(PyExc_OverflowError,
1201 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001202 return NULL;
1203 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001204 strcpy(name, subname);
1205
1206 /* sys.meta_path import hook */
1207 if (p_loader != NULL) {
1208 PyObject *meta_path;
1209
1210 meta_path = PySys_GetObject("meta_path");
1211 if (meta_path == NULL || !PyList_Check(meta_path)) {
1212 PyErr_SetString(PyExc_ImportError,
1213 "sys.meta_path must be a list of "
1214 "import hooks");
1215 return NULL;
1216 }
1217 Py_INCREF(meta_path); /* zap guard */
1218 npath = PyList_Size(meta_path);
1219 for (i = 0; i < npath; i++) {
1220 PyObject *loader;
1221 PyObject *hook = PyList_GetItem(meta_path, i);
1222 loader = PyObject_CallMethod(hook, "find_module",
1223 "sO", fullname,
1224 path != NULL ?
1225 path : Py_None);
1226 if (loader == NULL) {
1227 Py_DECREF(meta_path);
1228 return NULL; /* true error */
1229 }
1230 if (loader != Py_None) {
1231 /* a loader was found */
1232 *p_loader = loader;
1233 Py_DECREF(meta_path);
1234 return &importhookdescr;
1235 }
1236 Py_DECREF(loader);
1237 }
1238 Py_DECREF(meta_path);
1239 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001240
Guido van Rossum13d77992007-07-23 03:16:50 +00001241 if (path != NULL && PyUnicode_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001242 /* The only type of submodule allowed inside a "frozen"
1243 package are other frozen modules or packages. */
Guido van Rossum13d77992007-07-23 03:16:50 +00001244 char *p = PyUnicode_AsString(path);
1245 if (strlen(p) + 1 + strlen(name) >= (size_t)buflen) {
Guido van Rossum0506a431998-08-11 15:07:39 +00001246 PyErr_SetString(PyExc_ImportError,
1247 "full frozen module name too long");
1248 return NULL;
1249 }
Guido van Rossum13d77992007-07-23 03:16:50 +00001250 strcpy(buf, p);
Guido van Rossum0506a431998-08-11 15:07:39 +00001251 strcat(buf, ".");
1252 strcat(buf, name);
1253 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001254 if (find_frozen(name) != NULL) {
1255 strcpy(buf, name);
1256 return &fd_frozen;
1257 }
1258 PyErr_Format(PyExc_ImportError,
1259 "No frozen submodule named %.200s", name);
1260 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001261 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001262 if (path == NULL) {
1263 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001264 strcpy(buf, name);
1265 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001266 }
Greg Ward201baee2001-10-04 14:52:06 +00001267 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001268 strcpy(buf, name);
1269 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001270 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271
Guido van Rossumac279101996-08-22 23:10:58 +00001272#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001273 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1274 if (fp != NULL) {
1275 *p_fp = fp;
1276 return fdp;
1277 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001278#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001279 path = PySys_GetObject("path");
1280 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 if (path == NULL || !PyList_Check(path)) {
1282 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001283 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284 return NULL;
1285 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001286
1287 path_hooks = PySys_GetObject("path_hooks");
1288 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1289 PyErr_SetString(PyExc_ImportError,
1290 "sys.path_hooks must be a list of "
1291 "import hooks");
1292 return NULL;
1293 }
1294 path_importer_cache = PySys_GetObject("path_importer_cache");
1295 if (path_importer_cache == NULL ||
1296 !PyDict_Check(path_importer_cache)) {
1297 PyErr_SetString(PyExc_ImportError,
1298 "sys.path_importer_cache must be a dict");
1299 return NULL;
1300 }
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303 namelen = strlen(name);
1304 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 PyObject *v = PyList_GetItem(path, i);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001306 PyObject *origv = v;
Guido van Rossum6262cc72007-05-09 23:29:27 +00001307 const char *base;
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001308 Py_ssize_t size;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001309 if (!v)
1310 return NULL;
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001311 if (PyUnicode_Check(v)) {
1312 v = _PyUnicode_AsDefaultEncodedString(v, NULL);
1313 if (v == NULL)
1314 return NULL;
1315 }
1316 if (!PyString_Check(v))
1317 continue;
1318 base = PyString_AS_STRING(v);
1319 size = PyString_GET_SIZE(v);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001320 len = size;
Walter Dörwald3430d702002-06-17 10:43:59 +00001321 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001323 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001324 strcpy(buf, base);
Walter Dörwald3430d702002-06-17 10:43:59 +00001325 if (strlen(buf) != len) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001327 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001328
1329 /* sys.path_hooks import hook */
1330 if (p_loader != NULL) {
1331 PyObject *importer;
1332
1333 importer = get_path_importer(path_importer_cache,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001334 path_hooks, origv);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001335 if (importer == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001336 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001337 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001338 /* Note: importer is a borrowed reference */
1339 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001340 PyObject *loader;
1341 loader = PyObject_CallMethod(importer,
1342 "find_module",
1343 "s", fullname);
1344 if (loader == NULL)
1345 return NULL; /* error */
1346 if (loader != Py_None) {
1347 /* a loader was found */
1348 *p_loader = loader;
1349 return &importhookdescr;
1350 }
1351 Py_DECREF(loader);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001352 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001353 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001354 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001355 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001356
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001357 if (len > 0 && buf[len-1] != SEP
1358#ifdef ALTSEP
1359 && buf[len-1] != ALTSEP
1360#endif
1361 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001363 strcpy(buf+len, name);
1364 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001365
1366 /* Check for package import (buf holds a directory name,
1367 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001368#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001369 if (stat(buf, &statbuf) == 0 && /* it exists */
1370 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001371 case_ok(buf, len, namelen, name)) { /* case matches */
1372 if (find_init_module(buf)) { /* and has __init__.py */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001373 return &fd_package;
1374 }
1375 else {
1376 char warnstr[MAXPATHLEN+80];
1377 sprintf(warnstr, "Not importing directory "
1378 "'%.*s': missing __init__.py",
1379 MAXPATHLEN, buf);
Skip Montanaro46fc3372007-08-12 11:44:53 +00001380 if (PyErr_WarnEx(PyExc_ImportWarning,
1381 warnstr, 1)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382 return NULL;
1383 }
1384 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001385 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001386#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001387#if defined(PYOS_OS2)
1388 /* take a snapshot of the module spec for restoration
1389 * after the 8 character DLL hackery
1390 */
1391 saved_buf = strdup(buf);
1392 saved_len = len;
1393 saved_namelen = namelen;
1394#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001396#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001397 /* OS/2 limits DLLs to 8 character names (w/o
1398 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001399 * so if the name is longer than that and its a
1400 * dynamically loaded module we're going to try,
1401 * truncate the name before trying
1402 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001403 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001404 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001405 const struct filedescr *scan;
1406 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001407 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001408 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001409 break;
1410 else
1411 scan++;
1412 }
1413 if (scan->suffix != NULL) {
1414 /* yes, so truncate the name */
1415 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001416 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001417 buf[len] = '\0';
1418 }
1419 }
1420#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001423 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001424 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001425 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001426 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001427 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001428 if (fp != NULL) {
1429 if (case_ok(buf, len, namelen, name))
1430 break;
1431 else { /* continue search */
1432 fclose(fp);
1433 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001434 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001435 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001436#if defined(PYOS_OS2)
1437 /* restore the saved snapshot */
1438 strcpy(buf, saved_buf);
1439 len = saved_len;
1440 namelen = saved_namelen;
1441#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001443#if defined(PYOS_OS2)
1444 /* don't need/want the module name snapshot anymore */
1445 if (saved_buf)
1446 {
1447 free(saved_buf);
1448 saved_buf = NULL;
1449 }
1450#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451 if (fp != NULL)
1452 break;
1453 }
1454 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001455 PyErr_Format(PyExc_ImportError,
1456 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001457 return NULL;
1458 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459 *p_fp = fp;
1460 return fdp;
1461}
1462
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001463/* Helpers for main.c
1464 * Find the source file corresponding to a named module
1465 */
1466struct filedescr *
1467_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1468 size_t buflen, FILE **p_fp, PyObject **p_loader)
1469{
1470 return find_module((char *) name, (char *) name, path,
1471 buf, buflen, p_fp, p_loader);
1472}
1473
1474PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1475{
1476 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1477}
1478
Martin v. Löwis18e16552006-02-15 17:27:45 +00001479/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001480 * The arguments here are tricky, best shown by example:
1481 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1482 * ^ ^ ^ ^
1483 * |--------------------- buf ---------------------|
1484 * |------------------- len ------------------|
1485 * |------ name -------|
1486 * |----- namelen -----|
1487 * buf is the full path, but len only counts up to (& exclusive of) the
1488 * extension. name is the module name, also exclusive of extension.
1489 *
1490 * We've already done a successful stat() or fopen() on buf, so know that
1491 * there's some match, possibly case-insensitive.
1492 *
Tim Peters50d8d372001-02-28 05:34:27 +00001493 * case_ok() is to return 1 if there's a case-sensitive match for
1494 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1495 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001496 *
Tim Peters50d8d372001-02-28 05:34:27 +00001497 * case_ok() is used to implement case-sensitive import semantics even
1498 * on platforms with case-insensitive filesystems. It's trivial to implement
1499 * for case-sensitive filesystems. It's pretty much a cross-platform
1500 * nightmare for systems with case-insensitive filesystems.
1501 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001502
Tim Peters50d8d372001-02-28 05:34:27 +00001503/* First we may need a pile of platform-specific header files; the sequence
1504 * of #if's here should match the sequence in the body of case_ok().
1505 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001506#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001507#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001508
Tim Peters50d8d372001-02-28 05:34:27 +00001509#elif defined(DJGPP)
1510#include <dir.h>
1511
Jason Tishler7961aa62005-05-20 00:56:54 +00001512#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001513#include <sys/types.h>
1514#include <dirent.h>
1515
Andrew MacIntyred9400542002-02-26 11:41:34 +00001516#elif defined(PYOS_OS2)
1517#define INCL_DOS
1518#define INCL_DOSERRORS
1519#define INCL_NOPMAPI
1520#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001521#endif
1522
Guido van Rossum0980bd91998-02-13 17:18:36 +00001523static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001524case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001525{
Tim Peters50d8d372001-02-28 05:34:27 +00001526/* Pick a platform-specific implementation; the sequence of #if's here should
1527 * match the sequence just above.
1528 */
1529
Jason Tishler7961aa62005-05-20 00:56:54 +00001530/* MS_WINDOWS */
1531#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001532 WIN32_FIND_DATA data;
1533 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001534
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001535 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001536 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001537
Guido van Rossum0980bd91998-02-13 17:18:36 +00001538 h = FindFirstFile(buf, &data);
1539 if (h == INVALID_HANDLE_VALUE) {
1540 PyErr_Format(PyExc_NameError,
1541 "Can't find file for module %.100s\n(filename %.300s)",
1542 name, buf);
1543 return 0;
1544 }
1545 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001546 return strncmp(data.cFileName, name, namelen) == 0;
1547
1548/* DJGPP */
1549#elif defined(DJGPP)
1550 struct ffblk ffblk;
1551 int done;
1552
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001553 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001554 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001555
1556 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1557 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001558 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001559 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001560 name, buf);
1561 return 0;
1562 }
Tim Peters50d8d372001-02-28 05:34:27 +00001563 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001564
Jason Tishler7961aa62005-05-20 00:56:54 +00001565/* new-fangled macintosh (macosx) or Cygwin */
1566#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001567 DIR *dirp;
1568 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001569 char dirname[MAXPATHLEN + 1];
1570 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001571
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001572 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001573 return 1;
1574
Tim Petersd1e87a82001-03-01 18:12:00 +00001575 /* Copy the dir component into dirname; substitute "." if empty */
1576 if (dirlen <= 0) {
1577 dirname[0] = '.';
1578 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001579 }
1580 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001581 assert(dirlen <= MAXPATHLEN);
1582 memcpy(dirname, buf, dirlen);
1583 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001584 }
1585 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001586 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001587 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001588 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001589 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001590 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001591#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001592 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001593#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001594 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001595#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001596 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001597 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001598 (void)closedir(dirp);
1599 return 1; /* Found */
1600 }
1601 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001602 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001603 }
Tim Peters430f5d42001-03-01 01:30:56 +00001604 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001605
Andrew MacIntyred9400542002-02-26 11:41:34 +00001606/* OS/2 */
1607#elif defined(PYOS_OS2)
1608 HDIR hdir = 1;
1609 ULONG srchcnt = 1;
1610 FILEFINDBUF3 ffbuf;
1611 APIRET rc;
1612
Christian Heimes790c8232008-01-07 21:14:23 +00001613 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001614 return 1;
1615
1616 rc = DosFindFirst(buf,
1617 &hdir,
1618 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1619 &ffbuf, sizeof(ffbuf),
1620 &srchcnt,
1621 FIL_STANDARD);
1622 if (rc != NO_ERROR)
1623 return 0;
1624 return strncmp(ffbuf.achName, name, namelen) == 0;
1625
Tim Peters50d8d372001-02-28 05:34:27 +00001626/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1627#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001628 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001629
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001630#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001631}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001632
Guido van Rossum0980bd91998-02-13 17:18:36 +00001633
Guido van Rossum197346f1997-10-31 18:38:52 +00001634#ifdef HAVE_STAT
1635/* Helper to look for __init__.py or __init__.py[co] in potential package */
1636static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001637find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001638{
Tim Peters0f9431f2001-07-05 03:47:53 +00001639 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001640 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001641 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001642 struct stat statbuf;
1643
Tim Peters0f9431f2001-07-05 03:47:53 +00001644/* For calling case_ok(buf, len, namelen, name):
1645 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1646 * ^ ^ ^ ^
1647 * |--------------------- buf ---------------------|
1648 * |------------------- len ------------------|
1649 * |------ name -------|
1650 * |----- namelen -----|
1651 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001652 if (save_len + 13 >= MAXPATHLEN)
1653 return 0;
1654 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001655 pname = buf + i;
1656 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001657 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001658 if (case_ok(buf,
1659 save_len + 9, /* len("/__init__") */
1660 8, /* len("__init__") */
1661 pname)) {
1662 buf[save_len] = '\0';
1663 return 1;
1664 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001665 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001666 i += strlen(pname);
1667 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001668 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001669 if (case_ok(buf,
1670 save_len + 9, /* len("/__init__") */
1671 8, /* len("__init__") */
1672 pname)) {
1673 buf[save_len] = '\0';
1674 return 1;
1675 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001676 }
1677 buf[save_len] = '\0';
1678 return 0;
1679}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001680
Guido van Rossum197346f1997-10-31 18:38:52 +00001681#endif /* HAVE_STAT */
1682
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001683
Tim Petersdbd9ba62000-07-09 03:09:57 +00001684static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001685
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001686/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001687 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001688
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001690load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001691{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001692 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001694 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001696 /* First check that there's an open file (if we need one) */
1697 switch (type) {
1698 case PY_SOURCE:
1699 case PY_COMPILED:
1700 if (fp == NULL) {
1701 PyErr_Format(PyExc_ValueError,
1702 "file object required for import (type code %d)",
1703 type);
1704 return NULL;
1705 }
1706 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001707
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001708 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001709
1710 case PY_SOURCE:
1711 m = load_source_module(name, buf, fp);
1712 break;
1713
1714 case PY_COMPILED:
1715 m = load_compiled_module(name, buf, fp);
1716 break;
1717
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001718#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001719 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001722#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001723
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 case PKG_DIRECTORY:
1725 m = load_package(name, buf);
1726 break;
1727
1728 case C_BUILTIN:
1729 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001730 if (buf != NULL && buf[0] != '\0')
1731 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001732 if (type == C_BUILTIN)
1733 err = init_builtin(name);
1734 else
1735 err = PyImport_ImportFrozenModule(name);
1736 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001737 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001738 if (err == 0) {
1739 PyErr_Format(PyExc_ImportError,
1740 "Purported %s module %.200s not found",
1741 type == C_BUILTIN ?
1742 "builtin" : "frozen",
1743 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001744 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001745 }
1746 modules = PyImport_GetModuleDict();
1747 m = PyDict_GetItemString(modules, name);
1748 if (m == NULL) {
1749 PyErr_Format(
1750 PyExc_ImportError,
1751 "%s module %.200s not properly initialized",
1752 type == C_BUILTIN ?
1753 "builtin" : "frozen",
1754 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001755 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001756 }
1757 Py_INCREF(m);
1758 break;
1759
Just van Rossum52e14d62002-12-30 22:08:05 +00001760 case IMP_HOOK: {
1761 if (loader == NULL) {
1762 PyErr_SetString(PyExc_ImportError,
1763 "import hook without loader");
1764 return NULL;
1765 }
1766 m = PyObject_CallMethod(loader, "load_module", "s", name);
1767 break;
1768 }
1769
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001770 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001771 PyErr_Format(PyExc_ImportError,
1772 "Don't know how to import %.200s (type code %d)",
1773 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001774 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775
1776 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001777
1778 return m;
1779}
1780
1781
1782/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001783 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001784 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001785
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001786static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001788{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001789 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001790
Greg Ward201baee2001-10-04 14:52:06 +00001791 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001792 return 1;
1793
Guido van Rossum771c6c81997-10-31 18:37:24 +00001794 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001795 if (strcmp(name, p->name) == 0) {
1796 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001797 PyErr_Format(PyExc_ImportError,
1798 "Cannot re-init internal module %.200s",
1799 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001800 return -1;
1801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001803 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001804 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001807 if (_PyImport_FixupExtension(name, name) == NULL)
1808 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001809 return 1;
1810 }
1811 }
1812 return 0;
1813}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001814
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001816/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001817
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001818static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001819find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001820{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001821 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001822
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001824 if (p->name == NULL)
1825 return NULL;
1826 if (strcmp(p->name, name) == 0)
1827 break;
1828 }
1829 return p;
1830}
1831
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001834{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001835 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001836 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001837
1838 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001839 PyErr_Format(PyExc_ImportError,
1840 "No such frozen object named %.200s",
1841 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001842 return NULL;
1843 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001844 if (p->code == NULL) {
1845 PyErr_Format(PyExc_ImportError,
1846 "Excluded frozen object named %.200s",
1847 name);
1848 return NULL;
1849 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001850 size = p->size;
1851 if (size < 0)
1852 size = -size;
1853 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001854}
1855
1856/* Initialize a frozen module.
1857 Return 1 for succes, 0 if the module is not found, and -1 with
1858 an exception set if the initialization failed.
1859 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001860
1861int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001862PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001863{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001864 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 PyObject *co;
1866 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001867 int ispackage;
1868 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001869
1870 if (p == NULL)
1871 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001872 if (p->code == NULL) {
1873 PyErr_Format(PyExc_ImportError,
1874 "Excluded frozen object named %.200s",
1875 name);
1876 return -1;
1877 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001878 size = p->size;
1879 ispackage = (size < 0);
1880 if (ispackage)
1881 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001883 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001884 name, ispackage ? " package" : "");
1885 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001886 if (co == NULL)
1887 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001888 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001889 PyErr_Format(PyExc_TypeError,
1890 "frozen object %.200s is not a code object",
1891 name);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001892 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001893 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001894 if (ispackage) {
1895 /* Set __path__ to the package name */
1896 PyObject *d, *s;
1897 int err;
1898 m = PyImport_AddModule(name);
1899 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001900 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001901 d = PyModule_GetDict(m);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001902 s = PyUnicode_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001903 if (s == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001904 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001905 err = PyDict_SetItemString(d, "__path__", s);
1906 Py_DECREF(s);
1907 if (err != 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001908 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001909 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001910 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001911 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001912 goto err_return;
1913 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001915 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001916err_return:
1917 Py_DECREF(co);
1918 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001919}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001920
1921
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001923 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001924
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001926PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001927{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001928 PyObject *pname;
1929 PyObject *result;
1930
Martin v. Löwis5b222132007-06-10 09:51:05 +00001931 pname = PyUnicode_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00001932 if (pname == NULL)
1933 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001934 result = PyImport_Import(pname);
1935 Py_DECREF(pname);
1936 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001937}
1938
Christian Heimes072c0f12008-01-03 23:01:04 +00001939/* Import a module without blocking
1940 *
1941 * At first it tries to fetch the module from sys.modules. If the module was
1942 * never loaded before it loads it with PyImport_ImportModule() unless another
1943 * thread holds the import lock. In the latter case the function raises an
1944 * ImportError instead of blocking.
1945 *
1946 * Returns the module object with incremented ref count.
1947 */
1948PyObject *
1949PyImport_ImportModuleNoBlock(const char *name)
1950{
1951 PyObject *result;
1952 PyObject *modules;
1953 long me;
1954
1955 /* Try to get the module from sys.modules[name] */
1956 modules = PyImport_GetModuleDict();
1957 if (modules == NULL)
1958 return NULL;
1959
1960 result = PyDict_GetItemString(modules, name);
1961 if (result != NULL) {
1962 Py_INCREF(result);
1963 return result;
1964 }
1965 else {
1966 PyErr_Clear();
1967 }
1968
1969 /* check the import lock
1970 * me might be -1 but I ignore the error here, the lock function
1971 * takes care of the problem */
1972 me = PyThread_get_thread_ident();
1973 if (import_lock_thread == -1 || import_lock_thread == me) {
1974 /* no thread or me is holding the lock */
1975 return PyImport_ImportModule(name);
1976 }
1977 else {
1978 PyErr_Format(PyExc_ImportError,
1979 "Failed to import %.200s because the import lock"
1980 "is held by another thread.",
1981 name);
1982 return NULL;
1983 }
1984}
1985
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001986/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001987static PyObject *get_parent(PyObject *globals, char *buf,
1988 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001989static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001990 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001991static int mark_miss(char *name);
1992static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001993 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001994static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001995
1996/* The Magnum Opus of dotted-name import :-) */
1997
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001998static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001999import_module_level(char *name, PyObject *globals, PyObject *locals,
2000 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002001{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002002 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002003 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002004 PyObject *parent, *head, *next, *tail;
2005
Christian Heimes454f37b2008-01-10 00:10:02 +00002006 if (strchr(name, '/') != NULL
2007#ifdef MS_WINDOWS
2008 || strchr(name, '\\') != NULL
2009#endif
2010 ) {
2011 PyErr_SetString(PyExc_ImportError,
2012 "Import by filename is not supported.");
2013 return NULL;
2014 }
2015
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002016 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002017 if (parent == NULL)
2018 return NULL;
2019
2020 head = load_next(parent, Py_None, &name, buf, &buflen);
2021 if (head == NULL)
2022 return NULL;
2023
2024 tail = head;
2025 Py_INCREF(tail);
2026 while (name) {
2027 next = load_next(tail, tail, &name, buf, &buflen);
2028 Py_DECREF(tail);
2029 if (next == NULL) {
2030 Py_DECREF(head);
2031 return NULL;
2032 }
2033 tail = next;
2034 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002035 if (tail == Py_None) {
2036 /* If tail is Py_None, both get_parent and load_next found
2037 an empty module name: someone called __import__("") or
2038 doctored faulty bytecode */
2039 Py_DECREF(tail);
2040 Py_DECREF(head);
2041 PyErr_SetString(PyExc_ValueError,
2042 "Empty module name");
2043 return NULL;
2044 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002045
2046 if (fromlist != NULL) {
2047 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2048 fromlist = NULL;
2049 }
2050
2051 if (fromlist == NULL) {
2052 Py_DECREF(tail);
2053 return head;
2054 }
2055
2056 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002057 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002058 Py_DECREF(tail);
2059 return NULL;
2060 }
2061
2062 return tail;
2063}
2064
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002065PyObject *
2066PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2067 PyObject *fromlist, int level)
2068{
2069 PyObject *result;
2070 lock_import();
2071 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002072 if (unlock_import() < 0) {
2073 Py_XDECREF(result);
2074 PyErr_SetString(PyExc_RuntimeError,
2075 "not holding the import lock");
2076 return NULL;
2077 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002078 return result;
2079}
2080
Fred Drake87590902004-05-28 20:21:36 +00002081/* Return the package that an import is being performed in. If globals comes
2082 from the module foo.bar.bat (not itself a package), this returns the
2083 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002084 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002085
2086 The *name* of the returned package is returned in buf, with the length of
2087 the name in *p_buflen.
2088
2089 If globals doesn't come from a package or a module in a package, or a
2090 corresponding entry is not found in sys.modules, Py_None is returned.
2091*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002092static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002093get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002094{
2095 static PyObject *namestr = NULL;
2096 static PyObject *pathstr = NULL;
Nick Coghlande10c852007-12-04 12:22:52 +00002097 static PyObject *pkgstr = NULL;
2098 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002099
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002100 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002101 return Py_None;
2102
2103 if (namestr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002104 namestr = PyUnicode_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002105 if (namestr == NULL)
2106 return NULL;
2107 }
2108 if (pathstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002109 pathstr = PyUnicode_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002110 if (pathstr == NULL)
2111 return NULL;
2112 }
Nick Coghlande10c852007-12-04 12:22:52 +00002113 if (pkgstr == NULL) {
2114 pkgstr = PyUnicode_InternFromString("__package__");
2115 if (pkgstr == NULL)
2116 return NULL;
2117 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002118
2119 *buf = '\0';
2120 *p_buflen = 0;
Nick Coghlande10c852007-12-04 12:22:52 +00002121 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002122
Nick Coghlande10c852007-12-04 12:22:52 +00002123 if ((pkgname != NULL) && (pkgname != Py_None)) {
2124 /* __package__ is set, so use it */
2125 Py_ssize_t len;
2126 if (!PyUnicode_Check(pkgname)) {
2127 PyErr_SetString(PyExc_ValueError,
2128 "__package__ set to non-string");
2129 return NULL;
2130 }
2131 len = PyUnicode_GET_SIZE(pkgname);
2132 if (len == 0) {
2133 if (level > 0) {
2134 PyErr_SetString(PyExc_ValueError,
2135 "Attempted relative import in non-package");
2136 return NULL;
2137 }
2138 return Py_None;
2139 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002140 if (len > MAXPATHLEN) {
2141 PyErr_SetString(PyExc_ValueError,
Nick Coghlande10c852007-12-04 12:22:52 +00002142 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002143 return NULL;
2144 }
Nick Coghlande10c852007-12-04 12:22:52 +00002145 strcpy(buf, PyUnicode_AsString(pkgname));
2146 } else {
2147 /* __package__ not set, so figure it out and set it */
2148 modname = PyDict_GetItem(globals, namestr);
2149 if (modname == NULL || !PyUnicode_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002150 return Py_None;
Nick Coghlande10c852007-12-04 12:22:52 +00002151
2152 modpath = PyDict_GetItem(globals, pathstr);
2153 if (modpath != NULL) {
2154 /* __path__ is set, so modname is already the package name */
2155 Py_ssize_t len = PyUnicode_GET_SIZE(modname);
2156 int error;
2157 if (len > MAXPATHLEN) {
2158 PyErr_SetString(PyExc_ValueError,
2159 "Module name too long");
2160 return NULL;
2161 }
2162 strcpy(buf, PyUnicode_AsString(modname));
2163 error = PyDict_SetItem(globals, pkgstr, modname);
2164 if (error) {
2165 PyErr_SetString(PyExc_ValueError,
2166 "Could not set __package__");
2167 return NULL;
2168 }
2169 } else {
2170 /* Normal module, so work out the package name if any */
2171 char *start = PyUnicode_AsString(modname);
2172 char *lastdot = strrchr(start, '.');
2173 size_t len;
2174 int error;
2175 if (lastdot == NULL && level > 0) {
2176 PyErr_SetString(PyExc_ValueError,
2177 "Attempted relative import in non-package");
2178 return NULL;
2179 }
2180 if (lastdot == NULL) {
2181 error = PyDict_SetItem(globals, pkgstr, Py_None);
2182 if (error) {
2183 PyErr_SetString(PyExc_ValueError,
2184 "Could not set __package__");
2185 return NULL;
2186 }
2187 return Py_None;
2188 }
2189 len = lastdot - start;
2190 if (len >= MAXPATHLEN) {
2191 PyErr_SetString(PyExc_ValueError,
2192 "Module name too long");
2193 return NULL;
2194 }
2195 strncpy(buf, start, len);
2196 buf[len] = '\0';
2197 pkgname = PyUnicode_FromString(buf);
2198 if (pkgname == NULL) {
2199 return NULL;
2200 }
2201 error = PyDict_SetItem(globals, pkgstr, pkgname);
2202 Py_DECREF(pkgname);
2203 if (error) {
2204 PyErr_SetString(PyExc_ValueError,
2205 "Could not set __package__");
2206 return NULL;
2207 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002208 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002209 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002210 while (--level > 0) {
2211 char *dot = strrchr(buf, '.');
2212 if (dot == NULL) {
2213 PyErr_SetString(PyExc_ValueError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002214 "Attempted relative import beyond "
2215 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002216 return NULL;
2217 }
2218 *dot = '\0';
2219 }
2220 *p_buflen = strlen(buf);
2221
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002222 modules = PyImport_GetModuleDict();
2223 parent = PyDict_GetItemString(modules, buf);
2224 if (parent == NULL)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002225 PyErr_Format(PyExc_SystemError,
2226 "Parent module '%.200s' not loaded", buf);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002227 return parent;
2228 /* We expect, but can't guarantee, if parent != None, that:
2229 - parent.__name__ == buf
2230 - parent.__dict__ is globals
2231 If this is violated... Who cares? */
2232}
2233
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002235static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002236load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002237 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002238{
2239 char *name = *p_name;
2240 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002241 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002242 char *p;
2243 PyObject *result;
2244
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002245 if (strlen(name) == 0) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002246 /* completely empty module name should only happen in
2247 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002248 Py_INCREF(mod);
2249 *p_name = NULL;
2250 return mod;
2251 }
2252
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002253 if (dot == NULL) {
2254 *p_name = NULL;
2255 len = strlen(name);
2256 }
2257 else {
2258 *p_name = dot+1;
2259 len = dot-name;
2260 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002261 if (len == 0) {
2262 PyErr_SetString(PyExc_ValueError,
2263 "Empty module name");
2264 return NULL;
2265 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002266
2267 p = buf + *p_buflen;
2268 if (p != buf)
2269 *p++ = '.';
2270 if (p+len-buf >= MAXPATHLEN) {
2271 PyErr_SetString(PyExc_ValueError,
2272 "Module name too long");
2273 return NULL;
2274 }
2275 strncpy(p, name, len);
2276 p[len] = '\0';
2277 *p_buflen = p+len-buf;
2278
2279 result = import_submodule(mod, p, buf);
2280 if (result == Py_None && altmod != mod) {
2281 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002282 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002283 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002284 if (result != NULL && result != Py_None) {
2285 if (mark_miss(buf) != 0) {
2286 Py_DECREF(result);
2287 return NULL;
2288 }
2289 strncpy(buf, name, len);
2290 buf[len] = '\0';
2291 *p_buflen = len;
2292 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002293 }
2294 if (result == NULL)
2295 return NULL;
2296
2297 if (result == Py_None) {
2298 Py_DECREF(result);
2299 PyErr_Format(PyExc_ImportError,
2300 "No module named %.200s", name);
2301 return NULL;
2302 }
2303
2304 return result;
2305}
2306
2307static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002309{
2310 PyObject *modules = PyImport_GetModuleDict();
2311 return PyDict_SetItemString(modules, name, Py_None);
2312}
2313
2314static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002315ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002316 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002317{
2318 int i;
2319
2320 if (!PyObject_HasAttrString(mod, "__path__"))
2321 return 1;
2322
2323 for (i = 0; ; i++) {
2324 PyObject *item = PySequence_GetItem(fromlist, i);
2325 int hasit;
2326 if (item == NULL) {
2327 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2328 PyErr_Clear();
2329 return 1;
2330 }
2331 return 0;
2332 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002333 if (!PyUnicode_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002334 PyErr_SetString(PyExc_TypeError,
Neal Norwitz80e7f272007-08-26 06:45:23 +00002335 "Item in ``from list'' not a string");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002336 Py_DECREF(item);
2337 return 0;
2338 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002339 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002340 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002341 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002342 /* See if the package defines __all__ */
2343 if (recursive)
2344 continue; /* Avoid endless recursion */
2345 all = PyObject_GetAttrString(mod, "__all__");
2346 if (all == NULL)
2347 PyErr_Clear();
2348 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002349 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002350 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002351 if (!ret)
2352 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002353 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002354 continue;
2355 }
2356 hasit = PyObject_HasAttr(mod, item);
2357 if (!hasit) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002358 PyObject *item8;
2359 char *subname;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002360 PyObject *submod;
2361 char *p;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002362 if (!Py_FileSystemDefaultEncoding) {
2363 item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
2364 PyUnicode_GetSize(item),
Martin v. Löwis427dbff2007-06-12 05:53:00 +00002365 NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002366 } else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002367 item8 = PyUnicode_AsEncodedString(item,
2368 Py_FileSystemDefaultEncoding, NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002369 }
2370 if (!item8) {
2371 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2372 return 0;
2373 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002374 subname = PyString_AS_STRING(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002375 if (buflen + strlen(subname) >= MAXPATHLEN) {
2376 PyErr_SetString(PyExc_ValueError,
2377 "Module name too long");
2378 Py_DECREF(item);
2379 return 0;
2380 }
2381 p = buf + buflen;
2382 *p++ = '.';
2383 strcpy(p, subname);
2384 submod = import_submodule(mod, subname, buf);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002385 Py_DECREF(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002386 Py_XDECREF(submod);
2387 if (submod == NULL) {
2388 Py_DECREF(item);
2389 return 0;
2390 }
2391 }
2392 Py_DECREF(item);
2393 }
2394
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002395 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002396}
2397
Neil Schemenauer00b09662003-06-16 21:03:07 +00002398static int
2399add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2400 PyObject *modules)
2401{
2402 if (mod == Py_None)
2403 return 1;
2404 /* Irrespective of the success of this load, make a
2405 reference to it in the parent package module. A copy gets
2406 saved in the modules dictionary under the full name, so get a
2407 reference from there, if need be. (The exception is when the
2408 load failed with a SyntaxError -- then there's no trace in
2409 sys.modules. In that case, of course, do nothing extra.) */
2410 if (submod == NULL) {
2411 submod = PyDict_GetItemString(modules, fullname);
2412 if (submod == NULL)
2413 return 1;
2414 }
2415 if (PyModule_Check(mod)) {
2416 /* We can't use setattr here since it can give a
2417 * spurious warning if the submodule name shadows a
2418 * builtin name */
2419 PyObject *dict = PyModule_GetDict(mod);
2420 if (!dict)
2421 return 0;
2422 if (PyDict_SetItemString(dict, subname, submod) < 0)
2423 return 0;
2424 }
2425 else {
2426 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2427 return 0;
2428 }
2429 return 1;
2430}
2431
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002432static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002433import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002434{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002435 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002436 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002437
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002438 /* Require:
2439 if mod == None: subname == fullname
2440 else: mod.__name__ + "." + subname == fullname
2441 */
2442
Tim Peters50d8d372001-02-28 05:34:27 +00002443 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002445 }
2446 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002447 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002448 char buf[MAXPATHLEN+1];
2449 struct filedescr *fdp;
2450 FILE *fp = NULL;
2451
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002452 if (mod == Py_None)
2453 path = NULL;
2454 else {
2455 path = PyObject_GetAttrString(mod, "__path__");
2456 if (path == NULL) {
2457 PyErr_Clear();
2458 Py_INCREF(Py_None);
2459 return Py_None;
2460 }
2461 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002462
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002463 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002464 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2465 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002466 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002467 if (fdp == NULL) {
2468 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2469 return NULL;
2470 PyErr_Clear();
2471 Py_INCREF(Py_None);
2472 return Py_None;
2473 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002474 m = load_module(fullname, fp, buf, fdp->type, loader);
2475 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002476 if (fp)
2477 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002478 if (!add_submodule(mod, m, fullname, subname, modules)) {
2479 Py_XDECREF(m);
2480 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002481 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002482 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002483
2484 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002485}
2486
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002487
2488/* Re-import a module of any kind and return its module object, WITH
2489 INCREMENTED REFERENCE COUNT */
2490
Guido van Rossum79f25d91997-04-29 20:08:16 +00002491PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002493{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002494 PyInterpreterState *interp = PyThreadState_Get()->interp;
2495 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002496 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumd8faa362007-04-27 19:54:29 +00002497 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002498 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002499 char buf[MAXPATHLEN+1];
2500 struct filedescr *fdp;
2501 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002502 PyObject *newm;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002503
2504 if (modules_reloading == NULL) {
2505 Py_FatalError("PyImport_ReloadModule: "
Guido van Rossume7ba4952007-06-06 23:52:48 +00002506 "no modules_reloading dictionary!");
Guido van Rossumd8faa362007-04-27 19:54:29 +00002507 return NULL;
2508 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002509
Guido van Rossum79f25d91997-04-29 20:08:16 +00002510 if (m == NULL || !PyModule_Check(m)) {
2511 PyErr_SetString(PyExc_TypeError,
2512 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002513 return NULL;
2514 }
Neal Norwitz5616c6d2007-08-26 05:32:41 +00002515 name = (char*)PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002516 if (name == NULL)
2517 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002518 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002519 PyErr_Format(PyExc_ImportError,
2520 "reload(): module %.200s not in sys.modules",
2521 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002522 return NULL;
2523 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002524 existing_m = PyDict_GetItemString(modules_reloading, name);
2525 if (existing_m != NULL) {
2526 /* Due to a recursive reload, this module is already
2527 being reloaded. */
2528 Py_INCREF(existing_m);
2529 return existing_m;
2530 }
2531 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2532 return NULL;
2533
Guido van Rossum222ef561997-09-06 19:41:09 +00002534 subname = strrchr(name, '.');
2535 if (subname == NULL)
2536 subname = name;
2537 else {
2538 PyObject *parentname, *parent;
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002539 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002540 if (parentname == NULL) {
2541 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002542 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002543 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002544 parent = PyDict_GetItem(modules, parentname);
2545 if (parent == NULL) {
2546 PyErr_Format(PyExc_ImportError,
2547 "reload(): parent %.200s not in sys.modules",
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002548 PyUnicode_AsString(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002549 Py_DECREF(parentname);
Guido van Rossume7ba4952007-06-06 23:52:48 +00002550 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002551 return NULL;
2552 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002553 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002554 subname++;
2555 path = PyObject_GetAttrString(parent, "__path__");
2556 if (path == NULL)
2557 PyErr_Clear();
2558 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002559 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002560 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002561 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002562
2563 if (fdp == NULL) {
2564 Py_XDECREF(loader);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002565 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002566 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002567 }
2568
2569 newm = load_module(name, fp, buf, fdp->type, loader);
2570 Py_XDECREF(loader);
2571
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002572 if (fp)
2573 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002574 if (newm == NULL) {
2575 /* load_module probably removed name from modules because of
2576 * the error. Put back the original module object. We're
2577 * going to return NULL in this case regardless of whether
2578 * replacing name succeeds, so the return value is ignored.
2579 */
2580 PyDict_SetItemString(modules, name, m);
2581 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002582 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002583 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002584}
2585
2586
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002587/* Higher-level import emulator which emulates the "import" statement
2588 more accurately -- it invokes the __import__() function from the
2589 builtins of the current globals. This means that the import is
2590 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002591 environment, e.g. by "rexec".
2592 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002593 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002594 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002595
2596PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002597PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002598{
2599 static PyObject *silly_list = NULL;
2600 static PyObject *builtins_str = NULL;
2601 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002602 PyObject *globals = NULL;
2603 PyObject *import = NULL;
2604 PyObject *builtins = NULL;
2605 PyObject *r = NULL;
2606
2607 /* Initialize constant string objects */
2608 if (silly_list == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002609 import_str = PyUnicode_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002610 if (import_str == NULL)
2611 return NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002612 builtins_str = PyUnicode_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002613 if (builtins_str == NULL)
2614 return NULL;
2615 silly_list = Py_BuildValue("[s]", "__doc__");
2616 if (silly_list == NULL)
2617 return NULL;
2618 }
2619
2620 /* Get the builtins from current globals */
2621 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002622 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002623 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002624 builtins = PyObject_GetItem(globals, builtins_str);
2625 if (builtins == NULL)
2626 goto err;
2627 }
2628 else {
2629 /* No globals -- use standard builtins, and fake globals */
2630 PyErr_Clear();
2631
Georg Brandl1a3284e2007-12-02 09:40:06 +00002632 builtins = PyImport_ImportModuleLevel("builtins",
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002633 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002634 if (builtins == NULL)
2635 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002636 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2637 if (globals == NULL)
2638 goto err;
2639 }
2640
2641 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002642 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002643 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002644 if (import == NULL)
2645 PyErr_SetObject(PyExc_KeyError, import_str);
2646 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002647 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002648 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002649 if (import == NULL)
2650 goto err;
2651
Christian Heimes072c0f12008-01-03 23:01:04 +00002652 /* Call the __import__ function with the proper argument list
2653 * Always use absolute import here. */
2654 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2655 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002656
2657 err:
2658 Py_XDECREF(globals);
2659 Py_XDECREF(builtins);
2660 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002661
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002662 return r;
2663}
2664
2665
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002666/* Module 'imp' provides Python access to the primitives used for
2667 importing modules.
2668*/
2669
Guido van Rossum79f25d91997-04-29 20:08:16 +00002670static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002671imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002672{
2673 char buf[4];
2674
Guido van Rossum96774c12000-05-01 20:19:08 +00002675 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2676 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2677 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2678 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002679
Guido van Rossumad8d3002007-08-03 18:40:49 +00002680 return PyBytes_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002681}
2682
Guido van Rossum79f25d91997-04-29 20:08:16 +00002683static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002684imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002685{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002686 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002687 struct filedescr *fdp;
2688
Guido van Rossum79f25d91997-04-29 20:08:16 +00002689 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002690 if (list == NULL)
2691 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002692 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2693 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002694 fdp->suffix, fdp->mode, fdp->type);
2695 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002696 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002697 return NULL;
2698 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002699 if (PyList_Append(list, item) < 0) {
2700 Py_DECREF(list);
2701 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002702 return NULL;
2703 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002704 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002705 }
2706 return list;
2707}
2708
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002711{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002712 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002713 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002714 struct filedescr *fdp;
2715 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002716 FILE *fp = NULL;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002717 int fd = -1;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002718 char *found_encoding = NULL;
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002719 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002720
2721 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002722 if (path == Py_None)
2723 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002724 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002725 if (fdp == NULL)
2726 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002727 if (fp != NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002728 fd = fileno(fp);
2729 if (fd != -1)
2730 fd = dup(fd);
2731 fclose(fp);
2732 fp = NULL;
2733 }
2734 if (fd != -1) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002735 if (strchr(fdp->mode, 'b') == NULL) {
Brett Cannon3bb42d92007-10-20 03:43:15 +00002736 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
2737 memory. */
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002738 found_encoding = PyTokenizer_FindEncoding(fd);
2739 lseek(fd, 0, 0); /* Reset position */
Brett Cannon3bb42d92007-10-20 03:43:15 +00002740 encoding = (found_encoding != NULL) ? found_encoding :
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002741 (char*)PyUnicode_GetDefaultEncoding();
2742 }
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002743 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00002744 (char*)encoding, NULL, NULL, 1);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002745 if (fob == NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002746 close(fd);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002747 PyMem_FREE(found_encoding);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002748 return NULL;
2749 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002750 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002751 else {
2752 fob = Py_None;
2753 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002754 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002755 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002756 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002757 Py_DECREF(fob);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002758 PyMem_FREE(found_encoding);
2759
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002760 return ret;
2761}
2762
Guido van Rossum79f25d91997-04-29 20:08:16 +00002763static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002765{
2766 char *name;
2767 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002768 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002769 return NULL;
2770 return call_find_module(name, path);
2771}
2772
2773static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002774imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002775{
2776 char *name;
2777 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002779 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002780 return NULL;
2781 ret = init_builtin(name);
2782 if (ret < 0)
2783 return NULL;
2784 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 Py_INCREF(Py_None);
2786 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002787 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002788 m = PyImport_AddModule(name);
2789 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 return m;
2791}
2792
Guido van Rossum79f25d91997-04-29 20:08:16 +00002793static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002795{
2796 char *name;
2797 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002799 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002802 if (ret < 0)
2803 return NULL;
2804 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002805 Py_INCREF(Py_None);
2806 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002807 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002808 m = PyImport_AddModule(name);
2809 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002810 return m;
2811}
2812
Guido van Rossum79f25d91997-04-29 20:08:16 +00002813static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002814imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002815{
2816 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002817
Guido van Rossum43713e52000-02-29 13:59:29 +00002818 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002819 return NULL;
2820 return get_frozen_object(name);
2821}
2822
Guido van Rossum79f25d91997-04-29 20:08:16 +00002823static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002824imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002827 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002828 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00002829 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002830}
2831
Guido van Rossum79f25d91997-04-29 20:08:16 +00002832static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002833imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002834{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002835 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002836 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002837 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002838 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002839 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002840 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002841}
2842
2843static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002844get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002845{
2846 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002847 if (mode[0] == 'U')
2848 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002849 if (fob == NULL) {
2850 fp = fopen(pathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002851 }
2852 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002853 int fd = PyObject_AsFileDescriptor(fob);
2854 if (fd == -1)
2855 return NULL;
2856 /* XXX This will leak a FILE struct. Fix this!!!!
2857 (But it doesn't leak a file descrioptor!) */
2858 fp = fdopen(fd, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002859 }
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002860 if (fp == NULL)
2861 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002862 return fp;
2863}
2864
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002867{
2868 char *name;
2869 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002870 PyObject *fob = NULL;
2871 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002872 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002873 if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
2874 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002875 return NULL;
2876 fp = get_file(pathname, fob, "rb");
2877 if (fp == NULL)
2878 return NULL;
2879 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002880 if (fob == NULL)
2881 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002882 return m;
2883}
2884
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002885#ifdef HAVE_DYNAMIC_LOADING
2886
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002888imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002889{
2890 char *name;
2891 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002892 PyObject *fob = NULL;
2893 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002894 FILE *fp = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002895 if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
2896 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002897 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002898 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002899 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002900 if (fp == NULL)
2901 return NULL;
2902 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002903 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002904 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002905}
2906
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002907#endif /* HAVE_DYNAMIC_LOADING */
2908
Guido van Rossum79f25d91997-04-29 20:08:16 +00002909static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002911{
2912 char *name;
2913 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002914 PyObject *fob = NULL;
2915 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002916 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002917 if (!PyArg_ParseTuple(args, "ss|O:load_source",
2918 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002919 return NULL;
2920 fp = get_file(pathname, fob, "r");
2921 if (fp == NULL)
2922 return NULL;
2923 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002924 if (fob == NULL)
2925 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002926 return m;
2927}
2928
Guido van Rossum79f25d91997-04-29 20:08:16 +00002929static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002931{
2932 char *name;
2933 PyObject *fob;
2934 char *pathname;
2935 char *suffix; /* Unused */
2936 char *mode;
2937 int type;
2938 FILE *fp;
2939
Guido van Rossum43713e52000-02-29 13:59:29 +00002940 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002941 &name, &fob, &pathname,
2942 &suffix, &mode, &type))
2943 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002944 if (*mode) {
2945 /* Mode must start with 'r' or 'U' and must not contain '+'.
2946 Implicit in this test is the assumption that the mode
2947 may contain other modifiers like 'b' or 't'. */
2948
2949 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002950 PyErr_Format(PyExc_ValueError,
2951 "invalid file open mode %.200s", mode);
2952 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002953 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002954 }
2955 if (fob == Py_None)
2956 fp = NULL;
2957 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002958 fp = get_file(NULL, fob, mode);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002959 if (fp == NULL)
2960 return NULL;
2961 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002962 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002963}
2964
2965static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002967{
2968 char *name;
2969 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002970 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002971 return NULL;
2972 return load_package(name, pathname);
2973}
2974
2975static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002976imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002977{
2978 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002979 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002980 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002981 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002982}
2983
Christian Heimes13a7a212008-01-07 17:13:09 +00002984static PyObject *
2985imp_reload(PyObject *self, PyObject *v)
2986{
2987 return PyImport_ReloadModule(v);
2988}
2989
2990PyDoc_STRVAR(doc_reload,
2991"reload(module) -> module\n\
2992\n\
2993Reload the module. The module must have been successfully imported before.");
2994
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002995/* Doc strings */
2996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997PyDoc_STRVAR(doc_imp,
2998"This module provides the components needed to build your own\n\
2999__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003001PyDoc_STRVAR(doc_find_module,
3002"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003003Search for a module. If path is omitted or None, search for a\n\
3004built-in, frozen or special module and continue search in sys.path.\n\
3005The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003008PyDoc_STRVAR(doc_load_module,
3009"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003010Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003011The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003013PyDoc_STRVAR(doc_get_magic,
3014"get_magic() -> string\n\
3015Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003017PyDoc_STRVAR(doc_get_suffixes,
3018"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003019Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003020that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003022PyDoc_STRVAR(doc_new_module,
3023"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003024Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003025The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003027PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003028"lock_held() -> boolean\n\
3029Return True if the import lock is currently held, else False.\n\
3030On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003031
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003032PyDoc_STRVAR(doc_acquire_lock,
3033"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003034Acquires the interpreter's import lock for the current thread.\n\
3035This lock should be used by import hooks to ensure thread-safety\n\
3036when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003037On platforms without threads, this function does nothing.");
3038
3039PyDoc_STRVAR(doc_release_lock,
3040"release_lock() -> None\n\
3041Release the interpreter's import lock.\n\
3042On platforms without threads, this function does nothing.");
3043
Guido van Rossum79f25d91997-04-29 20:08:16 +00003044static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003045 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3046 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3047 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3048 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3049 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3050 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3051 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3052 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Christian Heimes13a7a212008-01-07 17:13:09 +00003053 {"reload", imp_reload, METH_O, doc_reload},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003054 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003055 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3056 {"init_builtin", imp_init_builtin, METH_VARARGS},
3057 {"init_frozen", imp_init_frozen, METH_VARARGS},
3058 {"is_builtin", imp_is_builtin, METH_VARARGS},
3059 {"is_frozen", imp_is_frozen, METH_VARARGS},
3060 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003061#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003062 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003063#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003064 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003065 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003066 {NULL, NULL} /* sentinel */
3067};
3068
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003069static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003071{
3072 PyObject *v;
3073 int err;
3074
Christian Heimes217cfd12007-12-02 14:31:20 +00003075 v = PyLong_FromLong((long)value);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003076 err = PyDict_SetItemString(d, name, v);
3077 Py_XDECREF(v);
3078 return err;
3079}
3080
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003081typedef struct {
3082 PyObject_HEAD
3083} NullImporter;
3084
3085static int
3086NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3087{
3088 char *path;
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003089 Py_ssize_t pathlen;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003090
3091 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3092 return -1;
3093
3094 if (!PyArg_ParseTuple(args, "s:NullImporter",
3095 &path))
3096 return -1;
3097
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003098 pathlen = strlen(path);
3099 if (pathlen == 0) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003100 PyErr_SetString(PyExc_ImportError, "empty pathname");
3101 return -1;
3102 } else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003103 struct stat statbuf;
3104 int rv;
3105
3106 rv = stat(path, &statbuf);
Guido van Rossumc1bdbc32007-11-07 17:46:34 +00003107#ifdef MS_WINDOWS
3108 /* MS Windows stat() chokes on paths like C:\path\. Try to
3109 * recover *one* time by stripping off a trailing slash or
3110 * backslash. http://bugs.python.org/issue1293
3111 */
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003112 if (rv != 0 && pathlen <= MAXPATHLEN &&
3113 (path[pathlen-1] == '/' || path[pathlen-1] == '\\')) {
3114 char mangled[MAXPATHLEN+1];
3115
3116 strcpy(mangled, path);
3117 mangled[pathlen-1] = '\0';
3118 rv = stat(mangled, &statbuf);
3119 }
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003120#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003121 if (rv == 0) {
3122 /* it exists */
3123 if (S_ISDIR(statbuf.st_mode)) {
3124 /* it's a directory */
3125 PyErr_SetString(PyExc_ImportError,
3126 "existing directory");
3127 return -1;
3128 }
3129 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003130 }
3131 return 0;
3132}
3133
3134static PyObject *
3135NullImporter_find_module(NullImporter *self, PyObject *args)
3136{
3137 Py_RETURN_NONE;
3138}
3139
3140static PyMethodDef NullImporter_methods[] = {
3141 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3142 "Always return None"
3143 },
3144 {NULL} /* Sentinel */
3145};
3146
3147
Christian Heimes9cd17752007-11-18 19:35:23 +00003148PyTypeObject PyNullImporter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003149 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003150 "imp.NullImporter", /*tp_name*/
3151 sizeof(NullImporter), /*tp_basicsize*/
3152 0, /*tp_itemsize*/
3153 0, /*tp_dealloc*/
3154 0, /*tp_print*/
3155 0, /*tp_getattr*/
3156 0, /*tp_setattr*/
3157 0, /*tp_compare*/
3158 0, /*tp_repr*/
3159 0, /*tp_as_number*/
3160 0, /*tp_as_sequence*/
3161 0, /*tp_as_mapping*/
3162 0, /*tp_hash */
3163 0, /*tp_call*/
3164 0, /*tp_str*/
3165 0, /*tp_getattro*/
3166 0, /*tp_setattro*/
3167 0, /*tp_as_buffer*/
3168 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3169 "Null importer object", /* tp_doc */
3170 0, /* tp_traverse */
3171 0, /* tp_clear */
3172 0, /* tp_richcompare */
3173 0, /* tp_weaklistoffset */
3174 0, /* tp_iter */
3175 0, /* tp_iternext */
3176 NullImporter_methods, /* tp_methods */
3177 0, /* tp_members */
3178 0, /* tp_getset */
3179 0, /* tp_base */
3180 0, /* tp_dict */
3181 0, /* tp_descr_get */
3182 0, /* tp_descr_set */
3183 0, /* tp_dictoffset */
3184 (initproc)NullImporter_init, /* tp_init */
3185 0, /* tp_alloc */
3186 PyType_GenericNew /* tp_new */
3187};
3188
3189
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003190PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003192{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003193 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003194
Christian Heimes9cd17752007-11-18 19:35:23 +00003195 if (PyType_Ready(&PyNullImporter_Type) < 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003196 goto failure;
3197
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003198 m = Py_InitModule4("imp", imp_methods, doc_imp,
3199 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003200 if (m == NULL)
3201 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003202 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003203 if (d == NULL)
3204 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003205
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003206 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3207 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3208 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3209 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3210 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3211 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3212 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3213 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003214 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003215 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003216
Christian Heimes9cd17752007-11-18 19:35:23 +00003217 Py_INCREF(&PyNullImporter_Type);
3218 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003219 failure:
3220 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003221}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003222
3223
Guido van Rossumb18618d2000-05-03 23:44:39 +00003224/* API for embedding applications that want to add their own entries
3225 to the table of built-in modules. This should normally be called
3226 *before* Py_Initialize(). When the table resize fails, -1 is
3227 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003228
3229 After a similar function by Just van Rossum. */
3230
3231int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003233{
3234 static struct _inittab *our_copy = NULL;
3235 struct _inittab *p;
3236 int i, n;
3237
3238 /* Count the number of entries in both tables */
3239 for (n = 0; newtab[n].name != NULL; n++)
3240 ;
3241 if (n == 0)
3242 return 0; /* Nothing to do */
3243 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3244 ;
3245
3246 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003247 p = our_copy;
3248 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003249 if (p == NULL)
3250 return -1;
3251
3252 /* Copy the tables into the new memory */
3253 if (our_copy != PyImport_Inittab)
3254 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3255 PyImport_Inittab = our_copy = p;
3256 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3257
3258 return 0;
3259}
3260
3261/* Shorthand to add a single entry given a name and a function */
3262
3263int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003264PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003265{
3266 struct _inittab newtab[2];
3267
3268 memset(newtab, '\0', sizeof newtab);
3269
3270 newtab[0].name = name;
3271 newtab[0].initfunc = initfunc;
3272
3273 return PyImport_ExtendInittab(newtab);
3274}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003275
3276#ifdef __cplusplus
3277}
3278#endif