blob: 2a4b5cc873252265bc9d331637f409211d434455 [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 Rossumaf5dfb41997-05-14 17:36:12 +000064PyObject *_PyImport_Modules; /* This becomes sys.modules */
Guido van Rossum3f5da241990-12-20 15:06:42 +000065
Guido van Rossum66f1fa81991-04-03 19:03:52 +000066
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068
69void
Guido van Rossum79f25d91997-04-29 20:08:16 +000070PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071{
Guido van Rossumaf5dfb41997-05-14 17:36:12 +000072 if (_PyImport_Modules != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 Py_FatalError("duplicate initimport() call");
Guido van Rossumaf5dfb41997-05-14 17:36:12 +000074 if ((_PyImport_Modules = PyDict_New()) == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +000075 Py_FatalError("no mem for dictionary of modules");
Guido van Rossum0824f631997-03-11 18:37:35 +000076 if (Py_OptimizeFlag) {
77 /* Replace ".pyc" with ".pyo" in import_filetab */
78 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000080 if (strcmp(p->suffix, ".pyc") == 0)
81 p->suffix = ".pyo";
82 }
83 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084}
85
Guido van Rossum3f5da241990-12-20 15:06:42 +000086
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +000088
Guido van Rossum3f5da241990-12-20 15:06:42 +000089void
Guido van Rossum79f25d91997-04-29 20:08:16 +000090PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +000091{
Guido van Rossumaf5dfb41997-05-14 17:36:12 +000092 if (_PyImport_Modules != NULL) {
93 PyObject *tmp = _PyImport_Modules;
94 _PyImport_Modules = NULL;
Guido van Rossum0de81bf1995-01-26 00:41:28 +000095 /* This deletes all modules from sys.modules.
Guido van Rossum79f25d91997-04-29 20:08:16 +000096 When a module is deallocated, it in turn clears its
97 dictionary, thus hopefully breaking any circular
98 references between modules and between a module's
99 dictionary and its functions. Note that "import"
100 will fail while we are cleaning up. */
101 PyDict_Clear(tmp);
102 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000104}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000105
106
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000107/* Helper for pythonrun.c -- return magic number */
108
109long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000111{
112 return MAGIC;
113}
114
115
116/* Helper for sysmodule.c -- return modules dictionary */
117
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118PyObject *
119PyImport_GetModuleDict()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000120{
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000121 return _PyImport_Modules;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000122}
123
124
125/* Get the module object corresponding to a module name.
126 First check the modules dictionary if there's one there,
127 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000128 Because the former action is most common, THIS DOES NOT RETURN A
129 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131PyObject *
132PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133 char *name;
134{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000136
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000137 if (_PyImport_Modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 PyErr_SetString(PyExc_SystemError,
139 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000140 return NULL;
141 }
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000142 if ((m = PyDict_GetItemString(_PyImport_Modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000144 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000146 if (m == NULL)
147 return NULL;
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000148 if (PyDict_SetItemString(_PyImport_Modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150 return NULL;
151 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153
154 return m;
155}
156
157
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000158/* Execute a code object in a module and return the module object
159 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000160
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161PyObject *
162PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000163 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000167
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000169 if (m == NULL)
170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 d = PyModule_GetDict(m);
172 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
173 if (PyDict_SetItemString(d, "__builtins__",
174 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000175 return NULL;
176 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000177 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 if (PyDict_SetItemString(d, "__file__",
179 ((PyCodeObject *)co)->co_filename) != 0)
180 PyErr_Clear(); /* Not important enough to report */
181 v = PyEval_EvalCode((PyCodeObject *)co, d, d); /* XXX owner? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000182 if (v == NULL)
183 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000185
186 if ((m = PyDict_GetItemString(_PyImport_Modules, name)) == NULL) {
187 PyErr_SetString(PyExc_SystemError,
188 "loaded module not found in sys.modules");
189 return NULL;
190 }
191
Guido van Rossum79f25d91997-04-29 20:08:16 +0000192 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000193
194 return m;
195}
196
197
198/* Given a pathname for a Python source file, fill a buffer with the
199 pathname for the corresponding compiled file. Return the pathname
200 for the compiled file, or NULL if there's no space in the buffer.
201 Doesn't set an exception. */
202
203static char *
204make_compiled_pathname(pathname, buf, buflen)
205 char *pathname;
206 char *buf;
207 int buflen;
208{
209 int len;
210
211 len = strlen(pathname);
212 if (len+2 > buflen)
213 return NULL;
214 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000215 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000216
217 return buf;
218}
219
220
221/* Given a pathname for a Python source file, its time of last
222 modification, and a pathname for a compiled file, check whether the
223 compiled file represents the same version of the source. If so,
224 return a FILE pointer for the compiled file, positioned just after
225 the header; if not, return NULL.
226 Doesn't set an exception. */
227
228static FILE *
229check_compiled_module(pathname, mtime, cpathname)
230 char *pathname;
231 long mtime;
232 char *cpathname;
233{
234 FILE *fp;
235 long magic;
236 long pyc_mtime;
237
238 fp = fopen(cpathname, "rb");
239 if (fp == NULL)
240 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000242 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244 fprintf(stderr, "# %s has bad magic\n", cpathname);
245 fclose(fp);
246 return NULL;
247 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000251 fprintf(stderr, "# %s has bad mtime\n", cpathname);
252 fclose(fp);
253 return NULL;
254 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
257 return fp;
258}
259
260
261/* Read a code object from a file and check it for validity */
262
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000264read_compiled_module(fp)
265 FILE *fp;
266{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 if (co == NULL || !PyCode_Check(co)) {
272 if (!PyErr_Occurred())
273 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000274 "Non-code object in .pyc file");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000276 return NULL;
277 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279}
280
281
282/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000283 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286load_compiled_module(name, cpathname, fp)
287 char *name;
288 char *cpathname;
289 FILE *fp;
290{
291 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyCodeObject *co;
293 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000294
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000296 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 PyErr_SetString(PyExc_ImportError,
298 "Bad magic number in .pyc file");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299 return NULL;
300 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302 co = read_compiled_module(fp);
303 if (co == NULL)
304 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306 fprintf(stderr, "import %s # precompiled from %s\n",
307 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 m = PyImport_ExecCodeModule(name, (PyObject *)co);
309 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310
311 return m;
312}
313
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000314/* Parse a source file and return the corresponding code object */
315
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317parse_source_module(pathname, fp)
318 char *pathname;
319 FILE *fp;
320{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000322 node *n;
323
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000324 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000325 if (n == NULL)
326 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 co = PyNode_Compile(n, pathname);
328 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000329
330 return co;
331}
332
333
334/* Write a compiled module to a file, placing the time of last
335 modification of its source into the header.
336 Errors are ignored, if a write error occurs an attempt is made to
337 remove the file. */
338
339static void
340write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000342 char *cpathname;
343 long mtime;
344{
345 FILE *fp;
346
347 fp = fopen(cpathname, "wb");
348 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350 fprintf(stderr,
351 "# can't create %s\n", cpathname);
352 return;
353 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 PyMarshal_WriteLongToFile(0L, fp);
357 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000358 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000359 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360 fprintf(stderr, "# can't write %s\n", cpathname);
361 /* Don't keep partial file */
362 fclose(fp);
363 (void) unlink(cpathname);
364 return;
365 }
366 /* Now write the true mtime */
367 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 fflush(fp);
370 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372 fprintf(stderr, "# wrote %s\n", cpathname);
373#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000374 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375#endif
376}
377
378
379/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000380 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
381 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384load_source_module(name, pathname, fp)
385 char *name;
386 char *pathname;
387 FILE *fp;
388{
389 long mtime;
390 FILE *fpc;
391 char buf[MAXPATHLEN+1];
392 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 PyCodeObject *co;
394 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 mtime = PyOS_GetLastModificationTime(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
398 if (cpathname != NULL &&
399 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
400 co = read_compiled_module(fpc);
401 fclose(fpc);
402 if (co == NULL)
403 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405 fprintf(stderr, "import %s # precompiled from %s\n",
406 name, cpathname);
407 }
408 else {
409 co = parse_source_module(pathname, fp);
410 if (co == NULL)
411 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413 fprintf(stderr, "import %s # from %s\n",
414 name, pathname);
415 write_compiled_module(co, cpathname, mtime);
416 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 m = PyImport_ExecCodeModule(name, (PyObject *)co);
418 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419
420 return m;
421}
422
423
424/* Search the path (default sys.path) for a module. Return the
425 corresponding filedescr struct, and (via return arguments) the
426 pathname and an open file. Return NULL if the module is not found. */
427
428static struct filedescr *
429find_module(name, path, buf, buflen, p_fp)
430 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 /* Output parameters: */
433 char *buf;
434 int buflen;
435 FILE **p_fp;
436{
437 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000438 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000439 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440
Guido van Rossumac279101996-08-22 23:10:58 +0000441#ifdef MS_COREDLL
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000442 extern FILE *PyWin_FindRegisteredModule();
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000443 if ((fp=PyWin_FindRegisteredModule(name, &fdp, buf, buflen))!=NULL) {
444 *p_fp = fp;
445 return fdp;
446 }
447#endif
448
449
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 path = PySys_GetObject("path");
452 if (path == NULL || !PyList_Check(path)) {
453 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000454 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 return NULL;
456 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 namelen = strlen(name);
459 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 PyObject *v = PyList_GetItem(path, i);
461 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 len = PyString_Size(v);
464 if (len + 2 + namelen + _PyImport_MaxSuffixSize >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000467 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000469#ifdef macintosh
470 if ( PyMac_FindResourceModule(name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 static struct filedescr resfiledescr =
472 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000473
474 return &resfiledescr;
475 }
476#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 if (len > 0 && buf[len-1] != SEP)
478 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000479#ifdef IMPORT_8x3_NAMES
480 /* see if we are searching in directory dos_8x3 */
481 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
482 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000484 for (j = 0; (ch = name[j]) && j < 8; j++)
485 if (isupper(ch))
486 buf[len++] = tolower(ch);
487 else
488 buf[len++] = ch;
489 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000490 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000491#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000492 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000493 strcpy(buf+len, name);
494 len += namelen;
495 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499 fprintf(stderr, "# trying %s\n", buf);
500 fp = fopen(buf, fdp->mode);
501 if (fp != NULL)
502 break;
503 }
504 if (fp != NULL)
505 break;
506 }
507 if (fp == NULL) {
508 char buf[256];
509 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511 return NULL;
512 }
513
514 *p_fp = fp;
515 return fdp;
516}
517
518
519/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000520 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523load_module(name)
524 char *name;
525{
526 char buf[MAXPATHLEN+1];
527 struct filedescr *fdp;
528 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 if (fdp == NULL)
533 return NULL;
534
535 switch (fdp->type) {
536
537 case PY_SOURCE:
538 m = load_source_module(name, buf, fp);
539 break;
540
541 case PY_COMPILED:
542 m = load_compiled_module(name, buf, fp);
543 break;
544
545 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547 break;
548
Jack Jansen9c96a921995-02-15 22:57:06 +0000549#ifdef macintosh
550 case PY_RESOURCE:
551 m = PyMac_LoadResourceModule(name, buf);
552 break;
553#endif
554
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000558 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
560 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000561 if ( fp )
562 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563
564 return m;
565}
566
567
568/* Initialize a built-in module.
569 Return 1 for succes, 0 if the module is not found, and -1 with
570 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000571
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000572static int
573init_builtin(name)
574 char *name;
575{
576 int i;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000577 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
578 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
579 if (_PyImport_Inittab[i].initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000581 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000582 return -1;
583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if (Py_VerboseFlag)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000585 fprintf(stderr, "import %s # builtin\n",
586 name);
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000587 (*_PyImport_Inittab[i].initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000590 return 1;
591 }
592 }
593 return 0;
594}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000595
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000597/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000599static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000600find_frozen(name)
601 char *name;
602{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000603 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000604
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000606 if (p->name == NULL)
607 return NULL;
608 if (strcmp(p->name, name) == 0)
609 break;
610 }
611 return p;
612}
613
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000615get_frozen_object(name)
616 char *name;
617{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000618 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000619
620 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000622 return NULL;
623 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000625}
626
627/* Initialize a frozen module.
628 Return 1 for succes, 0 if the module is not found, and -1 with
629 an exception set if the initialization failed.
630 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000631
632int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000634 char *name;
635{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000636 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 PyObject *co;
638 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000639
640 if (p == NULL)
641 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000643 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000645 if (co == NULL)
646 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 if (!PyCode_Check(co)) {
648 Py_DECREF(co);
649 PyErr_SetString(PyExc_TypeError,
650 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000651 return -1;
652 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 m = PyImport_ExecCodeModule(name, co);
654 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000655 if (m == NULL)
656 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000658 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000659}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000660
661
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000663 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000664
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665PyObject *
666PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000668{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000670
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000671 if (_PyImport_Modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 PyErr_SetString(PyExc_SystemError,
673 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000674 return NULL;
675 }
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000676 if ((m = PyDict_GetItemString(_PyImport_Modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000678 }
679 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 if ((i = init_builtin(name)) ||
682 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (i < 0)
684 return NULL;
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000685 if ((m = PyDict_GetItemString(_PyImport_Modules,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 name)) == NULL) {
687 if (PyErr_Occurred() == NULL)
688 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 "built-in module not initialized properly");
690 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000691 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000693 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 else
695 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000696 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697
698 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000699}
700
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701
702/* Re-import a module of any kind and return its module object, WITH
703 INCREMENTED REFERENCE COUNT */
704
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705PyObject *
706PyImport_ReloadModule(m)
707 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708{
709 char *name;
710 int i;
711
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (m == NULL || !PyModule_Check(m)) {
713 PyErr_SetString(PyExc_TypeError,
714 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 return NULL;
716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 if (name == NULL)
719 return NULL;
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000720 if (_PyImport_Modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 PyErr_SetString(PyExc_SystemError,
722 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000723 return NULL;
724 }
Guido van Rossumaf5dfb41997-05-14 17:36:12 +0000725 if (m != PyDict_GetItemString(_PyImport_Modules, name)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 PyErr_SetString(PyExc_ImportError,
727 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728 return NULL;
729 }
730 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 if ((i = init_builtin(name)) ||
732 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733 if (i < 0)
734 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 }
737 else
738 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 return m;
740}
741
742
743/* Module 'imp' provides Python access to the primitives used for
744 importing modules.
745*/
746
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 PyObject *self;
750 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751{
752 char buf[4];
753
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000756 buf[0] = (char) ((MAGIC >> 0) & 0xff);
757 buf[1] = (char) ((MAGIC >> 8) & 0xff);
758 buf[2] = (char) ((MAGIC >> 16) & 0xff);
759 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762}
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 PyObject *self;
767 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770 struct filedescr *fdp;
771
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 if (list == NULL)
776 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
778 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779 fdp->suffix, fdp->mode, fdp->type);
780 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782 return NULL;
783 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 if (PyList_Append(list, item) < 0) {
785 Py_DECREF(list);
786 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787 return NULL;
788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790 }
791 return list;
792}
793
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 PyObject *self;
797 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 PyObject *path = NULL;
802 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 struct filedescr *fdp;
804 char pathname[MAXPATHLEN+1];
805 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 return NULL;
808 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
809 if (fdp == NULL)
810 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 if (fob == NULL) {
813 fclose(fp);
814 return NULL;
815 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819 return ret;
820}
821
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyObject *self;
825 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826{
827 char *name;
828 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 PyObject *m;
830 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831 return NULL;
832 ret = init_builtin(name);
833 if (ret < 0)
834 return NULL;
835 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 Py_INCREF(Py_None);
837 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 m = PyImport_AddModule(name);
840 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 return m;
842}
843
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 PyObject *self;
847 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848{
849 char *name;
850 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 PyObject *m;
852 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000855 if (ret < 0)
856 return NULL;
857 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 Py_INCREF(Py_None);
859 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000860 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 m = PyImport_AddModule(name);
862 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863 return m;
864}
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000867imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyObject *self;
869 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000870{
871 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000872
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000874 return NULL;
875 return get_frozen_object(name);
876}
877
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 PyObject *self;
881 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882{
883 int i;
884 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000887 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
888 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
889 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 }
894 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896}
897
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 PyObject *self;
901 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000903 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000906 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908 if (p->name == NULL)
909 break;
910 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914}
915
916static FILE *
917get_file(pathname, fob, mode)
918 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920 char *mode;
921{
922 FILE *fp;
923 if (fob == NULL) {
924 fp = fopen(pathname, mode);
925 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 }
928 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyErr_SetString(PyExc_ValueError,
932 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 }
934 return fp;
935}
936
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyObject *self;
940 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941{
942 char *name;
943 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 PyObject *fob = NULL;
945 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000946 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
948 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 return NULL;
950 fp = get_file(pathname, fob, "rb");
951 if (fp == NULL)
952 return NULL;
953 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954 return m;
955}
956
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 PyObject *self;
960 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961{
962 char *name;
963 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 PyObject *fob = NULL;
965 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000966 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
968 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000970 if (fob)
971 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +0000973 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000974}
975
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *self;
979 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000980{
981 char *name;
982 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyObject *fob = NULL;
984 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
987 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988 return NULL;
989 fp = get_file(pathname, fob, "r");
990 if (fp == NULL)
991 return NULL;
992 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993 return m;
994}
995
Jack Jansen9c96a921995-02-15 22:57:06 +0000996#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +0000998imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 PyObject *self;
1000 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001001{
1002 char *name;
1003 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001004 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001005
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001007 return NULL;
1008 m = PyMac_LoadResourceModule(name, pathname);
1009 return m;
1010}
1011#endif /* macintosh */
1012
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 PyObject *self;
1016 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017{
1018 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022}
1023
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001025 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 {"get_magic", imp_get_magic, 1},
1027 {"get_suffixes", imp_get_suffixes, 1},
1028 {"find_module", imp_find_module, 1},
1029 {"init_builtin", imp_init_builtin, 1},
1030 {"init_frozen", imp_init_frozen, 1},
1031 {"is_builtin", imp_is_builtin, 1},
1032 {"is_frozen", imp_is_frozen, 1},
1033 {"load_compiled", imp_load_compiled, 1},
1034 {"load_dynamic", imp_load_dynamic, 1},
1035 {"load_source", imp_load_source, 1},
1036 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001037#ifdef macintosh
1038 {"load_resource", imp_load_resource, 1},
1039#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040 {NULL, NULL} /* sentinel */
1041};
1042
1043void
1044initimp()
1045{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 m = Py_InitModule("imp", imp_methods);
1049 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001050
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 v = PyInt_FromLong(SEARCH_ERROR);
1052 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1053 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001054
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 v = PyInt_FromLong(PY_SOURCE);
1056 PyDict_SetItemString(d, "PY_SOURCE", v);
1057 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 v = PyInt_FromLong(PY_COMPILED);
1060 PyDict_SetItemString(d, "PY_COMPILED", v);
1061 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063 v = PyInt_FromLong(C_EXTENSION);
1064 PyDict_SetItemString(d, "C_EXTENSION", v);
1065 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066
Jack Jansenae12e191995-06-18 20:06:44 +00001067#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 v = PyInt_FromLong(PY_RESOURCE);
1069 PyDict_SetItemString(d, "PY_RESOURCE", v);
1070 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001071#endif
1072
1073
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 if (PyErr_Occurred())
1075 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076}