blob: 2a77e5a3597e6cc91d8e93060aae882ab9175e0a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossum79f25d91997-04-29 20:08:16 +000052extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000053
Guido van Rossum6c849691994-09-26 15:47:17 +000054/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000055/* Change for each incompatible change */
56/* The value of CR and LF is incorporated so if you ever read or write
57 a .pyc file in text mode the magic number will be wrong; also, the
58 Apple MPW compiler swaps their values, botching string constants */
59/* XXX Perhaps the magic number should be frozen and a version field
60 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000061/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000062#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000063
Guido van Rossum25ce5661997-08-02 03:10:38 +000064/* See _PyImport_FixupExtension() below */
65static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000066
Guido van Rossum66f1fa81991-04-03 19:03:52 +000067
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069
70void
Guido van Rossum25ce5661997-08-02 03:10:38 +000071_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072{
Guido van Rossum0824f631997-03-11 18:37:35 +000073 if (Py_OptimizeFlag) {
74 /* Replace ".pyc" with ".pyo" in import_filetab */
75 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000077 if (strcmp(p->suffix, ".pyc") == 0)
78 p->suffix = ".pyo";
79 }
80 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Guido van Rossum25ce5661997-08-02 03:10:38 +000083void
84_PyImport_Fini()
85{
86 Py_XDECREF(extensions);
87 extensions = NULL;
88}
89
90
91/* Helper for sys */
92
93PyObject *
94PyImport_GetModuleDict()
95{
96 PyInterpreterState *interp = PyThreadState_Get()->interp;
97 if (interp->modules == NULL)
98 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
99 return interp->modules;
100}
101
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000103/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108 PyInterpreterState *interp = PyThreadState_Get()->interp;
109 PyObject *tmp = interp->modules;
110 if (tmp != NULL) {
111 int pos;
112 PyObject *key, *value;
113 interp->modules = NULL;
114 pos = 0;
115 while (PyDict_Next(tmp, &pos, &key, &value)) {
116 if (PyModule_Check(value)) {
117 PyObject *d = PyModule_GetDict(value);
118 PyDict_Clear(d);
119 }
120 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 PyDict_Clear(tmp);
122 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000124}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000125
126
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000127/* Helper for pythonrun.c -- return magic number */
128
129long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131{
132 return MAGIC;
133}
134
135
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136/* Magic for extension modules (built-in as well as dynamically
137 loaded). To prevent initializing an extension module more than
138 once, we keep a static dictionary 'extensions' keyed by module name
139 (for built-in modules) or by filename (for dynamically loaded
140 modules), containing these modules. A copy od the module's
141 dictionary is stored by calling _PyImport_FixupExtension()
142 immediately after the module initialization function succeeds. A
143 copy can be retrieved from there by calling
144 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000145
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147_PyImport_FixupExtension(name, filename)
148 char *name;
149 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 PyObject *modules, *mod, *dict, *copy;
152 if (extensions == NULL) {
153 extensions = PyDict_New();
154 if (extensions == NULL)
155 return NULL;
156 }
157 modules = PyImport_GetModuleDict();
158 mod = PyDict_GetItemString(modules, name);
159 if (mod == NULL || !PyModule_Check(mod)) {
160 PyErr_SetString(PyExc_SystemError,
161 "_PyImport_FixupExtension: module not loaded");
162 return NULL;
163 }
164 dict = PyModule_GetDict(mod);
165 if (dict == NULL)
166 return NULL;
167 copy = PyObject_CallMethod(dict, "copy", "");
168 if (copy == NULL)
169 return NULL;
170 PyDict_SetItemString(extensions, filename, copy);
171 Py_DECREF(copy);
172 return copy;
173}
174
175PyObject *
176_PyImport_FindExtension(name, filename)
177 char *name;
178 char *filename;
179{
180 PyObject *dict, *mod, *mdict, *result;
181 if (extensions == NULL)
182 return NULL;
183 dict = PyDict_GetItemString(extensions, filename);
184 if (dict == NULL)
185 return NULL;
186 mod = PyImport_AddModule(name);
187 if (mod == NULL)
188 return NULL;
189 mdict = PyModule_GetDict(mod);
190 if (mdict == NULL)
191 return NULL;
192 result = PyObject_CallMethod(mdict, "update", "O", dict);
193 if (result == NULL)
194 return NULL;
195 Py_DECREF(result);
196 if (Py_VerboseFlag)
197 fprintf(stderr, "import %s # previously loaded (%s)\n",
198 name, filename);
199 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000200}
201
202
203/* Get the module object corresponding to a module name.
204 First check the modules dictionary if there's one there,
205 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000206 Because the former action is most common, THIS DOES NOT RETURN A
207 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209PyObject *
210PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211 char *name;
212{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000215
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000218 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000220 if (m == NULL)
221 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000222 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000224 return NULL;
225 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000227
228 return m;
229}
230
231
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000232/* Execute a code object in a module and return the module object
233 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000234
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235PyObject *
236PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000239{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244 if (m == NULL)
245 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 d = PyModule_GetDict(m);
247 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
248 if (PyDict_SetItemString(d, "__builtins__",
249 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000250 return NULL;
251 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000252 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 if (PyDict_SetItemString(d, "__file__",
254 ((PyCodeObject *)co)->co_filename) != 0)
255 PyErr_Clear(); /* Not important enough to report */
256 v = PyEval_EvalCode((PyCodeObject *)co, d, d); /* XXX owner? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000257 if (v == NULL)
258 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000260
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000262 PyErr_SetString(PyExc_SystemError,
263 "loaded module not found in sys.modules");
264 return NULL;
265 }
266
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268
269 return m;
270}
271
272
273/* Given a pathname for a Python source file, fill a buffer with the
274 pathname for the corresponding compiled file. Return the pathname
275 for the compiled file, or NULL if there's no space in the buffer.
276 Doesn't set an exception. */
277
278static char *
279make_compiled_pathname(pathname, buf, buflen)
280 char *pathname;
281 char *buf;
282 int buflen;
283{
284 int len;
285
286 len = strlen(pathname);
287 if (len+2 > buflen)
288 return NULL;
289 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000290 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291
292 return buf;
293}
294
295
296/* Given a pathname for a Python source file, its time of last
297 modification, and a pathname for a compiled file, check whether the
298 compiled file represents the same version of the source. If so,
299 return a FILE pointer for the compiled file, positioned just after
300 the header; if not, return NULL.
301 Doesn't set an exception. */
302
303static FILE *
304check_compiled_module(pathname, mtime, cpathname)
305 char *pathname;
306 long mtime;
307 char *cpathname;
308{
309 FILE *fp;
310 long magic;
311 long pyc_mtime;
312
313 fp = fopen(cpathname, "rb");
314 if (fp == NULL)
315 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000319 fprintf(stderr, "# %s has bad magic\n", cpathname);
320 fclose(fp);
321 return NULL;
322 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000324 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000326 fprintf(stderr, "# %s has bad mtime\n", cpathname);
327 fclose(fp);
328 return NULL;
329 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000331 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
332 return fp;
333}
334
335
336/* Read a code object from a file and check it for validity */
337
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000339read_compiled_module(fp)
340 FILE *fp;
341{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000343
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 if (co == NULL || !PyCode_Check(co)) {
347 if (!PyErr_Occurred())
348 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000349 "Non-code object in .pyc file");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351 return NULL;
352 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354}
355
356
357/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000358 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000359
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000361load_compiled_module(name, cpathname, fp)
362 char *name;
363 char *cpathname;
364 FILE *fp;
365{
366 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 PyCodeObject *co;
368 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 PyErr_SetString(PyExc_ImportError,
373 "Bad magic number in .pyc file");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374 return NULL;
375 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377 co = read_compiled_module(fp);
378 if (co == NULL)
379 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381 fprintf(stderr, "import %s # precompiled from %s\n",
382 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 m = PyImport_ExecCodeModule(name, (PyObject *)co);
384 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000385
386 return m;
387}
388
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389/* Parse a source file and return the corresponding code object */
390
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392parse_source_module(pathname, fp)
393 char *pathname;
394 FILE *fp;
395{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 node *n;
398
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000399 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000400 if (n == NULL)
401 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 co = PyNode_Compile(n, pathname);
403 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000404
405 return co;
406}
407
408
409/* Write a compiled module to a file, placing the time of last
410 modification of its source into the header.
411 Errors are ignored, if a write error occurs an attempt is made to
412 remove the file. */
413
414static void
415write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 char *cpathname;
418 long mtime;
419{
420 FILE *fp;
421
422 fp = fopen(cpathname, "wb");
423 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 fprintf(stderr,
426 "# can't create %s\n", cpathname);
427 return;
428 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyMarshal_WriteLongToFile(0L, fp);
432 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 fprintf(stderr, "# can't write %s\n", cpathname);
436 /* Don't keep partial file */
437 fclose(fp);
438 (void) unlink(cpathname);
439 return;
440 }
441 /* Now write the true mtime */
442 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 fflush(fp);
445 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 fprintf(stderr, "# wrote %s\n", cpathname);
448#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000449 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450#endif
451}
452
453
454/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000455 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
456 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459load_source_module(name, pathname, fp)
460 char *name;
461 char *pathname;
462 FILE *fp;
463{
464 long mtime;
465 FILE *fpc;
466 char buf[MAXPATHLEN+1];
467 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 PyCodeObject *co;
469 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 mtime = PyOS_GetLastModificationTime(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
473 if (cpathname != NULL &&
474 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
475 co = read_compiled_module(fpc);
476 fclose(fpc);
477 if (co == NULL)
478 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 fprintf(stderr, "import %s # precompiled from %s\n",
481 name, cpathname);
482 }
483 else {
484 co = parse_source_module(pathname, fp);
485 if (co == NULL)
486 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488 fprintf(stderr, "import %s # from %s\n",
489 name, pathname);
490 write_compiled_module(co, cpathname, mtime);
491 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 m = PyImport_ExecCodeModule(name, (PyObject *)co);
493 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494
495 return m;
496}
497
498
499/* Search the path (default sys.path) for a module. Return the
500 corresponding filedescr struct, and (via return arguments) the
501 pathname and an open file. Return NULL if the module is not found. */
502
503static struct filedescr *
504find_module(name, path, buf, buflen, p_fp)
505 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 /* Output parameters: */
508 char *buf;
509 int buflen;
510 FILE **p_fp;
511{
512 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000513 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000514 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515
Guido van Rossumac279101996-08-22 23:10:58 +0000516#ifdef MS_COREDLL
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000517 extern FILE *PyWin_FindRegisteredModule();
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000518 if ((fp=PyWin_FindRegisteredModule(name, &fdp, buf, buflen))!=NULL) {
519 *p_fp = fp;
520 return fdp;
521 }
522#endif
523
524
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000526 path = PySys_GetObject("path");
527 if (path == NULL || !PyList_Check(path)) {
528 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000529 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 return NULL;
531 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 namelen = strlen(name);
534 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 PyObject *v = PyList_GetItem(path, i);
536 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000539 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000542 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000544#ifdef macintosh
545 if ( PyMac_FindResourceModule(name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 static struct filedescr resfiledescr =
547 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000548
549 return &resfiledescr;
550 }
551#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552 if (len > 0 && buf[len-1] != SEP)
553 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000554#ifdef IMPORT_8x3_NAMES
555 /* see if we are searching in directory dos_8x3 */
556 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
557 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000559 for (j = 0; (ch = name[j]) && j < 8; j++)
560 if (isupper(ch))
561 buf[len++] = tolower(ch);
562 else
563 buf[len++] = ch;
564 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000565 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000566#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000567 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000568 strcpy(buf+len, name);
569 len += namelen;
570 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574 fprintf(stderr, "# trying %s\n", buf);
575 fp = fopen(buf, fdp->mode);
576 if (fp != NULL)
577 break;
578 }
579 if (fp != NULL)
580 break;
581 }
582 if (fp == NULL) {
583 char buf[256];
584 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586 return NULL;
587 }
588
589 *p_fp = fp;
590 return fdp;
591}
592
593
594/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000595 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598load_module(name)
599 char *name;
600{
601 char buf[MAXPATHLEN+1];
602 struct filedescr *fdp;
603 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607 if (fdp == NULL)
608 return NULL;
609
610 switch (fdp->type) {
611
612 case PY_SOURCE:
613 m = load_source_module(name, buf, fp);
614 break;
615
616 case PY_COMPILED:
617 m = load_compiled_module(name, buf, fp);
618 break;
619
620 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622 break;
623
Jack Jansen9c96a921995-02-15 22:57:06 +0000624#ifdef macintosh
625 case PY_RESOURCE:
626 m = PyMac_LoadResourceModule(name, buf);
627 break;
628#endif
629
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000633 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634
635 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000636 if ( fp )
637 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000638
639 return m;
640}
641
642
643/* Initialize a built-in module.
644 Return 1 for succes, 0 if the module is not found, and -1 with
645 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000646
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000647static int
648init_builtin(name)
649 char *name;
650{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000651 PyInterpreterState *interp = PyThreadState_Get()->interp;
652 struct _inittab *p;
653 PyObject *mod;
654
655 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
656 return 1;
657
658 for (p = _PyImport_Inittab; p->name != NULL; p++) {
659 if (strcmp(name, p->name) == 0) {
660 if (p->initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000662 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000663 return -1;
664 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000666 fprintf(stderr, "import %s # builtin\n", name);
667 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000670 if (_PyImport_FixupExtension(name, name) == NULL)
671 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000672 return 1;
673 }
674 }
675 return 0;
676}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000677
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000679/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000681static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000682find_frozen(name)
683 char *name;
684{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000685 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000686
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000688 if (p->name == NULL)
689 return NULL;
690 if (strcmp(p->name, name) == 0)
691 break;
692 }
693 return p;
694}
695
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000697get_frozen_object(name)
698 char *name;
699{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000700 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000701
702 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000704 return NULL;
705 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000707}
708
709/* Initialize a frozen module.
710 Return 1 for succes, 0 if the module is not found, and -1 with
711 an exception set if the initialization failed.
712 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000713
714int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000716 char *name;
717{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000718 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 PyObject *co;
720 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000721
722 if (p == NULL)
723 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000725 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000727 if (co == NULL)
728 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 if (!PyCode_Check(co)) {
730 Py_DECREF(co);
731 PyErr_SetString(PyExc_TypeError,
732 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000733 return -1;
734 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 m = PyImport_ExecCodeModule(name, co);
736 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000737 if (m == NULL)
738 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000740 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000741}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000742
743
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000745 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000746
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747PyObject *
748PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000749 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000750{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000751 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000753
Guido van Rossum25ce5661997-08-02 03:10:38 +0000754 if ((m = PyDict_GetItemString(modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000756 }
757 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if ((i = init_builtin(name)) ||
760 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 if (i < 0)
762 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000763 if ((m = PyDict_GetItemString(modules,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 name)) == NULL) {
765 if (PyErr_Occurred() == NULL)
766 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767 "built-in module not initialized properly");
768 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000769 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000771 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772 else
773 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000774 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775
776 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000777}
778
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779
780/* Re-import a module of any kind and return its module object, WITH
781 INCREMENTED REFERENCE COUNT */
782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783PyObject *
784PyImport_ReloadModule(m)
785 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000787 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788 char *name;
789 int i;
790
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (m == NULL || !PyModule_Check(m)) {
792 PyErr_SetString(PyExc_TypeError,
793 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794 return NULL;
795 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797 if (name == NULL)
798 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000799 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 PyErr_SetString(PyExc_ImportError,
801 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802 return NULL;
803 }
804 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if ((i = init_builtin(name)) ||
806 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 if (i < 0)
808 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 }
811 else
812 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 return m;
814}
815
816
817/* Module 'imp' provides Python access to the primitives used for
818 importing modules.
819*/
820
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 PyObject *self;
824 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825{
826 char buf[4];
827
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000830 buf[0] = (char) ((MAGIC >> 0) & 0xff);
831 buf[1] = (char) ((MAGIC >> 8) & 0xff);
832 buf[2] = (char) ((MAGIC >> 16) & 0xff);
833 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836}
837
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *self;
841 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844 struct filedescr *fdp;
845
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 if (list == NULL)
850 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
852 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 fdp->suffix, fdp->mode, fdp->type);
854 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 return NULL;
857 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 if (PyList_Append(list, item) < 0) {
859 Py_DECREF(list);
860 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 return NULL;
862 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864 }
865 return list;
866}
867
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyObject *self;
871 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 PyObject *path = NULL;
876 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000877 struct filedescr *fdp;
878 char pathname[MAXPATHLEN+1];
879 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 return NULL;
882 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
883 if (fdp == NULL)
884 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 if (fob == NULL) {
887 fclose(fp);
888 return NULL;
889 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 return ret;
894}
895
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 PyObject *self;
899 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900{
901 char *name;
902 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 PyObject *m;
904 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000905 return NULL;
906 ret = init_builtin(name);
907 if (ret < 0)
908 return NULL;
909 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 Py_INCREF(Py_None);
911 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 m = PyImport_AddModule(name);
914 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 return m;
916}
917
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyObject *self;
921 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922{
923 char *name;
924 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyObject *m;
926 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 if (ret < 0)
930 return NULL;
931 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 Py_INCREF(Py_None);
933 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 m = PyImport_AddModule(name);
936 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937 return m;
938}
939
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000941imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 PyObject *self;
943 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000944{
945 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000948 return NULL;
949 return get_frozen_object(name);
950}
951
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 PyObject *self;
955 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956{
957 int i;
958 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000961 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
962 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
963 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967 }
968 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970}
971
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 PyObject *self;
975 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000977 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000980 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 if (p->name == NULL)
983 break;
984 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988}
989
990static FILE *
991get_file(pathname, fob, mode)
992 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 char *mode;
995{
996 FILE *fp;
997 if (fob == NULL) {
998 fp = fopen(pathname, mode);
999 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001 }
1002 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 PyErr_SetString(PyExc_ValueError,
1006 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 }
1008 return fp;
1009}
1010
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001012imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 PyObject *self;
1014 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015{
1016 char *name;
1017 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyObject *fob = NULL;
1019 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1022 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001023 return NULL;
1024 fp = get_file(pathname, fob, "rb");
1025 if (fp == NULL)
1026 return NULL;
1027 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 return m;
1029}
1030
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyObject *self;
1034 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035{
1036 char *name;
1037 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 PyObject *fob = NULL;
1039 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001040 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1042 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001044 if (fob)
1045 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001047 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048}
1049
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 PyObject *self;
1053 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001054{
1055 char *name;
1056 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 PyObject *fob = NULL;
1058 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1061 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062 return NULL;
1063 fp = get_file(pathname, fob, "r");
1064 if (fp == NULL)
1065 return NULL;
1066 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001067 return m;
1068}
1069
Jack Jansen9c96a921995-02-15 22:57:06 +00001070#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001072imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073 PyObject *self;
1074 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001075{
1076 char *name;
1077 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001079
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001081 return NULL;
1082 m = PyMac_LoadResourceModule(name, pathname);
1083 return m;
1084}
1085#endif /* macintosh */
1086
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001088imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 PyObject *self;
1090 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001091{
1092 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096}
1097
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001099 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100 {"get_magic", imp_get_magic, 1},
1101 {"get_suffixes", imp_get_suffixes, 1},
1102 {"find_module", imp_find_module, 1},
1103 {"init_builtin", imp_init_builtin, 1},
1104 {"init_frozen", imp_init_frozen, 1},
1105 {"is_builtin", imp_is_builtin, 1},
1106 {"is_frozen", imp_is_frozen, 1},
1107 {"load_compiled", imp_load_compiled, 1},
1108 {"load_dynamic", imp_load_dynamic, 1},
1109 {"load_source", imp_load_source, 1},
1110 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001111#ifdef macintosh
1112 {"load_resource", imp_load_resource, 1},
1113#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001114 {NULL, NULL} /* sentinel */
1115};
1116
1117void
1118initimp()
1119{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001121
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 m = Py_InitModule("imp", imp_methods);
1123 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 v = PyInt_FromLong(SEARCH_ERROR);
1126 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1127 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001128
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 v = PyInt_FromLong(PY_SOURCE);
1130 PyDict_SetItemString(d, "PY_SOURCE", v);
1131 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001132
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 v = PyInt_FromLong(PY_COMPILED);
1134 PyDict_SetItemString(d, "PY_COMPILED", v);
1135 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001136
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 v = PyInt_FromLong(C_EXTENSION);
1138 PyDict_SetItemString(d, "C_EXTENSION", v);
1139 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140
Jack Jansenae12e191995-06-18 20:06:44 +00001141#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 v = PyInt_FromLong(PY_RESOURCE);
1143 PyDict_SetItemString(d, "PY_RESOURCE", v);
1144 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001145#endif
1146
1147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 if (PyErr_Occurred())
1149 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150}