blob: cce854fc7c2a71731bbedbe1bfdfd62acd59fc38 [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",
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000374 NULL
375};
376
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000377static char* sys_files[] = {
378 "stdin", "__stdin__",
379 "stdout", "__stdout__",
380 "stderr", "__stderr__",
381 NULL
382};
383
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000384
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000385/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000386
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000388PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390 Py_ssize_t pos, ndone;
Guido van Rossum758eec01998-01-19 21:58:26 +0000391 char *name;
392 PyObject *key, *value, *dict;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000393 PyInterpreterState *interp = PyThreadState_GET()->interp;
Guido van Rossum758eec01998-01-19 21:58:26 +0000394 PyObject *modules = interp->modules;
395
396 if (modules == NULL)
397 return; /* Already done */
398
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000399 /* Delete some special variables first. These are common
400 places where user values hide and people complain when their
401 destructors fail. Since the modules containing them are
402 deleted *last* of all, they would come too late in the normal
403 destruction order. Sigh. */
404
Georg Brandl1a3284e2007-12-02 09:40:06 +0000405 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000406 if (value != NULL && PyModule_Check(value)) {
407 dict = PyModule_GetDict(value);
408 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000409 PySys_WriteStderr("# clear builtins._\n");
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000410 PyDict_SetItemString(dict, "_", Py_None);
411 }
412 value = PyDict_GetItemString(modules, "sys");
413 if (value != NULL && PyModule_Check(value)) {
414 char **p;
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000415 PyObject *v;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000416 dict = PyModule_GetDict(value);
417 for (p = sys_deletes; *p != NULL; p++) {
418 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000419 PySys_WriteStderr("# clear sys.%s\n", *p);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000420 PyDict_SetItemString(dict, *p, Py_None);
421 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000422 for (p = sys_files; *p != NULL; p+=2) {
423 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000424 PySys_WriteStderr("# restore sys.%s\n", *p);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000425 v = PyDict_GetItemString(dict, *(p+1));
426 if (v == NULL)
427 v = Py_None;
428 PyDict_SetItemString(dict, *p, v);
429 }
430 }
431
432 /* First, delete __main__ */
433 value = PyDict_GetItemString(modules, "__main__");
434 if (value != NULL && PyModule_Check(value)) {
435 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000436 PySys_WriteStderr("# cleanup __main__\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000437 _PyModule_Clear(value);
438 PyDict_SetItemString(modules, "__main__", Py_None);
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000439 }
440
Georg Brandl1a3284e2007-12-02 09:40:06 +0000441 /* The special treatment of "builtins" here is because even
Guido van Rossum758eec01998-01-19 21:58:26 +0000442 when it's not referenced as a module, its dictionary is
443 referenced by almost every module's __builtins__. Since
444 deleting a module clears its dictionary (even if there are
Georg Brandl1a3284e2007-12-02 09:40:06 +0000445 references left to it), we need to delete the "builtins"
Guido van Rossum758eec01998-01-19 21:58:26 +0000446 module last. Likewise, we don't delete sys until the very
447 end because it is implicitly referenced (e.g. by print).
448
449 Also note that we 'delete' modules by replacing their entry
450 in the modules dict with None, rather than really deleting
451 them; this avoids a rehash of the modules dictionary and
452 also marks them as "non existent" so they won't be
453 re-imported. */
454
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000455 /* Next, repeatedly delete modules with a reference count of
Georg Brandl1a3284e2007-12-02 09:40:06 +0000456 one (skipping builtins and sys) and delete them */
Guido van Rossum758eec01998-01-19 21:58:26 +0000457 do {
458 ndone = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000459 pos = 0;
Guido van Rossum758eec01998-01-19 21:58:26 +0000460 while (PyDict_Next(modules, &pos, &key, &value)) {
461 if (value->ob_refcnt != 1)
462 continue;
Neal Norwitz80e7f272007-08-26 06:45:23 +0000463 if (PyUnicode_Check(key) && PyModule_Check(value)) {
464 name = PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000465 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000466 continue;
467 if (strcmp(name, "sys") == 0)
468 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000469 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000470 PySys_WriteStderr(
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000471 "# cleanup[1] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000472 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000473 PyDict_SetItem(modules, key, Py_None);
474 ndone++;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000475 }
476 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000477 } while (ndone > 0);
478
Georg Brandl1a3284e2007-12-02 09:40:06 +0000479 /* Next, delete all modules (still skipping builtins and sys) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000480 pos = 0;
481 while (PyDict_Next(modules, &pos, &key, &value)) {
Neal Norwitz80e7f272007-08-26 06:45:23 +0000482 if (PyUnicode_Check(key) && PyModule_Check(value)) {
483 name = PyUnicode_AsString(key);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000484 if (strcmp(name, "builtins") == 0)
Guido van Rossum758eec01998-01-19 21:58:26 +0000485 continue;
486 if (strcmp(name, "sys") == 0)
487 continue;
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000488 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000489 PySys_WriteStderr("# cleanup[2] %s\n", name);
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000490 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000491 PyDict_SetItem(modules, key, Py_None);
492 }
493 }
494
Georg Brandl1a3284e2007-12-02 09:40:06 +0000495 /* Next, delete sys and builtins (in that order) */
Guido van Rossum758eec01998-01-19 21:58:26 +0000496 value = PyDict_GetItemString(modules, "sys");
497 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000498 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000499 PySys_WriteStderr("# cleanup sys\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000500 _PyModule_Clear(value);
Guido van Rossum758eec01998-01-19 21:58:26 +0000501 PyDict_SetItemString(modules, "sys", Py_None);
502 }
Georg Brandl1a3284e2007-12-02 09:40:06 +0000503 value = PyDict_GetItemString(modules, "builtins");
Guido van Rossum758eec01998-01-19 21:58:26 +0000504 if (value != NULL && PyModule_Check(value)) {
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000505 if (Py_VerboseFlag)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000506 PySys_WriteStderr("# cleanup builtins\n");
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000507 _PyModule_Clear(value);
Georg Brandl1a3284e2007-12-02 09:40:06 +0000508 PyDict_SetItemString(modules, "builtins", Py_None);
Guido van Rossum758eec01998-01-19 21:58:26 +0000509 }
510
511 /* Finally, clear and delete the modules directory */
512 PyDict_Clear(modules);
513 interp->modules = NULL;
514 Py_DECREF(modules);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515 Py_CLEAR(interp->modules_reloading);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000516}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000517
518
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519/* Helper for pythonrun.c -- return magic number */
520
521long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000522PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523{
Guido van Rossum96774c12000-05-01 20:19:08 +0000524 return pyc_magic;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525}
526
527
Guido van Rossum25ce5661997-08-02 03:10:38 +0000528/* Magic for extension modules (built-in as well as dynamically
529 loaded). To prevent initializing an extension module more than
530 once, we keep a static dictionary 'extensions' keyed by module name
531 (for built-in modules) or by filename (for dynamically loaded
Barry Warsaw92883382001-08-13 23:05:44 +0000532 modules), containing these modules. A copy of the module's
Guido van Rossum25ce5661997-08-02 03:10:38 +0000533 dictionary is stored by calling _PyImport_FixupExtension()
534 immediately after the module initialization function succeeds. A
535 copy can be retrieved from there by calling
536 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539_PyImport_FixupExtension(char *name, char *filename)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000541 PyObject *modules, *mod, *dict, *copy;
542 if (extensions == NULL) {
543 extensions = PyDict_New();
544 if (extensions == NULL)
545 return NULL;
546 }
547 modules = PyImport_GetModuleDict();
548 mod = PyDict_GetItemString(modules, name);
549 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000550 PyErr_Format(PyExc_SystemError,
551 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000552 return NULL;
553 }
554 dict = PyModule_GetDict(mod);
555 if (dict == NULL)
556 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000557 copy = PyDict_Copy(dict);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000558 if (copy == NULL)
559 return NULL;
560 PyDict_SetItemString(extensions, filename, copy);
561 Py_DECREF(copy);
562 return copy;
563}
564
565PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566_PyImport_FindExtension(char *name, char *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000567{
Fred Drake9cd0efc2001-10-25 21:38:59 +0000568 PyObject *dict, *mod, *mdict;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000569 if (extensions == NULL)
570 return NULL;
571 dict = PyDict_GetItemString(extensions, filename);
572 if (dict == NULL)
573 return NULL;
574 mod = PyImport_AddModule(name);
575 if (mod == NULL)
576 return NULL;
577 mdict = PyModule_GetDict(mod);
578 if (mdict == NULL)
579 return NULL;
Fred Drake9cd0efc2001-10-25 21:38:59 +0000580 if (PyDict_Update(mdict, dict))
Guido van Rossum25ce5661997-08-02 03:10:38 +0000581 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000582 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000583 PySys_WriteStderr("import %s # previously loaded (%s)\n",
Guido van Rossum25ce5661997-08-02 03:10:38 +0000584 name, filename);
585 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586}
587
588
589/* Get the module object corresponding to a module name.
590 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000591 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000592 Because the former action is most common, THIS DOES NOT RETURN A
593 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000596PyImport_AddModule(const char *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000598 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605 if (m == NULL)
606 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000607 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000609 return NULL;
610 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612
613 return m;
614}
615
Tim Peters1cd70172004-08-02 03:52:12 +0000616/* Remove name from sys.modules, if it's there. */
617static void
618_RemoveModule(const char *name)
619{
620 PyObject *modules = PyImport_GetModuleDict();
621 if (PyDict_GetItemString(modules, name) == NULL)
622 return;
623 if (PyDict_DelItemString(modules, name) < 0)
624 Py_FatalError("import: deleting existing key in"
625 "sys.modules failed");
626}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627
Christian Heimes3b06e532008-01-07 20:12:44 +0000628static PyObject * get_sourcefile(const char *file);
629
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000630/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000631 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
632 * removed from sys.modules, to avoid leaving damaged module objects
633 * in sys.modules. The caller may wish to restore the original
634 * module object (if any) in this case; PyImport_ReloadModule is an
635 * example.
636 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000638PyImport_ExecCodeModule(char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639{
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000640 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
641}
642
643PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000644PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000645{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 if (m == NULL)
651 return NULL;
Jeremy Hyltonecd91292004-01-02 23:25:32 +0000652 /* If the module is being reloaded, we get the old module back
653 and re-use its dict to exec the new code. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 d = PyModule_GetDict(m);
655 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
656 if (PyDict_SetItemString(d, "__builtins__",
657 PyEval_GetBuiltins()) != 0)
Tim Peters1cd70172004-08-02 03:52:12 +0000658 goto error;
Guido van Rossum6135a871995-01-09 17:53:26 +0000659 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000660 /* Remember the filename as the __file__ attribute */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000661 v = NULL;
662 if (pathname != NULL) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000663 v = get_sourcefile(pathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000664 if (v == NULL)
665 PyErr_Clear();
666 }
667 if (v == NULL) {
668 v = ((PyCodeObject *)co)->co_filename;
669 Py_INCREF(v);
670 }
671 if (PyDict_SetItemString(d, "__file__", v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 PyErr_Clear(); /* Not important enough to report */
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000673 Py_DECREF(v);
674
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000675 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 if (v == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +0000677 goto error;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000679
Guido van Rossum25ce5661997-08-02 03:10:38 +0000680 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000681 PyErr_Format(PyExc_ImportError,
682 "Loaded module %.200s not found in sys.modules",
683 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000684 return NULL;
685 }
686
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688
689 return m;
Tim Peters1cd70172004-08-02 03:52:12 +0000690
691 error:
692 _RemoveModule(name);
693 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694}
695
696
697/* Given a pathname for a Python source file, fill a buffer with the
698 pathname for the corresponding compiled file. Return the pathname
699 for the compiled file, or NULL if there's no space in the buffer.
700 Doesn't set an exception. */
701
702static char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703make_compiled_pathname(char *pathname, char *buf, size_t buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704{
Tim Petersc1731372001-08-04 08:12:36 +0000705 size_t len = strlen(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 if (len+2 > buflen)
707 return NULL;
Tim Petersc1731372001-08-04 08:12:36 +0000708
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000709#ifdef MS_WINDOWS
Tim Petersc1731372001-08-04 08:12:36 +0000710 /* Treat .pyw as if it were .py. The case of ".pyw" must match
711 that used in _PyImport_StandardFiletab. */
712 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
713 --len; /* pretend 'w' isn't there */
714#endif
715 memcpy(buf, pathname, len);
716 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
717 buf[len+1] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718
719 return buf;
720}
721
722
723/* Given a pathname for a Python source file, its time of last
724 modification, and a pathname for a compiled file, check whether the
725 compiled file represents the same version of the source. If so,
726 return a FILE pointer for the compiled file, positioned just after
727 the header; if not, return NULL.
728 Doesn't set an exception. */
729
730static FILE *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000731check_compiled_module(char *pathname, time_t mtime, char *cpathname)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732{
733 FILE *fp;
734 long magic;
735 long pyc_mtime;
736
737 fp = fopen(cpathname, "rb");
738 if (fp == NULL)
739 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000741 if (magic != pyc_magic) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000743 PySys_WriteStderr("# %s has bad magic\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 fclose(fp);
745 return NULL;
746 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000750 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 fclose(fp);
752 return NULL;
753 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000755 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 return fp;
757}
758
759
760/* Read a code object from a file and check it for validity */
761
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000763read_compiled_module(char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766
Tim Petersd9b9ac82001-01-28 00:27:39 +0000767 co = PyMarshal_ReadLastObjectFromFile(fp);
Armin Rigo01ab2792004-03-26 15:09:27 +0000768 if (co == NULL)
769 return NULL;
770 if (!PyCode_Check(co)) {
771 PyErr_Format(PyExc_ImportError,
772 "Non-code object in %.200s", cpathname);
773 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774 return NULL;
775 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777}
778
779
780/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000781 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000784load_compiled_module(char *name, char *cpathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785{
786 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 PyCodeObject *co;
788 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum96774c12000-05-01 20:19:08 +0000791 if (magic != pyc_magic) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000792 PyErr_Format(PyExc_ImportError,
793 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794 return NULL;
795 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798 if (co == NULL)
799 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000801 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802 name, cpathname);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000803 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805
806 return m;
807}
808
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809/* Parse a source file and return the corresponding code object */
810
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811static PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812parse_source_module(const char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814 PyCodeObject *co = NULL;
815 mod_ty mod;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000816 PyArena *arena = PyArena_New();
817 if (arena == NULL)
818 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000820 mod = PyParser_ASTFromFile(fp, pathname, NULL,
821 Py_file_input, 0, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000822 NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 if (mod) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000824 co = PyAST_Compile(mod, pathname, NULL, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000826 PyArena_Free(arena);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827 return co;
828}
829
830
Guido van Rossum55a83382000-09-20 20:31:38 +0000831/* Helper to open a bytecode file for writing in exclusive mode */
832
833static FILE *
834open_exclusive(char *filename)
835{
836#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
837 /* Use O_EXCL to avoid a race condition when another process tries to
838 write the same file. When that happens, our open() call fails,
839 which is just fine (since it's only a cache).
840 XXX If the file exists and is writable but the directory is not
841 writable, the file will never be written. Oh well.
842 */
843 int fd;
844 (void) unlink(filename);
Tim Peters42c83af2000-09-29 04:03:10 +0000845 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
846#ifdef O_BINARY
847 |O_BINARY /* necessary for Windows */
848#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000849#ifdef __VMS
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850 , 0666, "ctxt=bin", "shr=nil"
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000851#else
Martin v. Löwis18e16552006-02-15 17:27:45 +0000852 , 0666
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000853#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000854 );
Guido van Rossum55a83382000-09-20 20:31:38 +0000855 if (fd < 0)
856 return NULL;
857 return fdopen(fd, "wb");
858#else
859 /* Best we can do -- on Windows this can't happen anyway */
860 return fopen(filename, "wb");
861#endif
862}
863
864
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865/* Write a compiled module to a file, placing the time of last
866 modification of its source into the header.
867 Errors are ignored, if a write error occurs an attempt is made to
868 remove the file. */
869
870static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000871write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872{
873 FILE *fp;
874
Guido van Rossum55a83382000-09-20 20:31:38 +0000875 fp = open_exclusive(cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000878 PySys_WriteStderr(
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 "# can't create %s\n", cpathname);
880 return;
881 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000882 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 /* First write a 0 for mtime */
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000884 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
885 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
Armin Rigo01ab2792004-03-26 15:09:27 +0000886 if (fflush(fp) != 0 || ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000888 PySys_WriteStderr("# can't write %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 /* Don't keep partial file */
890 fclose(fp);
891 (void) unlink(cpathname);
892 return;
893 }
894 /* Now write the true mtime */
895 fseek(fp, 4L, 0);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000896 assert(mtime < LONG_MAX);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000897 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898 fflush(fp);
899 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000901 PySys_WriteStderr("# wrote %s\n", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902}
903
904
905/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000906 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
907 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000910load_source_module(char *name, char *pathname, FILE *fp)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911{
Fred Drake4c82b232000-06-30 16:18:57 +0000912 time_t mtime;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913 FILE *fpc;
914 char buf[MAXPATHLEN+1];
915 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyCodeObject *co;
917 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000919 mtime = PyOS_GetLastModificationTime(pathname, fp);
Neal Norwitz708e51a2005-10-03 04:48:15 +0000920 if (mtime == (time_t)(-1)) {
921 PyErr_Format(PyExc_RuntimeError,
922 "unable to get modification time from '%s'",
923 pathname);
Fred Drake4c82b232000-06-30 16:18:57 +0000924 return NULL;
Neal Norwitz708e51a2005-10-03 04:48:15 +0000925 }
Fred Drake4c82b232000-06-30 16:18:57 +0000926#if SIZEOF_TIME_T > 4
927 /* Python's .pyc timestamp handling presumes that the timestamp fits
928 in 4 bytes. This will be fine until sometime in the year 2038,
929 when a 4-byte signed time_t will overflow.
930 */
931 if (mtime >> 32) {
932 PyErr_SetString(PyExc_OverflowError,
Fred Drakec63d3e92001-03-01 06:33:32 +0000933 "modification time overflows a 4 byte field");
Fred Drake4c82b232000-06-30 16:18:57 +0000934 return NULL;
935 }
936#endif
Tim Peters36515e22001-11-18 04:06:29 +0000937 cpathname = make_compiled_pathname(pathname, buf,
Jeremy Hylton37832f02001-04-13 17:50:20 +0000938 (size_t)MAXPATHLEN + 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 if (cpathname != NULL &&
940 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000941 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 fclose(fpc);
943 if (co == NULL)
944 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000946 PySys_WriteStderr("import %s # precompiled from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947 name, cpathname);
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000948 pathname = cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 }
950 else {
951 co = parse_source_module(pathname, fp);
952 if (co == NULL)
953 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000955 PySys_WriteStderr("import %s # from %s\n",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 name, pathname);
Christian Heimes790c8232008-01-07 21:14:23 +0000957 if (cpathname) {
958 PyObject *ro = PySys_GetObject("dont_write_bytecode");
959 if (ro == NULL || !PyObject_IsTrue(ro))
960 write_compiled_module(co, cpathname, mtime);
961 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 }
Guido van Rossumafd3dae1998-08-25 18:44:34 +0000963 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965
966 return m;
967}
968
Christian Heimes3b06e532008-01-07 20:12:44 +0000969/* Get source file -> unicode or None
970 * Returns the path to the py file if available, else the given path
971 */
972static PyObject *
973get_sourcefile(const char *file)
974{
975 char py[MAXPATHLEN + 1];
976 Py_ssize_t len;
977 PyObject *u;
978 struct stat statbuf;
979
980 if (!file || !*file) {
981 Py_RETURN_NONE;
982 }
983
984 len = strlen(file);
Christian Heimes3540b502008-01-11 07:03:05 +0000985 /* match '*.py?' */
986 if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
Christian Heimes3b06e532008-01-07 20:12:44 +0000987 return PyUnicode_DecodeFSDefault(file);
988 }
989
990 strncpy(py, file, len-1);
991 py[len] = '\0';
992 if (stat(py, &statbuf) == 0 &&
993 S_ISREG(statbuf.st_mode)) {
994 u = PyUnicode_DecodeFSDefault(py);
995 }
996 else {
997 u = PyUnicode_DecodeFSDefault(file);
998 }
999 return u;
1000}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001002/* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001003static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
1004static struct filedescr *find_module(char *, char *, PyObject *,
1005 char *, size_t, FILE **, PyObject **);
Christian Heimes3b06e532008-01-07 20:12:44 +00001006static struct _frozen * find_frozen(char *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001007
1008/* Load a package and return its module object WITH INCREMENTED
1009 REFERENCE COUNT */
1010
1011static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001012load_package(char *name, char *pathname)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001013{
Tim Peters1cd70172004-08-02 03:52:12 +00001014 PyObject *m, *d;
1015 PyObject *file = NULL;
1016 PyObject *path = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001017 int err;
1018 char buf[MAXPATHLEN+1];
1019 FILE *fp = NULL;
1020 struct filedescr *fdp;
1021
1022 m = PyImport_AddModule(name);
1023 if (m == NULL)
1024 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001025 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001026 PySys_WriteStderr("import %s # directory %s\n",
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001027 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001028 d = PyModule_GetDict(m);
Christian Heimes3b06e532008-01-07 20:12:44 +00001029 file = get_sourcefile(pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001030 if (file == NULL)
Tim Peters1cd70172004-08-02 03:52:12 +00001031 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001032 path = Py_BuildValue("[O]", file);
Tim Peters1cd70172004-08-02 03:52:12 +00001033 if (path == NULL)
1034 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001035 err = PyDict_SetItemString(d, "__file__", file);
1036 if (err == 0)
1037 err = PyDict_SetItemString(d, "__path__", path);
Tim Peters1cd70172004-08-02 03:52:12 +00001038 if (err != 0)
1039 goto error;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001040 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00001041 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001042 if (fdp == NULL) {
1043 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1044 PyErr_Clear();
Thomas Heller25653242004-06-07 15:04:10 +00001045 Py_INCREF(m);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001046 }
1047 else
1048 m = NULL;
1049 goto cleanup;
1050 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001051 m = load_module(name, fp, buf, fdp->type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001052 if (fp != NULL)
1053 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00001054 goto cleanup;
1055
1056 error:
1057 m = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001058 cleanup:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001059 Py_XDECREF(path);
1060 Py_XDECREF(file);
1061 return m;
1062}
1063
1064
1065/* Helper to test for built-in module */
1066
1067static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001068is_builtin(char *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001069{
1070 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +00001071 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1072 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
1073 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001074 return -1;
1075 else
1076 return 1;
1077 }
1078 }
1079 return 0;
1080}
1081
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001082
Just van Rossum52e14d62002-12-30 22:08:05 +00001083/* Return an importer object for a sys.path/pkg.__path__ item 'p',
1084 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001085 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001086 that can handle the path item. Return None if no hook could;
1087 this tells our caller it should fall back to the builtin
1088 import mechanism. Cache the result in path_importer_cache.
1089 Returns a borrowed reference. */
1090
1091static PyObject *
1092get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
1093 PyObject *p)
1094{
1095 PyObject *importer;
Martin v. Löwis725507b2006-03-07 12:08:51 +00001096 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001097
1098 /* These conditions are the caller's responsibility: */
1099 assert(PyList_Check(path_hooks));
1100 assert(PyDict_Check(path_importer_cache));
1101
1102 nhooks = PyList_Size(path_hooks);
1103 if (nhooks < 0)
1104 return NULL; /* Shouldn't happen */
1105
1106 importer = PyDict_GetItem(path_importer_cache, p);
1107 if (importer != NULL)
1108 return importer;
1109
1110 /* set path_importer_cache[p] to None to avoid recursion */
1111 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1112 return NULL;
1113
1114 for (j = 0; j < nhooks; j++) {
1115 PyObject *hook = PyList_GetItem(path_hooks, j);
1116 if (hook == NULL)
1117 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001118 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Just van Rossum52e14d62002-12-30 22:08:05 +00001119 if (importer != NULL)
1120 break;
1121
1122 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1123 return NULL;
1124 }
1125 PyErr_Clear();
1126 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001127 if (importer == NULL) {
1128 importer = PyObject_CallFunctionObjArgs(
Christian Heimes9cd17752007-11-18 19:35:23 +00001129 (PyObject *)&PyNullImporter_Type, p, NULL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001130 );
1131 if (importer == NULL) {
1132 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
1133 PyErr_Clear();
1134 return Py_None;
1135 }
1136 }
1137 }
1138 if (importer != NULL) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001139 int err = PyDict_SetItem(path_importer_cache, p, importer);
1140 Py_DECREF(importer);
1141 if (err != 0)
1142 return NULL;
1143 }
1144 return importer;
1145}
1146
Christian Heimes9cd17752007-11-18 19:35:23 +00001147PyAPI_FUNC(PyObject *)
1148PyImport_GetImporter(PyObject *path) {
1149 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
1150
1151 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) {
1152 if ((path_hooks = PySys_GetObject("path_hooks"))) {
1153 importer = get_path_importer(path_importer_cache,
1154 path_hooks, path);
1155 }
1156 }
1157 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1158 return importer;
1159}
1160
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001161/* Search the path (default sys.path) for a module. Return the
1162 corresponding filedescr struct, and (via return arguments) the
1163 pathname and an open file. Return NULL if the module is not found. */
1164
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001165#ifdef MS_COREDLL
Thomas Woutersb4bd21c2000-07-22 23:38:01 +00001166extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001167 char *, Py_ssize_t);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001168#endif
1169
Martin v. Löwis18e16552006-02-15 17:27:45 +00001170static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001171static int find_init_module(char *); /* Forward */
Just van Rossum52e14d62002-12-30 22:08:05 +00001172static struct filedescr importhookdescr = {"", "", IMP_HOOK};
Guido van Rossum197346f1997-10-31 18:38:52 +00001173
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174static struct filedescr *
Just van Rossum52e14d62002-12-30 22:08:05 +00001175find_module(char *fullname, char *subname, PyObject *path, char *buf,
1176 size_t buflen, FILE **p_fp, PyObject **p_loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177{
Martin v. Löwis725507b2006-03-07 12:08:51 +00001178 Py_ssize_t i, npath;
Fred Drake4c82b232000-06-30 16:18:57 +00001179 size_t len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +00001180 struct filedescr *fdp = NULL;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001181 char *filemode;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001182 FILE *fp = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001183 PyObject *path_hooks, *path_importer_cache;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001184 struct stat statbuf;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001185 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
1186 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
1187 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
Guido van Rossum0506a431998-08-11 15:07:39 +00001188 char name[MAXPATHLEN+1];
Andrew MacIntyred9400542002-02-26 11:41:34 +00001189#if defined(PYOS_OS2)
1190 size_t saved_len;
1191 size_t saved_namelen;
1192 char *saved_buf = NULL;
1193#endif
Just van Rossum52e14d62002-12-30 22:08:05 +00001194 if (p_loader != NULL)
1195 *p_loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001196
Just van Rossum52e14d62002-12-30 22:08:05 +00001197 if (strlen(subname) > MAXPATHLEN) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001198 PyErr_SetString(PyExc_OverflowError,
1199 "module name is too long");
Fred Drake4c82b232000-06-30 16:18:57 +00001200 return NULL;
1201 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001202 strcpy(name, subname);
1203
1204 /* sys.meta_path import hook */
1205 if (p_loader != NULL) {
1206 PyObject *meta_path;
1207
1208 meta_path = PySys_GetObject("meta_path");
1209 if (meta_path == NULL || !PyList_Check(meta_path)) {
1210 PyErr_SetString(PyExc_ImportError,
1211 "sys.meta_path must be a list of "
1212 "import hooks");
1213 return NULL;
1214 }
1215 Py_INCREF(meta_path); /* zap guard */
1216 npath = PyList_Size(meta_path);
1217 for (i = 0; i < npath; i++) {
1218 PyObject *loader;
1219 PyObject *hook = PyList_GetItem(meta_path, i);
1220 loader = PyObject_CallMethod(hook, "find_module",
1221 "sO", fullname,
1222 path != NULL ?
1223 path : Py_None);
1224 if (loader == NULL) {
1225 Py_DECREF(meta_path);
1226 return NULL; /* true error */
1227 }
1228 if (loader != Py_None) {
1229 /* a loader was found */
1230 *p_loader = loader;
1231 Py_DECREF(meta_path);
1232 return &importhookdescr;
1233 }
1234 Py_DECREF(loader);
1235 }
1236 Py_DECREF(meta_path);
1237 }
Guido van Rossum0506a431998-08-11 15:07:39 +00001238
Guido van Rossum13d77992007-07-23 03:16:50 +00001239 if (path != NULL && PyUnicode_Check(path)) {
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001240 /* The only type of submodule allowed inside a "frozen"
1241 package are other frozen modules or packages. */
Guido van Rossum13d77992007-07-23 03:16:50 +00001242 char *p = PyUnicode_AsString(path);
1243 if (strlen(p) + 1 + strlen(name) >= (size_t)buflen) {
Guido van Rossum0506a431998-08-11 15:07:39 +00001244 PyErr_SetString(PyExc_ImportError,
1245 "full frozen module name too long");
1246 return NULL;
1247 }
Guido van Rossum13d77992007-07-23 03:16:50 +00001248 strcpy(buf, p);
Guido van Rossum0506a431998-08-11 15:07:39 +00001249 strcat(buf, ".");
1250 strcat(buf, name);
1251 strcpy(name, buf);
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001252 if (find_frozen(name) != NULL) {
1253 strcpy(buf, name);
1254 return &fd_frozen;
1255 }
1256 PyErr_Format(PyExc_ImportError,
1257 "No frozen submodule named %.200s", name);
1258 return NULL;
Guido van Rossum0506a431998-08-11 15:07:39 +00001259 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001260 if (path == NULL) {
1261 if (is_builtin(name)) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001262 strcpy(buf, name);
1263 return &fd_builtin;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001264 }
Greg Ward201baee2001-10-04 14:52:06 +00001265 if ((find_frozen(name)) != NULL) {
Guido van Rossuma5568d31998-03-05 03:45:08 +00001266 strcpy(buf, name);
1267 return &fd_frozen;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001268 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001269
Guido van Rossumac279101996-08-22 23:10:58 +00001270#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001271 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
1272 if (fp != NULL) {
1273 *p_fp = fp;
1274 return fdp;
1275 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +00001276#endif
Guido van Rossuma5568d31998-03-05 03:45:08 +00001277 path = PySys_GetObject("path");
1278 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 if (path == NULL || !PyList_Check(path)) {
1280 PyErr_SetString(PyExc_ImportError,
Guido van Rossuma5568d31998-03-05 03:45:08 +00001281 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282 return NULL;
1283 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001284
1285 path_hooks = PySys_GetObject("path_hooks");
1286 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
1287 PyErr_SetString(PyExc_ImportError,
1288 "sys.path_hooks must be a list of "
1289 "import hooks");
1290 return NULL;
1291 }
1292 path_importer_cache = PySys_GetObject("path_importer_cache");
1293 if (path_importer_cache == NULL ||
1294 !PyDict_Check(path_importer_cache)) {
1295 PyErr_SetString(PyExc_ImportError,
1296 "sys.path_importer_cache must be a dict");
1297 return NULL;
1298 }
1299
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001301 namelen = strlen(name);
1302 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 PyObject *v = PyList_GetItem(path, i);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001304 PyObject *origv = v;
Guido van Rossum6262cc72007-05-09 23:29:27 +00001305 const char *base;
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001306 Py_ssize_t size;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001307 if (!v)
1308 return NULL;
Guido van Rossuma4b8d1d2007-08-27 15:02:28 +00001309 if (PyUnicode_Check(v)) {
1310 v = _PyUnicode_AsDefaultEncodedString(v, NULL);
1311 if (v == NULL)
1312 return NULL;
1313 }
1314 if (!PyString_Check(v))
1315 continue;
1316 base = PyString_AS_STRING(v);
1317 size = PyString_GET_SIZE(v);
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001318 len = size;
Walter Dörwald3430d702002-06-17 10:43:59 +00001319 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 continue; /* Too long */
Walter Dörwald3430d702002-06-17 10:43:59 +00001321 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001322 strcpy(buf, base);
Walter Dörwald3430d702002-06-17 10:43:59 +00001323 if (strlen(buf) != len) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001324 continue; /* v contains '\0' */
Walter Dörwald3430d702002-06-17 10:43:59 +00001325 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001326
1327 /* sys.path_hooks import hook */
1328 if (p_loader != NULL) {
1329 PyObject *importer;
1330
1331 importer = get_path_importer(path_importer_cache,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001332 path_hooks, origv);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001333 if (importer == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001334 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001336 /* Note: importer is a borrowed reference */
1337 if (importer != Py_None) {
Just van Rossum52e14d62002-12-30 22:08:05 +00001338 PyObject *loader;
1339 loader = PyObject_CallMethod(importer,
1340 "find_module",
1341 "s", fullname);
1342 if (loader == NULL)
1343 return NULL; /* error */
1344 if (loader != Py_None) {
1345 /* a loader was found */
1346 *p_loader = loader;
1347 return &importhookdescr;
1348 }
1349 Py_DECREF(loader);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001350 continue;
Just van Rossum52e14d62002-12-30 22:08:05 +00001351 }
Just van Rossum52e14d62002-12-30 22:08:05 +00001352 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353 /* no hook was found, use builtin import */
Just van Rossum52e14d62002-12-30 22:08:05 +00001354
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001355 if (len > 0 && buf[len-1] != SEP
1356#ifdef ALTSEP
1357 && buf[len-1] != ALTSEP
1358#endif
1359 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360 buf[len++] = SEP;
Guido van Rossum215c3402000-11-13 17:26:32 +00001361 strcpy(buf+len, name);
1362 len += namelen;
Tim Peters50d8d372001-02-28 05:34:27 +00001363
1364 /* Check for package import (buf holds a directory name,
1365 and there's an __init__ module in that directory */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001366#ifdef HAVE_STAT
Walter Dörwald3430d702002-06-17 10:43:59 +00001367 if (stat(buf, &statbuf) == 0 && /* it exists */
1368 S_ISDIR(statbuf.st_mode) && /* it's a directory */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001369 case_ok(buf, len, namelen, name)) { /* case matches */
1370 if (find_init_module(buf)) { /* and has __init__.py */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001371 return &fd_package;
1372 }
1373 else {
1374 char warnstr[MAXPATHLEN+80];
1375 sprintf(warnstr, "Not importing directory "
1376 "'%.*s': missing __init__.py",
1377 MAXPATHLEN, buf);
Skip Montanaro46fc3372007-08-12 11:44:53 +00001378 if (PyErr_WarnEx(PyExc_ImportWarning,
1379 warnstr, 1)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 return NULL;
1381 }
1382 }
Walter Dörwald3430d702002-06-17 10:43:59 +00001383 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001384#endif
Andrew MacIntyred9400542002-02-26 11:41:34 +00001385#if defined(PYOS_OS2)
1386 /* take a snapshot of the module spec for restoration
1387 * after the 8 character DLL hackery
1388 */
1389 saved_buf = strdup(buf);
1390 saved_len = len;
1391 saved_namelen = namelen;
1392#endif /* PYOS_OS2 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum04110fb2007-08-24 16:32:05 +00001394#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001395 /* OS/2 limits DLLs to 8 character names (w/o
1396 extension)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001397 * so if the name is longer than that and its a
1398 * dynamically loaded module we're going to try,
1399 * truncate the name before trying
1400 */
Just van Rossum52e14d62002-12-30 22:08:05 +00001401 if (strlen(subname) > 8) {
Andrew MacIntyred9400542002-02-26 11:41:34 +00001402 /* is this an attempt to load a C extension? */
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001403 const struct filedescr *scan;
1404 scan = _PyImport_DynLoadFiletab;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001405 while (scan->suffix != NULL) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001406 if (!strcmp(scan->suffix, fdp->suffix))
Andrew MacIntyred9400542002-02-26 11:41:34 +00001407 break;
1408 else
1409 scan++;
1410 }
1411 if (scan->suffix != NULL) {
1412 /* yes, so truncate the name */
1413 namelen = 8;
Just van Rossum52e14d62002-12-30 22:08:05 +00001414 len -= strlen(subname) - namelen;
Andrew MacIntyred9400542002-02-26 11:41:34 +00001415 buf[len] = '\0';
1416 }
1417 }
1418#endif /* PYOS_OS2 */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001421 PySys_WriteStderr("# trying %s\n", buf);
Jack Jansenc88da1f2002-05-28 10:58:19 +00001422 filemode = fdp->mode;
Tim Peters86c7d2f2004-08-01 23:24:21 +00001423 if (filemode[0] == 'U')
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00001424 filemode = "r" PY_STDIOTEXTMODE;
Jack Jansenc88da1f2002-05-28 10:58:19 +00001425 fp = fopen(buf, filemode);
Tim Peters50d8d372001-02-28 05:34:27 +00001426 if (fp != NULL) {
1427 if (case_ok(buf, len, namelen, name))
1428 break;
1429 else { /* continue search */
1430 fclose(fp);
1431 fp = NULL;
Barry Warsaw914a0b12001-02-02 19:12:16 +00001432 }
Barry Warsaw914a0b12001-02-02 19:12:16 +00001433 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001434#if defined(PYOS_OS2)
1435 /* restore the saved snapshot */
1436 strcpy(buf, saved_buf);
1437 len = saved_len;
1438 namelen = saved_namelen;
1439#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001440 }
Andrew MacIntyred9400542002-02-26 11:41:34 +00001441#if defined(PYOS_OS2)
1442 /* don't need/want the module name snapshot anymore */
1443 if (saved_buf)
1444 {
1445 free(saved_buf);
1446 saved_buf = NULL;
1447 }
1448#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001449 if (fp != NULL)
1450 break;
1451 }
1452 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001453 PyErr_Format(PyExc_ImportError,
1454 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455 return NULL;
1456 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001457 *p_fp = fp;
1458 return fdp;
1459}
1460
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001461/* Helpers for main.c
1462 * Find the source file corresponding to a named module
1463 */
1464struct filedescr *
1465_PyImport_FindModule(const char *name, PyObject *path, char *buf,
1466 size_t buflen, FILE **p_fp, PyObject **p_loader)
1467{
1468 return find_module((char *) name, (char *) name, path,
1469 buf, buflen, p_fp, p_loader);
1470}
1471
1472PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd)
1473{
1474 return fd->type == PY_SOURCE || fd->type == PY_COMPILED;
1475}
1476
Martin v. Löwis18e16552006-02-15 17:27:45 +00001477/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
Tim Petersd1e87a82001-03-01 18:12:00 +00001478 * The arguments here are tricky, best shown by example:
1479 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1480 * ^ ^ ^ ^
1481 * |--------------------- buf ---------------------|
1482 * |------------------- len ------------------|
1483 * |------ name -------|
1484 * |----- namelen -----|
1485 * buf is the full path, but len only counts up to (& exclusive of) the
1486 * extension. name is the module name, also exclusive of extension.
1487 *
1488 * We've already done a successful stat() or fopen() on buf, so know that
1489 * there's some match, possibly case-insensitive.
1490 *
Tim Peters50d8d372001-02-28 05:34:27 +00001491 * case_ok() is to return 1 if there's a case-sensitive match for
1492 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
1493 * exists.
Tim Petersd1e87a82001-03-01 18:12:00 +00001494 *
Tim Peters50d8d372001-02-28 05:34:27 +00001495 * case_ok() is used to implement case-sensitive import semantics even
1496 * on platforms with case-insensitive filesystems. It's trivial to implement
1497 * for case-sensitive filesystems. It's pretty much a cross-platform
1498 * nightmare for systems with case-insensitive filesystems.
1499 */
Guido van Rossum0980bd91998-02-13 17:18:36 +00001500
Tim Peters50d8d372001-02-28 05:34:27 +00001501/* First we may need a pile of platform-specific header files; the sequence
1502 * of #if's here should match the sequence in the body of case_ok().
1503 */
Jason Tishler7961aa62005-05-20 00:56:54 +00001504#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001505#include <windows.h>
Guido van Rossum4c3f57c2001-01-10 20:40:46 +00001506
Tim Peters50d8d372001-02-28 05:34:27 +00001507#elif defined(DJGPP)
1508#include <dir.h>
1509
Jason Tishler7961aa62005-05-20 00:56:54 +00001510#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001511#include <sys/types.h>
1512#include <dirent.h>
1513
Andrew MacIntyred9400542002-02-26 11:41:34 +00001514#elif defined(PYOS_OS2)
1515#define INCL_DOS
1516#define INCL_DOSERRORS
1517#define INCL_NOPMAPI
1518#include <os2.h>
Tim Peters50d8d372001-02-28 05:34:27 +00001519#endif
1520
Guido van Rossum0980bd91998-02-13 17:18:36 +00001521static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001522case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001523{
Tim Peters50d8d372001-02-28 05:34:27 +00001524/* Pick a platform-specific implementation; the sequence of #if's here should
1525 * match the sequence just above.
1526 */
1527
Jason Tishler7961aa62005-05-20 00:56:54 +00001528/* MS_WINDOWS */
1529#if defined(MS_WINDOWS)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001530 WIN32_FIND_DATA data;
1531 HANDLE h;
Tim Peters50d8d372001-02-28 05:34:27 +00001532
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001533 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum0980bd91998-02-13 17:18:36 +00001534 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001535
Guido van Rossum0980bd91998-02-13 17:18:36 +00001536 h = FindFirstFile(buf, &data);
1537 if (h == INVALID_HANDLE_VALUE) {
1538 PyErr_Format(PyExc_NameError,
1539 "Can't find file for module %.100s\n(filename %.300s)",
1540 name, buf);
1541 return 0;
1542 }
1543 FindClose(h);
Tim Peters50d8d372001-02-28 05:34:27 +00001544 return strncmp(data.cFileName, name, namelen) == 0;
1545
1546/* DJGPP */
1547#elif defined(DJGPP)
1548 struct ffblk ffblk;
1549 int done;
1550
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001551 if (Py_GETENV("PYTHONCASEOK") != NULL)
Guido van Rossum323bf5e1998-06-24 03:54:06 +00001552 return 1;
Tim Peters50d8d372001-02-28 05:34:27 +00001553
1554 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
1555 if (done) {
Guido van Rossum0980bd91998-02-13 17:18:36 +00001556 PyErr_Format(PyExc_NameError,
Tim Peters50d8d372001-02-28 05:34:27 +00001557 "Can't find file for module %.100s\n(filename %.300s)",
Guido van Rossum0980bd91998-02-13 17:18:36 +00001558 name, buf);
1559 return 0;
1560 }
Tim Peters50d8d372001-02-28 05:34:27 +00001561 return strncmp(ffblk.ff_name, name, namelen) == 0;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001562
Jason Tishler7961aa62005-05-20 00:56:54 +00001563/* new-fangled macintosh (macosx) or Cygwin */
1564#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
Tim Peters430f5d42001-03-01 01:30:56 +00001565 DIR *dirp;
1566 struct dirent *dp;
Tim Petersd1e87a82001-03-01 18:12:00 +00001567 char dirname[MAXPATHLEN + 1];
1568 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
Tim Peters430f5d42001-03-01 01:30:56 +00001569
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +00001570 if (Py_GETENV("PYTHONCASEOK") != NULL)
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001571 return 1;
1572
Tim Petersd1e87a82001-03-01 18:12:00 +00001573 /* Copy the dir component into dirname; substitute "." if empty */
1574 if (dirlen <= 0) {
1575 dirname[0] = '.';
1576 dirname[1] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001577 }
1578 else {
Tim Petersd1e87a82001-03-01 18:12:00 +00001579 assert(dirlen <= MAXPATHLEN);
1580 memcpy(dirname, buf, dirlen);
1581 dirname[dirlen] = '\0';
Tim Peters430f5d42001-03-01 01:30:56 +00001582 }
1583 /* Open the directory and search the entries for an exact match. */
Tim Petersd1e87a82001-03-01 18:12:00 +00001584 dirp = opendir(dirname);
Tim Peters430f5d42001-03-01 01:30:56 +00001585 if (dirp) {
Tim Peters677898a2001-03-02 03:28:03 +00001586 char *nameWithExt = buf + len - namelen;
Tim Peters430f5d42001-03-01 01:30:56 +00001587 while ((dp = readdir(dirp)) != NULL) {
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001588 const int thislen =
Tim Peters430f5d42001-03-01 01:30:56 +00001589#ifdef _DIRENT_HAVE_D_NAMELEN
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001590 dp->d_namlen;
Tim Peters430f5d42001-03-01 01:30:56 +00001591#else
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001592 strlen(dp->d_name);
Tim Peters430f5d42001-03-01 01:30:56 +00001593#endif
Tim Petersd1e87a82001-03-01 18:12:00 +00001594 if (thislen >= namelen &&
Tim Peters677898a2001-03-02 03:28:03 +00001595 strcmp(dp->d_name, nameWithExt) == 0) {
Tim Peters430f5d42001-03-01 01:30:56 +00001596 (void)closedir(dirp);
1597 return 1; /* Found */
1598 }
1599 }
Tim Petersdbe6ebb2001-03-01 08:47:29 +00001600 (void)closedir(dirp);
Tim Peters430f5d42001-03-01 01:30:56 +00001601 }
Tim Peters430f5d42001-03-01 01:30:56 +00001602 return 0 ; /* Not found */
Tim Peters430f5d42001-03-01 01:30:56 +00001603
Andrew MacIntyred9400542002-02-26 11:41:34 +00001604/* OS/2 */
1605#elif defined(PYOS_OS2)
1606 HDIR hdir = 1;
1607 ULONG srchcnt = 1;
1608 FILEFINDBUF3 ffbuf;
1609 APIRET rc;
1610
Christian Heimes790c8232008-01-07 21:14:23 +00001611 if (Py_GETENV("PYTHONCASEOK") != NULL)
Andrew MacIntyred9400542002-02-26 11:41:34 +00001612 return 1;
1613
1614 rc = DosFindFirst(buf,
1615 &hdir,
1616 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
1617 &ffbuf, sizeof(ffbuf),
1618 &srchcnt,
1619 FIL_STANDARD);
1620 if (rc != NO_ERROR)
1621 return 0;
1622 return strncmp(ffbuf.achName, name, namelen) == 0;
1623
Tim Peters50d8d372001-02-28 05:34:27 +00001624/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
1625#else
Guido van Rossum0980bd91998-02-13 17:18:36 +00001626 return 1;
Guido van Rossum0980bd91998-02-13 17:18:36 +00001627
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001628#endif
Tim Peters50d8d372001-02-28 05:34:27 +00001629}
Guido van Rossum4d1b3b91998-02-13 23:27:59 +00001630
Guido van Rossum0980bd91998-02-13 17:18:36 +00001631
Guido van Rossum197346f1997-10-31 18:38:52 +00001632#ifdef HAVE_STAT
1633/* Helper to look for __init__.py or __init__.py[co] in potential package */
1634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635find_init_module(char *buf)
Guido van Rossum197346f1997-10-31 18:38:52 +00001636{
Tim Peters0f9431f2001-07-05 03:47:53 +00001637 const size_t save_len = strlen(buf);
Fred Drake4c82b232000-06-30 16:18:57 +00001638 size_t i = save_len;
Tim Peters0f9431f2001-07-05 03:47:53 +00001639 char *pname; /* pointer to start of __init__ */
Guido van Rossum197346f1997-10-31 18:38:52 +00001640 struct stat statbuf;
1641
Tim Peters0f9431f2001-07-05 03:47:53 +00001642/* For calling case_ok(buf, len, namelen, name):
1643 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
1644 * ^ ^ ^ ^
1645 * |--------------------- buf ---------------------|
1646 * |------------------- len ------------------|
1647 * |------ name -------|
1648 * |----- namelen -----|
1649 */
Guido van Rossum197346f1997-10-31 18:38:52 +00001650 if (save_len + 13 >= MAXPATHLEN)
1651 return 0;
1652 buf[i++] = SEP;
Tim Peters0f9431f2001-07-05 03:47:53 +00001653 pname = buf + i;
1654 strcpy(pname, "__init__.py");
Guido van Rossum197346f1997-10-31 18:38:52 +00001655 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001656 if (case_ok(buf,
1657 save_len + 9, /* len("/__init__") */
1658 8, /* len("__init__") */
1659 pname)) {
1660 buf[save_len] = '\0';
1661 return 1;
1662 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001663 }
Tim Peters0f9431f2001-07-05 03:47:53 +00001664 i += strlen(pname);
1665 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum197346f1997-10-31 18:38:52 +00001666 if (stat(buf, &statbuf) == 0) {
Tim Peters0f9431f2001-07-05 03:47:53 +00001667 if (case_ok(buf,
1668 save_len + 9, /* len("/__init__") */
1669 8, /* len("__init__") */
1670 pname)) {
1671 buf[save_len] = '\0';
1672 return 1;
1673 }
Guido van Rossum197346f1997-10-31 18:38:52 +00001674 }
1675 buf[save_len] = '\0';
1676 return 0;
1677}
Guido van Rossum48a680c2001-03-02 06:34:14 +00001678
Guido van Rossum197346f1997-10-31 18:38:52 +00001679#endif /* HAVE_STAT */
1680
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681
Tim Petersdbd9ba62000-07-09 03:09:57 +00001682static int init_builtin(char *); /* Forward */
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001683
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001684/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001685 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001686
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687static PyObject *
Just van Rossum52e14d62002-12-30 22:08:05 +00001688load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001690 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001692 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001693
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001694 /* First check that there's an open file (if we need one) */
1695 switch (type) {
1696 case PY_SOURCE:
1697 case PY_COMPILED:
1698 if (fp == NULL) {
1699 PyErr_Format(PyExc_ValueError,
1700 "file object required for import (type code %d)",
1701 type);
1702 return NULL;
1703 }
1704 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001705
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001706 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001707
1708 case PY_SOURCE:
1709 m = load_source_module(name, buf, fp);
1710 break;
1711
1712 case PY_COMPILED:
1713 m = load_compiled_module(name, buf, fp);
1714 break;
1715
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001716#ifdef HAVE_DYNAMIC_LOADING
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001719 break;
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001720#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001722 case PKG_DIRECTORY:
1723 m = load_package(name, buf);
1724 break;
1725
1726 case C_BUILTIN:
1727 case PY_FROZEN:
Guido van Rossuma5568d31998-03-05 03:45:08 +00001728 if (buf != NULL && buf[0] != '\0')
1729 name = buf;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001730 if (type == C_BUILTIN)
1731 err = init_builtin(name);
1732 else
1733 err = PyImport_ImportFrozenModule(name);
1734 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001735 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001736 if (err == 0) {
1737 PyErr_Format(PyExc_ImportError,
1738 "Purported %s module %.200s not found",
1739 type == C_BUILTIN ?
1740 "builtin" : "frozen",
1741 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001742 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001743 }
1744 modules = PyImport_GetModuleDict();
1745 m = PyDict_GetItemString(modules, name);
1746 if (m == NULL) {
1747 PyErr_Format(
1748 PyExc_ImportError,
1749 "%s module %.200s not properly initialized",
1750 type == C_BUILTIN ?
1751 "builtin" : "frozen",
1752 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001753 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001754 }
1755 Py_INCREF(m);
1756 break;
1757
Just van Rossum52e14d62002-12-30 22:08:05 +00001758 case IMP_HOOK: {
1759 if (loader == NULL) {
1760 PyErr_SetString(PyExc_ImportError,
1761 "import hook without loader");
1762 return NULL;
1763 }
1764 m = PyObject_CallMethod(loader, "load_module", "s", name);
1765 break;
1766 }
1767
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001769 PyErr_Format(PyExc_ImportError,
1770 "Don't know how to import %.200s (type code %d)",
1771 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001772 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001773
1774 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775
1776 return m;
1777}
1778
1779
1780/* Initialize a built-in module.
Thomas Wouters89f507f2006-12-13 04:49:30 +00001781 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001782 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001783
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001784static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001785init_builtin(char *name)
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001786{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001787 struct _inittab *p;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001788
Greg Ward201baee2001-10-04 14:52:06 +00001789 if (_PyImport_FindExtension(name, name) != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001790 return 1;
1791
Guido van Rossum771c6c81997-10-31 18:37:24 +00001792 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +00001793 if (strcmp(name, p->name) == 0) {
1794 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001795 PyErr_Format(PyExc_ImportError,
1796 "Cannot re-init internal module %.200s",
1797 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001798 return -1;
1799 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001801 PySys_WriteStderr("import %s # builtin\n", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001802 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001805 if (_PyImport_FixupExtension(name, name) == NULL)
1806 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001807 return 1;
1808 }
1809 }
1810 return 0;
1811}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001812
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001814/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001816static struct _frozen *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001817find_frozen(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001818{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001819 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001820
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001822 if (p->name == NULL)
1823 return NULL;
1824 if (strcmp(p->name, name) == 0)
1825 break;
1826 }
1827 return p;
1828}
1829
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001831get_frozen_object(char *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001832{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001833 struct _frozen *p = find_frozen(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001834 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001835
1836 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001837 PyErr_Format(PyExc_ImportError,
1838 "No such frozen object named %.200s",
1839 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001840 return NULL;
1841 }
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001842 if (p->code == NULL) {
1843 PyErr_Format(PyExc_ImportError,
1844 "Excluded frozen object named %.200s",
1845 name);
1846 return NULL;
1847 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001848 size = p->size;
1849 if (size < 0)
1850 size = -size;
1851 return PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001852}
1853
1854/* Initialize a frozen module.
1855 Return 1 for succes, 0 if the module is not found, and -1 with
1856 an exception set if the initialization failed.
1857 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001858
1859int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001860PyImport_ImportFrozenModule(char *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001861{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001862 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 PyObject *co;
1864 PyObject *m;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001865 int ispackage;
1866 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001867
1868 if (p == NULL)
1869 return 0;
Guido van Rossum8f4d3312001-10-18 18:54:11 +00001870 if (p->code == NULL) {
1871 PyErr_Format(PyExc_ImportError,
1872 "Excluded frozen object named %.200s",
1873 name);
1874 return -1;
1875 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001876 size = p->size;
1877 ispackage = (size < 0);
1878 if (ispackage)
1879 size = -size;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 if (Py_VerboseFlag)
Guido van Rossum2f3667a1998-10-12 18:23:55 +00001881 PySys_WriteStderr("import %s # frozen%s\n",
Guido van Rossuma5568d31998-03-05 03:45:08 +00001882 name, ispackage ? " package" : "");
1883 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001884 if (co == NULL)
1885 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001886 if (!PyCode_Check(co)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001887 PyErr_Format(PyExc_TypeError,
1888 "frozen object %.200s is not a code object",
1889 name);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001890 goto err_return;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001891 }
Guido van Rossuma5568d31998-03-05 03:45:08 +00001892 if (ispackage) {
1893 /* Set __path__ to the package name */
1894 PyObject *d, *s;
1895 int err;
1896 m = PyImport_AddModule(name);
1897 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001898 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001899 d = PyModule_GetDict(m);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001900 s = PyUnicode_InternFromString(name);
Guido van Rossuma5568d31998-03-05 03:45:08 +00001901 if (s == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001902 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001903 err = PyDict_SetItemString(d, "__path__", s);
1904 Py_DECREF(s);
1905 if (err != 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001906 goto err_return;
Guido van Rossuma5568d31998-03-05 03:45:08 +00001907 }
Guido van Rossume32bf6e1998-02-11 05:53:02 +00001908 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001909 if (m == NULL)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001910 goto err_return;
1911 Py_DECREF(co);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001913 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001914err_return:
1915 Py_DECREF(co);
1916 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001917}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001918
1919
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001921 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001922
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001924PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001925{
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001926 PyObject *pname;
1927 PyObject *result;
1928
Martin v. Löwis5b222132007-06-10 09:51:05 +00001929 pname = PyUnicode_FromString(name);
Neal Norwitza11e4c12003-03-23 14:31:01 +00001930 if (pname == NULL)
1931 return NULL;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001932 result = PyImport_Import(pname);
1933 Py_DECREF(pname);
1934 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001935}
1936
Christian Heimes072c0f12008-01-03 23:01:04 +00001937/* Import a module without blocking
1938 *
1939 * At first it tries to fetch the module from sys.modules. If the module was
1940 * never loaded before it loads it with PyImport_ImportModule() unless another
1941 * thread holds the import lock. In the latter case the function raises an
1942 * ImportError instead of blocking.
1943 *
1944 * Returns the module object with incremented ref count.
1945 */
1946PyObject *
1947PyImport_ImportModuleNoBlock(const char *name)
1948{
1949 PyObject *result;
1950 PyObject *modules;
1951 long me;
1952
1953 /* Try to get the module from sys.modules[name] */
1954 modules = PyImport_GetModuleDict();
1955 if (modules == NULL)
1956 return NULL;
1957
1958 result = PyDict_GetItemString(modules, name);
1959 if (result != NULL) {
1960 Py_INCREF(result);
1961 return result;
1962 }
1963 else {
1964 PyErr_Clear();
1965 }
1966
1967 /* check the import lock
1968 * me might be -1 but I ignore the error here, the lock function
1969 * takes care of the problem */
1970 me = PyThread_get_thread_ident();
1971 if (import_lock_thread == -1 || import_lock_thread == me) {
1972 /* no thread or me is holding the lock */
1973 return PyImport_ImportModule(name);
1974 }
1975 else {
1976 PyErr_Format(PyExc_ImportError,
1977 "Failed to import %.200s because the import lock"
1978 "is held by another thread.",
1979 name);
1980 return NULL;
1981 }
1982}
1983
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001984/* Forward declarations for helper routines */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001985static PyObject *get_parent(PyObject *globals, char *buf,
1986 Py_ssize_t *p_buflen, int level);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001987static PyObject *load_next(PyObject *mod, PyObject *altmod,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001988 char **p_name, char *buf, Py_ssize_t *p_buflen);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001989static int mark_miss(char *name);
1990static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 char *buf, Py_ssize_t buflen, int recursive);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001992static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001993
1994/* The Magnum Opus of dotted-name import :-) */
1995
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001996static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001997import_module_level(char *name, PyObject *globals, PyObject *locals,
1998 PyObject *fromlist, int level)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001999{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002000 char buf[MAXPATHLEN+1];
Martin v. Löwis18e16552006-02-15 17:27:45 +00002001 Py_ssize_t buflen = 0;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002002 PyObject *parent, *head, *next, *tail;
2003
Christian Heimes454f37b2008-01-10 00:10:02 +00002004 if (strchr(name, '/') != NULL
2005#ifdef MS_WINDOWS
2006 || strchr(name, '\\') != NULL
2007#endif
2008 ) {
2009 PyErr_SetString(PyExc_ImportError,
2010 "Import by filename is not supported.");
2011 return NULL;
2012 }
2013
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002014 parent = get_parent(globals, buf, &buflen, level);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002015 if (parent == NULL)
2016 return NULL;
2017
2018 head = load_next(parent, Py_None, &name, buf, &buflen);
2019 if (head == NULL)
2020 return NULL;
2021
2022 tail = head;
2023 Py_INCREF(tail);
2024 while (name) {
2025 next = load_next(tail, tail, &name, buf, &buflen);
2026 Py_DECREF(tail);
2027 if (next == NULL) {
2028 Py_DECREF(head);
2029 return NULL;
2030 }
2031 tail = next;
2032 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002033 if (tail == Py_None) {
2034 /* If tail is Py_None, both get_parent and load_next found
2035 an empty module name: someone called __import__("") or
2036 doctored faulty bytecode */
2037 Py_DECREF(tail);
2038 Py_DECREF(head);
2039 PyErr_SetString(PyExc_ValueError,
2040 "Empty module name");
2041 return NULL;
2042 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002043
2044 if (fromlist != NULL) {
2045 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
2046 fromlist = NULL;
2047 }
2048
2049 if (fromlist == NULL) {
2050 Py_DECREF(tail);
2051 return head;
2052 }
2053
2054 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002055 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002056 Py_DECREF(tail);
2057 return NULL;
2058 }
2059
2060 return tail;
2061}
2062
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002063PyObject *
2064PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
2065 PyObject *fromlist, int level)
2066{
2067 PyObject *result;
2068 lock_import();
2069 result = import_module_level(name, globals, locals, fromlist, level);
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00002070 if (unlock_import() < 0) {
2071 Py_XDECREF(result);
2072 PyErr_SetString(PyExc_RuntimeError,
2073 "not holding the import lock");
2074 return NULL;
2075 }
Guido van Rossum75acc9c1998-03-03 22:26:50 +00002076 return result;
2077}
2078
Fred Drake87590902004-05-28 20:21:36 +00002079/* Return the package that an import is being performed in. If globals comes
2080 from the module foo.bar.bat (not itself a package), this returns the
2081 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002082 the package's entry in sys.modules is returned, as a borrowed reference.
Fred Drake87590902004-05-28 20:21:36 +00002083
2084 The *name* of the returned package is returned in buf, with the length of
2085 the name in *p_buflen.
2086
2087 If globals doesn't come from a package or a module in a package, or a
2088 corresponding entry is not found in sys.modules, Py_None is returned.
2089*/
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002090static PyObject *
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002091get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002092{
2093 static PyObject *namestr = NULL;
2094 static PyObject *pathstr = NULL;
Nick Coghlande10c852007-12-04 12:22:52 +00002095 static PyObject *pkgstr = NULL;
2096 PyObject *pkgname, *modname, *modpath, *modules, *parent;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002097
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002098 if (globals == NULL || !PyDict_Check(globals) || !level)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002099 return Py_None;
2100
2101 if (namestr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002102 namestr = PyUnicode_InternFromString("__name__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002103 if (namestr == NULL)
2104 return NULL;
2105 }
2106 if (pathstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002107 pathstr = PyUnicode_InternFromString("__path__");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002108 if (pathstr == NULL)
2109 return NULL;
2110 }
Nick Coghlande10c852007-12-04 12:22:52 +00002111 if (pkgstr == NULL) {
2112 pkgstr = PyUnicode_InternFromString("__package__");
2113 if (pkgstr == NULL)
2114 return NULL;
2115 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002116
2117 *buf = '\0';
2118 *p_buflen = 0;
Nick Coghlande10c852007-12-04 12:22:52 +00002119 pkgname = PyDict_GetItem(globals, pkgstr);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002120
Nick Coghlande10c852007-12-04 12:22:52 +00002121 if ((pkgname != NULL) && (pkgname != Py_None)) {
2122 /* __package__ is set, so use it */
2123 Py_ssize_t len;
2124 if (!PyUnicode_Check(pkgname)) {
2125 PyErr_SetString(PyExc_ValueError,
2126 "__package__ set to non-string");
2127 return NULL;
2128 }
2129 len = PyUnicode_GET_SIZE(pkgname);
2130 if (len == 0) {
2131 if (level > 0) {
2132 PyErr_SetString(PyExc_ValueError,
2133 "Attempted relative import in non-package");
2134 return NULL;
2135 }
2136 return Py_None;
2137 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002138 if (len > MAXPATHLEN) {
2139 PyErr_SetString(PyExc_ValueError,
Nick Coghlande10c852007-12-04 12:22:52 +00002140 "Package name too long");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002141 return NULL;
2142 }
Nick Coghlande10c852007-12-04 12:22:52 +00002143 strcpy(buf, PyUnicode_AsString(pkgname));
2144 } else {
2145 /* __package__ not set, so figure it out and set it */
2146 modname = PyDict_GetItem(globals, namestr);
2147 if (modname == NULL || !PyUnicode_Check(modname))
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002148 return Py_None;
Nick Coghlande10c852007-12-04 12:22:52 +00002149
2150 modpath = PyDict_GetItem(globals, pathstr);
2151 if (modpath != NULL) {
2152 /* __path__ is set, so modname is already the package name */
2153 Py_ssize_t len = PyUnicode_GET_SIZE(modname);
2154 int error;
2155 if (len > MAXPATHLEN) {
2156 PyErr_SetString(PyExc_ValueError,
2157 "Module name too long");
2158 return NULL;
2159 }
2160 strcpy(buf, PyUnicode_AsString(modname));
2161 error = PyDict_SetItem(globals, pkgstr, modname);
2162 if (error) {
2163 PyErr_SetString(PyExc_ValueError,
2164 "Could not set __package__");
2165 return NULL;
2166 }
2167 } else {
2168 /* Normal module, so work out the package name if any */
2169 char *start = PyUnicode_AsString(modname);
2170 char *lastdot = strrchr(start, '.');
2171 size_t len;
2172 int error;
2173 if (lastdot == NULL && level > 0) {
2174 PyErr_SetString(PyExc_ValueError,
2175 "Attempted relative import in non-package");
2176 return NULL;
2177 }
2178 if (lastdot == NULL) {
2179 error = PyDict_SetItem(globals, pkgstr, Py_None);
2180 if (error) {
2181 PyErr_SetString(PyExc_ValueError,
2182 "Could not set __package__");
2183 return NULL;
2184 }
2185 return Py_None;
2186 }
2187 len = lastdot - start;
2188 if (len >= MAXPATHLEN) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "Module name too long");
2191 return NULL;
2192 }
2193 strncpy(buf, start, len);
2194 buf[len] = '\0';
2195 pkgname = PyUnicode_FromString(buf);
2196 if (pkgname == NULL) {
2197 return NULL;
2198 }
2199 error = PyDict_SetItem(globals, pkgstr, pkgname);
2200 Py_DECREF(pkgname);
2201 if (error) {
2202 PyErr_SetString(PyExc_ValueError,
2203 "Could not set __package__");
2204 return NULL;
2205 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002206 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002207 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002208 while (--level > 0) {
2209 char *dot = strrchr(buf, '.');
2210 if (dot == NULL) {
2211 PyErr_SetString(PyExc_ValueError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002212 "Attempted relative import beyond "
2213 "toplevel package");
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002214 return NULL;
2215 }
2216 *dot = '\0';
2217 }
2218 *p_buflen = strlen(buf);
2219
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002220 modules = PyImport_GetModuleDict();
2221 parent = PyDict_GetItemString(modules, buf);
2222 if (parent == NULL)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002223 PyErr_Format(PyExc_SystemError,
2224 "Parent module '%.200s' not loaded", buf);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002225 return parent;
2226 /* We expect, but can't guarantee, if parent != None, that:
2227 - parent.__name__ == buf
2228 - parent.__dict__ is globals
2229 If this is violated... Who cares? */
2230}
2231
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232/* altmod is either None or same as mod */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002233static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
Martin v. Löwis18e16552006-02-15 17:27:45 +00002235 Py_ssize_t *p_buflen)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002236{
2237 char *name = *p_name;
2238 char *dot = strchr(name, '.');
Fred Drake4c82b232000-06-30 16:18:57 +00002239 size_t len;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002240 char *p;
2241 PyObject *result;
2242
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002243 if (strlen(name) == 0) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002244 /* completely empty module name should only happen in
2245 'from . import' (or '__import__("")')*/
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002246 Py_INCREF(mod);
2247 *p_name = NULL;
2248 return mod;
2249 }
2250
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002251 if (dot == NULL) {
2252 *p_name = NULL;
2253 len = strlen(name);
2254 }
2255 else {
2256 *p_name = dot+1;
2257 len = dot-name;
2258 }
Guido van Rossum111c20b1998-04-11 17:38:22 +00002259 if (len == 0) {
2260 PyErr_SetString(PyExc_ValueError,
2261 "Empty module name");
2262 return NULL;
2263 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002264
2265 p = buf + *p_buflen;
2266 if (p != buf)
2267 *p++ = '.';
2268 if (p+len-buf >= MAXPATHLEN) {
2269 PyErr_SetString(PyExc_ValueError,
2270 "Module name too long");
2271 return NULL;
2272 }
2273 strncpy(p, name, len);
2274 p[len] = '\0';
2275 *p_buflen = p+len-buf;
2276
2277 result = import_submodule(mod, p, buf);
2278 if (result == Py_None && altmod != mod) {
2279 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002280 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00002281 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002282 if (result != NULL && result != Py_None) {
2283 if (mark_miss(buf) != 0) {
2284 Py_DECREF(result);
2285 return NULL;
2286 }
2287 strncpy(buf, name, len);
2288 buf[len] = '\0';
2289 *p_buflen = len;
2290 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002291 }
2292 if (result == NULL)
2293 return NULL;
2294
2295 if (result == Py_None) {
2296 Py_DECREF(result);
2297 PyErr_Format(PyExc_ImportError,
2298 "No module named %.200s", name);
2299 return NULL;
2300 }
2301
2302 return result;
2303}
2304
2305static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002306mark_miss(char *name)
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00002307{
2308 PyObject *modules = PyImport_GetModuleDict();
2309 return PyDict_SetItemString(modules, name, Py_None);
2310}
2311
2312static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002313ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002314 int recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002315{
2316 int i;
2317
2318 if (!PyObject_HasAttrString(mod, "__path__"))
2319 return 1;
2320
2321 for (i = 0; ; i++) {
2322 PyObject *item = PySequence_GetItem(fromlist, i);
2323 int hasit;
2324 if (item == NULL) {
2325 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2326 PyErr_Clear();
2327 return 1;
2328 }
2329 return 0;
2330 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002331 if (!PyUnicode_Check(item)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002332 PyErr_SetString(PyExc_TypeError,
Neal Norwitz80e7f272007-08-26 06:45:23 +00002333 "Item in ``from list'' not a string");
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002334 Py_DECREF(item);
2335 return 0;
2336 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002337 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00002338 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002339 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002340 /* See if the package defines __all__ */
2341 if (recursive)
2342 continue; /* Avoid endless recursion */
2343 all = PyObject_GetAttrString(mod, "__all__");
2344 if (all == NULL)
2345 PyErr_Clear();
2346 else {
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002347 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
Guido van Rossum9905ef91997-09-08 16:07:11 +00002348 Py_DECREF(all);
Martin v. Löwis83969ee2004-03-23 16:28:13 +00002349 if (!ret)
2350 return 0;
Guido van Rossum9905ef91997-09-08 16:07:11 +00002351 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002352 continue;
2353 }
2354 hasit = PyObject_HasAttr(mod, item);
2355 if (!hasit) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002356 PyObject *item8;
2357 char *subname;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002358 PyObject *submod;
2359 char *p;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002360 if (!Py_FileSystemDefaultEncoding) {
2361 item8 = PyUnicode_EncodeASCII(PyUnicode_AsUnicode(item),
2362 PyUnicode_GetSize(item),
Martin v. Löwis427dbff2007-06-12 05:53:00 +00002363 NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002364 } else {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002365 item8 = PyUnicode_AsEncodedString(item,
2366 Py_FileSystemDefaultEncoding, NULL);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002367 }
2368 if (!item8) {
2369 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
2370 return 0;
2371 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002372 subname = PyString_AS_STRING(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002373 if (buflen + strlen(subname) >= MAXPATHLEN) {
2374 PyErr_SetString(PyExc_ValueError,
2375 "Module name too long");
2376 Py_DECREF(item);
2377 return 0;
2378 }
2379 p = buf + buflen;
2380 *p++ = '.';
2381 strcpy(p, subname);
2382 submod = import_submodule(mod, subname, buf);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002383 Py_DECREF(item8);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002384 Py_XDECREF(submod);
2385 if (submod == NULL) {
2386 Py_DECREF(item);
2387 return 0;
2388 }
2389 }
2390 Py_DECREF(item);
2391 }
2392
Guido van Rossuma7f2e811997-10-03 15:33:32 +00002393 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002394}
2395
Neil Schemenauer00b09662003-06-16 21:03:07 +00002396static int
2397add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
2398 PyObject *modules)
2399{
2400 if (mod == Py_None)
2401 return 1;
2402 /* Irrespective of the success of this load, make a
2403 reference to it in the parent package module. A copy gets
2404 saved in the modules dictionary under the full name, so get a
2405 reference from there, if need be. (The exception is when the
2406 load failed with a SyntaxError -- then there's no trace in
2407 sys.modules. In that case, of course, do nothing extra.) */
2408 if (submod == NULL) {
2409 submod = PyDict_GetItemString(modules, fullname);
2410 if (submod == NULL)
2411 return 1;
2412 }
2413 if (PyModule_Check(mod)) {
2414 /* We can't use setattr here since it can give a
2415 * spurious warning if the submodule name shadows a
2416 * builtin name */
2417 PyObject *dict = PyModule_GetDict(mod);
2418 if (!dict)
2419 return 0;
2420 if (PyDict_SetItemString(dict, subname, submod) < 0)
2421 return 0;
2422 }
2423 else {
2424 if (PyObject_SetAttrString(mod, subname, submod) < 0)
2425 return 0;
2426 }
2427 return 1;
2428}
2429
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002430static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002431import_submodule(PyObject *mod, char *subname, char *fullname)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002432{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002433 PyObject *modules = PyImport_GetModuleDict();
Neil Schemenauer00b09662003-06-16 21:03:07 +00002434 PyObject *m = NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002435
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002436 /* Require:
2437 if mod == None: subname == fullname
2438 else: mod.__name__ + "." + subname == fullname
2439 */
2440
Tim Peters50d8d372001-02-28 05:34:27 +00002441 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00002443 }
2444 else {
Just van Rossum52e14d62002-12-30 22:08:05 +00002445 PyObject *path, *loader = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002446 char buf[MAXPATHLEN+1];
2447 struct filedescr *fdp;
2448 FILE *fp = NULL;
2449
Guido van Rossum9c0afe51998-05-19 15:09:05 +00002450 if (mod == Py_None)
2451 path = NULL;
2452 else {
2453 path = PyObject_GetAttrString(mod, "__path__");
2454 if (path == NULL) {
2455 PyErr_Clear();
2456 Py_INCREF(Py_None);
2457 return Py_None;
2458 }
2459 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002460
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002461 buf[0] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +00002462 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
2463 &fp, &loader);
Guido van Rossumb68cd421998-07-01 17:36:26 +00002464 Py_XDECREF(path);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002465 if (fdp == NULL) {
2466 if (!PyErr_ExceptionMatches(PyExc_ImportError))
2467 return NULL;
2468 PyErr_Clear();
2469 Py_INCREF(Py_None);
2470 return Py_None;
2471 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002472 m = load_module(fullname, fp, buf, fdp->type, loader);
2473 Py_XDECREF(loader);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002474 if (fp)
2475 fclose(fp);
Neil Schemenauer00b09662003-06-16 21:03:07 +00002476 if (!add_submodule(mod, m, fullname, subname, modules)) {
2477 Py_XDECREF(m);
2478 m = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002479 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00002480 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002481
2482 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00002483}
2484
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002485
2486/* Re-import a module of any kind and return its module object, WITH
2487 INCREMENTED REFERENCE COUNT */
2488
Guido van Rossum79f25d91997-04-29 20:08:16 +00002489PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002490PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002491{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002492 PyInterpreterState *interp = PyThreadState_Get()->interp;
2493 PyObject *modules_reloading = interp->modules_reloading;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002494 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossumd8faa362007-04-27 19:54:29 +00002495 PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
Guido van Rossum222ef561997-09-06 19:41:09 +00002496 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002497 char buf[MAXPATHLEN+1];
2498 struct filedescr *fdp;
2499 FILE *fp = NULL;
Tim Peters1cd70172004-08-02 03:52:12 +00002500 PyObject *newm;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002501
2502 if (modules_reloading == NULL) {
2503 Py_FatalError("PyImport_ReloadModule: "
Guido van Rossume7ba4952007-06-06 23:52:48 +00002504 "no modules_reloading dictionary!");
Guido van Rossumd8faa362007-04-27 19:54:29 +00002505 return NULL;
2506 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002507
Guido van Rossum79f25d91997-04-29 20:08:16 +00002508 if (m == NULL || !PyModule_Check(m)) {
2509 PyErr_SetString(PyExc_TypeError,
2510 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002511 return NULL;
2512 }
Neal Norwitz5616c6d2007-08-26 05:32:41 +00002513 name = (char*)PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002514 if (name == NULL)
2515 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00002516 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002517 PyErr_Format(PyExc_ImportError,
2518 "reload(): module %.200s not in sys.modules",
2519 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002520 return NULL;
2521 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002522 existing_m = PyDict_GetItemString(modules_reloading, name);
2523 if (existing_m != NULL) {
2524 /* Due to a recursive reload, this module is already
2525 being reloaded. */
2526 Py_INCREF(existing_m);
2527 return existing_m;
2528 }
2529 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
2530 return NULL;
2531
Guido van Rossum222ef561997-09-06 19:41:09 +00002532 subname = strrchr(name, '.');
2533 if (subname == NULL)
2534 subname = name;
2535 else {
2536 PyObject *parentname, *parent;
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002537 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002538 if (parentname == NULL) {
2539 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002540 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002541 }
Guido van Rossum222ef561997-09-06 19:41:09 +00002542 parent = PyDict_GetItem(modules, parentname);
2543 if (parent == NULL) {
2544 PyErr_Format(PyExc_ImportError,
2545 "reload(): parent %.200s not in sys.modules",
Christian Heimesc4cb3b82007-11-04 12:10:01 +00002546 PyUnicode_AsString(parentname));
Georg Brandl0c55f292005-09-14 06:56:20 +00002547 Py_DECREF(parentname);
Guido van Rossume7ba4952007-06-06 23:52:48 +00002548 imp_modules_reloading_clear();
Guido van Rossum222ef561997-09-06 19:41:09 +00002549 return NULL;
2550 }
Georg Brandl0c55f292005-09-14 06:56:20 +00002551 Py_DECREF(parentname);
Guido van Rossum222ef561997-09-06 19:41:09 +00002552 subname++;
2553 path = PyObject_GetAttrString(parent, "__path__");
2554 if (path == NULL)
2555 PyErr_Clear();
2556 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002557 buf[0] = '\0';
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002558 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
Guido van Rossum222ef561997-09-06 19:41:09 +00002559 Py_XDECREF(path);
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002560
2561 if (fdp == NULL) {
2562 Py_XDECREF(loader);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002563 imp_modules_reloading_clear();
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002564 return NULL;
Phillip J. Eby7ec642a2004-09-23 04:37:36 +00002565 }
2566
2567 newm = load_module(name, fp, buf, fdp->type, loader);
2568 Py_XDECREF(loader);
2569
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002570 if (fp)
2571 fclose(fp);
Tim Peters1cd70172004-08-02 03:52:12 +00002572 if (newm == NULL) {
2573 /* load_module probably removed name from modules because of
2574 * the error. Put back the original module object. We're
2575 * going to return NULL in this case regardless of whether
2576 * replacing name succeeds, so the return value is ignored.
2577 */
2578 PyDict_SetItemString(modules, name, m);
2579 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002580 imp_modules_reloading_clear();
Tim Peters1cd70172004-08-02 03:52:12 +00002581 return newm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002582}
2583
2584
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002585/* Higher-level import emulator which emulates the "import" statement
2586 more accurately -- it invokes the __import__() function from the
2587 builtins of the current globals. This means that the import is
2588 done using whatever import hooks are installed in the current
Guido van Rossum6058eb41998-12-21 19:51:00 +00002589 environment, e.g. by "rexec".
2590 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002591 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002592 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002593
2594PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002595PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002596{
2597 static PyObject *silly_list = NULL;
2598 static PyObject *builtins_str = NULL;
2599 static PyObject *import_str = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002600 PyObject *globals = NULL;
2601 PyObject *import = NULL;
2602 PyObject *builtins = NULL;
2603 PyObject *r = NULL;
2604
2605 /* Initialize constant string objects */
2606 if (silly_list == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002607 import_str = PyUnicode_InternFromString("__import__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002608 if (import_str == NULL)
2609 return NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002610 builtins_str = PyUnicode_InternFromString("__builtins__");
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002611 if (builtins_str == NULL)
2612 return NULL;
2613 silly_list = Py_BuildValue("[s]", "__doc__");
2614 if (silly_list == NULL)
2615 return NULL;
2616 }
2617
2618 /* Get the builtins from current globals */
2619 globals = PyEval_GetGlobals();
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002620 if (globals != NULL) {
Guido van Rossum66468561998-10-22 15:46:50 +00002621 Py_INCREF(globals);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002622 builtins = PyObject_GetItem(globals, builtins_str);
2623 if (builtins == NULL)
2624 goto err;
2625 }
2626 else {
2627 /* No globals -- use standard builtins, and fake globals */
2628 PyErr_Clear();
2629
Georg Brandl1a3284e2007-12-02 09:40:06 +00002630 builtins = PyImport_ImportModuleLevel("builtins",
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002631 NULL, NULL, NULL, 0);
Guido van Rossum85cd1d62001-02-20 21:43:24 +00002632 if (builtins == NULL)
2633 return NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002634 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2635 if (globals == NULL)
2636 goto err;
2637 }
2638
2639 /* Get the __import__ function from the builtins */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002640 if (PyDict_Check(builtins)) {
Fred Drakea76ba6e2001-03-06 06:31:15 +00002641 import = PyObject_GetItem(builtins, import_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002642 if (import == NULL)
2643 PyErr_SetObject(PyExc_KeyError, import_str);
2644 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002645 else
Fred Drakea76ba6e2001-03-06 06:31:15 +00002646 import = PyObject_GetAttr(builtins, import_str);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002647 if (import == NULL)
2648 goto err;
2649
Christian Heimes072c0f12008-01-03 23:01:04 +00002650 /* Call the __import__ function with the proper argument list
2651 * Always use absolute import here. */
2652 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2653 globals, silly_list, 0, NULL);
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002654
2655 err:
2656 Py_XDECREF(globals);
2657 Py_XDECREF(builtins);
2658 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002659
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002660 return r;
2661}
2662
2663
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002664/* Module 'imp' provides Python access to the primitives used for
2665 importing modules.
2666*/
2667
Guido van Rossum79f25d91997-04-29 20:08:16 +00002668static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002669imp_get_magic(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002670{
2671 char buf[4];
2672
Guido van Rossum96774c12000-05-01 20:19:08 +00002673 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
2674 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
2675 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
2676 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002677
Guido van Rossumad8d3002007-08-03 18:40:49 +00002678 return PyBytes_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002679}
2680
Guido van Rossum79f25d91997-04-29 20:08:16 +00002681static PyObject *
Neal Norwitz08ea61a2003-02-17 18:18:00 +00002682imp_get_suffixes(PyObject *self, PyObject *noargs)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002683{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002684 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002685 struct filedescr *fdp;
2686
Guido van Rossum79f25d91997-04-29 20:08:16 +00002687 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002688 if (list == NULL)
2689 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002690 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2691 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002692 fdp->suffix, fdp->mode, fdp->type);
2693 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002694 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002695 return NULL;
2696 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002697 if (PyList_Append(list, item) < 0) {
2698 Py_DECREF(list);
2699 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002700 return NULL;
2701 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002702 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002703 }
2704 return list;
2705}
2706
Guido van Rossum79f25d91997-04-29 20:08:16 +00002707static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002708call_find_module(char *name, PyObject *path)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002709{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002710 extern int fclose(FILE *);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002711 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002712 struct filedescr *fdp;
2713 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002714 FILE *fp = NULL;
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002715 int fd = -1;
Brett Cannon3bb42d92007-10-20 03:43:15 +00002716 char *found_encoding = NULL;
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002717 char *encoding = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002718
2719 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00002720 if (path == Py_None)
2721 path = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00002722 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002723 if (fdp == NULL)
2724 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002725 if (fp != NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002726 fd = fileno(fp);
2727 if (fd != -1)
2728 fd = dup(fd);
2729 fclose(fp);
2730 fp = NULL;
2731 }
2732 if (fd != -1) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002733 if (strchr(fdp->mode, 'b') == NULL) {
Brett Cannon3bb42d92007-10-20 03:43:15 +00002734 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
2735 memory. */
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002736 found_encoding = PyTokenizer_FindEncoding(fd);
2737 lseek(fd, 0, 0); /* Reset position */
Brett Cannon3bb42d92007-10-20 03:43:15 +00002738 encoding = (found_encoding != NULL) ? found_encoding :
Guido van Rossumce3a72a2007-10-19 23:16:50 +00002739 (char*)PyUnicode_GetDefaultEncoding();
2740 }
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002741 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00002742 (char*)encoding, NULL, NULL, 1);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002743 if (fob == NULL) {
Guido van Rossum40d20bc2007-10-22 00:09:51 +00002744 close(fd);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002745 PyMem_FREE(found_encoding);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002746 return NULL;
2747 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002748 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002749 else {
2750 fob = Py_None;
2751 Py_INCREF(fob);
Tim Peters50d8d372001-02-28 05:34:27 +00002752 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002754 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002755 Py_DECREF(fob);
Brett Cannon3bb42d92007-10-20 03:43:15 +00002756 PyMem_FREE(found_encoding);
2757
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002758 return ret;
2759}
2760
Guido van Rossum79f25d91997-04-29 20:08:16 +00002761static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002762imp_find_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002763{
2764 char *name;
2765 PyObject *path = NULL;
Guido van Rossum43713e52000-02-29 13:59:29 +00002766 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002767 return NULL;
2768 return call_find_module(name, path);
2769}
2770
2771static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002772imp_init_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002773{
2774 char *name;
2775 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002776 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002777 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002778 return NULL;
2779 ret = init_builtin(name);
2780 if (ret < 0)
2781 return NULL;
2782 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002783 Py_INCREF(Py_None);
2784 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002785 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 m = PyImport_AddModule(name);
2787 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 return m;
2789}
2790
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792imp_init_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002793{
2794 char *name;
2795 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 PyObject *m;
Guido van Rossum43713e52000-02-29 13:59:29 +00002797 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002798 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 if (ret < 0)
2801 return NULL;
2802 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002803 Py_INCREF(Py_None);
2804 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002805 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002806 m = PyImport_AddModule(name);
2807 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002808 return m;
2809}
2810
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812imp_get_frozen_object(PyObject *self, PyObject *args)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002813{
2814 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00002815
Guido van Rossum43713e52000-02-29 13:59:29 +00002816 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002817 return NULL;
2818 return get_frozen_object(name);
2819}
2820
Guido van Rossum79f25d91997-04-29 20:08:16 +00002821static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002822imp_is_builtin(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002823{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002824 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002825 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002826 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00002827 return PyLong_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002828}
2829
Guido van Rossum79f25d91997-04-29 20:08:16 +00002830static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002831imp_is_frozen(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002832{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002833 char *name;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002834 struct _frozen *p;
Guido van Rossum43713e52000-02-29 13:59:29 +00002835 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002836 return NULL;
Guido van Rossum323bf5e1998-06-24 03:54:06 +00002837 p = find_frozen(name);
Guido van Rossumb8bff3f2002-04-07 06:34:38 +00002838 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002839}
2840
2841static FILE *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002842get_file(char *pathname, PyObject *fob, char *mode)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002843{
2844 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002845 if (mode[0] == 'U')
2846 mode = "r" PY_STDIOTEXTMODE;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002847 if (fob == NULL) {
2848 fp = fopen(pathname, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002849 }
2850 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002851 int fd = PyObject_AsFileDescriptor(fob);
2852 if (fd == -1)
2853 return NULL;
2854 /* XXX This will leak a FILE struct. Fix this!!!!
2855 (But it doesn't leak a file descrioptor!) */
2856 fp = fdopen(fd, mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002857 }
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002858 if (fp == NULL)
2859 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002860 return fp;
2861}
2862
Guido van Rossum79f25d91997-04-29 20:08:16 +00002863static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002864imp_load_compiled(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002865{
2866 char *name;
2867 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 PyObject *fob = NULL;
2869 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002870 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002871 if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
2872 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002873 return NULL;
2874 fp = get_file(pathname, fob, "rb");
2875 if (fp == NULL)
2876 return NULL;
2877 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002878 if (fob == NULL)
2879 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002880 return m;
2881}
2882
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002883#ifdef HAVE_DYNAMIC_LOADING
2884
Guido van Rossum79f25d91997-04-29 20:08:16 +00002885static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886imp_load_dynamic(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002887{
2888 char *name;
2889 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002890 PyObject *fob = NULL;
2891 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00002892 FILE *fp = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002893 if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
2894 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002895 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002896 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00002897 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002898 if (fp == NULL)
2899 return NULL;
2900 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002901 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00002902 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002903}
2904
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002905#endif /* HAVE_DYNAMIC_LOADING */
2906
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908imp_load_source(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002909{
2910 char *name;
2911 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002912 PyObject *fob = NULL;
2913 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002914 FILE *fp;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002915 if (!PyArg_ParseTuple(args, "ss|O:load_source",
2916 &name, &pathname, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002917 return NULL;
2918 fp = get_file(pathname, fob, "r");
2919 if (fp == NULL)
2920 return NULL;
2921 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002922 if (fob == NULL)
2923 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002924 return m;
2925}
2926
Guido van Rossum79f25d91997-04-29 20:08:16 +00002927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928imp_load_module(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002929{
2930 char *name;
2931 PyObject *fob;
2932 char *pathname;
2933 char *suffix; /* Unused */
2934 char *mode;
2935 int type;
2936 FILE *fp;
2937
Guido van Rossum43713e52000-02-29 13:59:29 +00002938 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002939 &name, &fob, &pathname,
2940 &suffix, &mode, &type))
2941 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002942 if (*mode) {
2943 /* Mode must start with 'r' or 'U' and must not contain '+'.
2944 Implicit in this test is the assumption that the mode
2945 may contain other modifiers like 'b' or 't'. */
2946
2947 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
Jeremy Hylton4ae6fae2002-05-30 17:15:25 +00002948 PyErr_Format(PyExc_ValueError,
2949 "invalid file open mode %.200s", mode);
2950 return NULL;
Guido van Rossum5e2c5fa2002-05-30 17:33:07 +00002951 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002952 }
2953 if (fob == Py_None)
2954 fp = NULL;
2955 else {
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002956 fp = get_file(NULL, fob, mode);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002957 if (fp == NULL)
2958 return NULL;
2959 }
Just van Rossum52e14d62002-12-30 22:08:05 +00002960 return load_module(name, fp, pathname, type, NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002961}
2962
2963static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002964imp_load_package(PyObject *self, PyObject *args)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002965{
2966 char *name;
2967 char *pathname;
Guido van Rossum43713e52000-02-29 13:59:29 +00002968 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002969 return NULL;
2970 return load_package(name, pathname);
2971}
2972
2973static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002974imp_new_module(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002975{
2976 char *name;
Guido van Rossum43713e52000-02-29 13:59:29 +00002977 if (!PyArg_ParseTuple(args, "s:new_module", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002978 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002980}
2981
Christian Heimes13a7a212008-01-07 17:13:09 +00002982static PyObject *
2983imp_reload(PyObject *self, PyObject *v)
2984{
2985 return PyImport_ReloadModule(v);
2986}
2987
2988PyDoc_STRVAR(doc_reload,
2989"reload(module) -> module\n\
2990\n\
2991Reload the module. The module must have been successfully imported before.");
2992
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002993/* Doc strings */
2994
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002995PyDoc_STRVAR(doc_imp,
2996"This module provides the components needed to build your own\n\
2997__import__ function. Undocumented functions are obsolete.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002999PyDoc_STRVAR(doc_find_module,
3000"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003001Search for a module. If path is omitted or None, search for a\n\
3002built-in, frozen or special module and continue search in sys.path.\n\
3003The module name cannot contain '.'; to search for a submodule of a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003004package, pass the submodule name and the package's __path__.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003006PyDoc_STRVAR(doc_load_module,
3007"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003008Load a module, given information returned by find_module().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003009The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003011PyDoc_STRVAR(doc_get_magic,
3012"get_magic() -> string\n\
3013Return the magic number for .pyc or .pyo files.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003015PyDoc_STRVAR(doc_get_suffixes,
3016"get_suffixes() -> [(suffix, mode, type), ...]\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003017Return a list of (suffix, mode, type) tuples describing the files\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003018that find_module() looks for.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003020PyDoc_STRVAR(doc_new_module,
3021"new_module(name) -> module\n\
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003022Create a new module. Do not enter it in sys.modules.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003023The module name must include the full package name, if any.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003025PyDoc_STRVAR(doc_lock_held,
Tim Petersa7c65092004-08-01 23:26:05 +00003026"lock_held() -> boolean\n\
3027Return True if the import lock is currently held, else False.\n\
3028On platforms without threads, return False.");
Tim Peters69232342001-08-30 05:16:13 +00003029
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003030PyDoc_STRVAR(doc_acquire_lock,
3031"acquire_lock() -> None\n\
Neal Norwitz2294c0d2003-02-12 23:02:21 +00003032Acquires the interpreter's import lock for the current thread.\n\
3033This lock should be used by import hooks to ensure thread-safety\n\
3034when importing modules.\n\
Guido van Rossumc4f4ca92003-02-12 21:46:11 +00003035On platforms without threads, this function does nothing.");
3036
3037PyDoc_STRVAR(doc_release_lock,
3038"release_lock() -> None\n\
3039Release the interpreter's import lock.\n\
3040On platforms without threads, this function does nothing.");
3041
Guido van Rossum79f25d91997-04-29 20:08:16 +00003042static PyMethodDef imp_methods[] = {
Neal Norwitz08ea61a2003-02-17 18:18:00 +00003043 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
3044 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
3045 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
3046 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
3047 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
3048 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
3049 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
3050 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
Christian Heimes13a7a212008-01-07 17:13:09 +00003051 {"reload", imp_reload, METH_O, doc_reload},
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003052 /* The rest are obsolete */
Neal Norwitz031829d2002-03-31 14:37:44 +00003053 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
3054 {"init_builtin", imp_init_builtin, METH_VARARGS},
3055 {"init_frozen", imp_init_frozen, METH_VARARGS},
3056 {"is_builtin", imp_is_builtin, METH_VARARGS},
3057 {"is_frozen", imp_is_frozen, METH_VARARGS},
3058 {"load_compiled", imp_load_compiled, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003059#ifdef HAVE_DYNAMIC_LOADING
Neal Norwitz031829d2002-03-31 14:37:44 +00003060 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
Guido van Rossum96a8fb71999-12-22 14:09:35 +00003061#endif
Neal Norwitz031829d2002-03-31 14:37:44 +00003062 {"load_package", imp_load_package, METH_VARARGS},
Neal Norwitz031829d2002-03-31 14:37:44 +00003063 {"load_source", imp_load_source, METH_VARARGS},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003064 {NULL, NULL} /* sentinel */
3065};
3066
Guido van Rossum1a8791e1998-08-04 22:46:29 +00003067static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003068setint(PyObject *d, char *name, int value)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003069{
3070 PyObject *v;
3071 int err;
3072
Christian Heimes217cfd12007-12-02 14:31:20 +00003073 v = PyLong_FromLong((long)value);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003074 err = PyDict_SetItemString(d, name, v);
3075 Py_XDECREF(v);
3076 return err;
3077}
3078
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003079typedef struct {
3080 PyObject_HEAD
3081} NullImporter;
3082
3083static int
3084NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
3085{
3086 char *path;
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003087 Py_ssize_t pathlen;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003088
3089 if (!_PyArg_NoKeywords("NullImporter()", kwds))
3090 return -1;
3091
3092 if (!PyArg_ParseTuple(args, "s:NullImporter",
3093 &path))
3094 return -1;
3095
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003096 pathlen = strlen(path);
3097 if (pathlen == 0) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003098 PyErr_SetString(PyExc_ImportError, "empty pathname");
3099 return -1;
3100 } else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003101 struct stat statbuf;
3102 int rv;
3103
3104 rv = stat(path, &statbuf);
Guido van Rossumc1bdbc32007-11-07 17:46:34 +00003105#ifdef MS_WINDOWS
3106 /* MS Windows stat() chokes on paths like C:\path\. Try to
3107 * recover *one* time by stripping off a trailing slash or
3108 * backslash. http://bugs.python.org/issue1293
3109 */
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003110 if (rv != 0 && pathlen <= MAXPATHLEN &&
3111 (path[pathlen-1] == '/' || path[pathlen-1] == '\\')) {
3112 char mangled[MAXPATHLEN+1];
3113
3114 strcpy(mangled, path);
3115 mangled[pathlen-1] = '\0';
3116 rv = stat(mangled, &statbuf);
3117 }
Christian Heimes7d3bc0a2007-11-07 17:26:16 +00003118#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003119 if (rv == 0) {
3120 /* it exists */
3121 if (S_ISDIR(statbuf.st_mode)) {
3122 /* it's a directory */
3123 PyErr_SetString(PyExc_ImportError,
3124 "existing directory");
3125 return -1;
3126 }
3127 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003128 }
3129 return 0;
3130}
3131
3132static PyObject *
3133NullImporter_find_module(NullImporter *self, PyObject *args)
3134{
3135 Py_RETURN_NONE;
3136}
3137
3138static PyMethodDef NullImporter_methods[] = {
3139 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
3140 "Always return None"
3141 },
3142 {NULL} /* Sentinel */
3143};
3144
3145
Christian Heimes9cd17752007-11-18 19:35:23 +00003146PyTypeObject PyNullImporter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003147 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003148 "imp.NullImporter", /*tp_name*/
3149 sizeof(NullImporter), /*tp_basicsize*/
3150 0, /*tp_itemsize*/
3151 0, /*tp_dealloc*/
3152 0, /*tp_print*/
3153 0, /*tp_getattr*/
3154 0, /*tp_setattr*/
3155 0, /*tp_compare*/
3156 0, /*tp_repr*/
3157 0, /*tp_as_number*/
3158 0, /*tp_as_sequence*/
3159 0, /*tp_as_mapping*/
3160 0, /*tp_hash */
3161 0, /*tp_call*/
3162 0, /*tp_str*/
3163 0, /*tp_getattro*/
3164 0, /*tp_setattro*/
3165 0, /*tp_as_buffer*/
3166 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3167 "Null importer object", /* tp_doc */
3168 0, /* tp_traverse */
3169 0, /* tp_clear */
3170 0, /* tp_richcompare */
3171 0, /* tp_weaklistoffset */
3172 0, /* tp_iter */
3173 0, /* tp_iternext */
3174 NullImporter_methods, /* tp_methods */
3175 0, /* tp_members */
3176 0, /* tp_getset */
3177 0, /* tp_base */
3178 0, /* tp_dict */
3179 0, /* tp_descr_get */
3180 0, /* tp_descr_set */
3181 0, /* tp_dictoffset */
3182 (initproc)NullImporter_init, /* tp_init */
3183 0, /* tp_alloc */
3184 PyType_GenericNew /* tp_new */
3185};
3186
3187
Jason Tishler6bc06ec2003-09-04 11:59:50 +00003188PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189initimp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003190{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003191 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003192
Christian Heimes9cd17752007-11-18 19:35:23 +00003193 if (PyType_Ready(&PyNullImporter_Type) < 0)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003194 goto failure;
3195
Guido van Rossum0207e6d1997-09-09 22:04:42 +00003196 m = Py_InitModule4("imp", imp_methods, doc_imp,
3197 NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003198 if (m == NULL)
3199 goto failure;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003200 d = PyModule_GetDict(m);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003201 if (d == NULL)
3202 goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003203
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003204 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
3205 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
3206 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
3207 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
3208 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
3209 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
3210 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
3211 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum0f84a341998-08-06 13:36:01 +00003212 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
Just van Rossum52e14d62002-12-30 22:08:05 +00003213 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003214
Christian Heimes9cd17752007-11-18 19:35:23 +00003215 Py_INCREF(&PyNullImporter_Type);
3216 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00003217 failure:
3218 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003219}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003220
3221
Guido van Rossumb18618d2000-05-03 23:44:39 +00003222/* API for embedding applications that want to add their own entries
3223 to the table of built-in modules. This should normally be called
3224 *before* Py_Initialize(). When the table resize fails, -1 is
3225 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003226
3227 After a similar function by Just van Rossum. */
3228
3229int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003230PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003231{
3232 static struct _inittab *our_copy = NULL;
3233 struct _inittab *p;
3234 int i, n;
3235
3236 /* Count the number of entries in both tables */
3237 for (n = 0; newtab[n].name != NULL; n++)
3238 ;
3239 if (n == 0)
3240 return 0; /* Nothing to do */
3241 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
3242 ;
3243
3244 /* Allocate new memory for the combined table */
Guido van Rossumb18618d2000-05-03 23:44:39 +00003245 p = our_copy;
3246 PyMem_RESIZE(p, struct _inittab, i+n+1);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003247 if (p == NULL)
3248 return -1;
3249
3250 /* Copy the tables into the new memory */
3251 if (our_copy != PyImport_Inittab)
3252 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
3253 PyImport_Inittab = our_copy = p;
3254 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
3255
3256 return 0;
3257}
3258
3259/* Shorthand to add a single entry given a name and a function */
3260
3261int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003262PyImport_AppendInittab(char *name, void (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00003263{
3264 struct _inittab newtab[2];
3265
3266 memset(newtab, '\0', sizeof newtab);
3267
3268 newtab[0].name = name;
3269 newtab[0].initfunc = initfunc;
3270
3271 return PyImport_ExtendInittab(newtab);
3272}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003273
3274#ifdef __cplusplus
3275}
3276#endif