blob: f2d80401d6acf73d0b4dc6a31a839f7035c2c9f0 [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 Rossum79f25d91997-04-29 20:08:16 +000064PyObject *import_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 Rossum1ae940a1995-01-02 19:04:15 +000072 if (import_modules != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 Py_FatalError("duplicate initimport() call");
74 if ((import_modules = PyDict_New()) == NULL)
75 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 Rossum1ae940a1995-01-02 19:04:15 +000092 if (import_modules != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000093 PyObject *tmp = import_modules;
Guido van Rossum0de81bf1995-01-26 00:41:28 +000094 import_modules = NULL;
95 /* 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{
121 return import_modules;
122}
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 Rossum0de81bf1995-01-26 00:41:28 +0000137 if (import_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 Rossum79f25d91997-04-29 20:08:16 +0000142 if ((m = PyDict_GetItemString(import_modules, name)) != NULL &&
143 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 Rossum79f25d91997-04-29 20:08:16 +0000148 if (PyDict_SetItemString(import_modules, name, m) != 0) {
149 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);
185 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000186
187 return m;
188}
189
190
191/* Given a pathname for a Python source file, fill a buffer with the
192 pathname for the corresponding compiled file. Return the pathname
193 for the compiled file, or NULL if there's no space in the buffer.
194 Doesn't set an exception. */
195
196static char *
197make_compiled_pathname(pathname, buf, buflen)
198 char *pathname;
199 char *buf;
200 int buflen;
201{
202 int len;
203
204 len = strlen(pathname);
205 if (len+2 > buflen)
206 return NULL;
207 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000208 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000209
210 return buf;
211}
212
213
214/* Given a pathname for a Python source file, its time of last
215 modification, and a pathname for a compiled file, check whether the
216 compiled file represents the same version of the source. If so,
217 return a FILE pointer for the compiled file, positioned just after
218 the header; if not, return NULL.
219 Doesn't set an exception. */
220
221static FILE *
222check_compiled_module(pathname, mtime, cpathname)
223 char *pathname;
224 long mtime;
225 char *cpathname;
226{
227 FILE *fp;
228 long magic;
229 long pyc_mtime;
230
231 fp = fopen(cpathname, "rb");
232 if (fp == NULL)
233 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000237 fprintf(stderr, "# %s has bad magic\n", cpathname);
238 fclose(fp);
239 return NULL;
240 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000242 if (pyc_mtime != mtime) {
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 mtime\n", cpathname);
245 fclose(fp);
246 return NULL;
247 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
250 return fp;
251}
252
253
254/* Read a code object from a file and check it for validity */
255
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000257read_compiled_module(fp)
258 FILE *fp;
259{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000261
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 if (co == NULL || !PyCode_Check(co)) {
265 if (!PyErr_Occurred())
266 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000267 "Non-code object in .pyc file");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000269 return NULL;
270 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272}
273
274
275/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000276 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000277
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279load_compiled_module(name, cpathname, fp)
280 char *name;
281 char *cpathname;
282 FILE *fp;
283{
284 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 PyCodeObject *co;
286 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000289 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 PyErr_SetString(PyExc_ImportError,
291 "Bad magic number in .pyc file");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000292 return NULL;
293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295 co = read_compiled_module(fp);
296 if (co == NULL)
297 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299 fprintf(stderr, "import %s # precompiled from %s\n",
300 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 m = PyImport_ExecCodeModule(name, (PyObject *)co);
302 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000303
304 return m;
305}
306
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000307/* Parse a source file and return the corresponding code object */
308
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310parse_source_module(pathname, fp)
311 char *pathname;
312 FILE *fp;
313{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315 node *n;
316
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000317 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318 if (n == NULL)
319 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 co = PyNode_Compile(n, pathname);
321 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000322
323 return co;
324}
325
326
327/* Write a compiled module to a file, placing the time of last
328 modification of its source into the header.
329 Errors are ignored, if a write error occurs an attempt is made to
330 remove the file. */
331
332static void
333write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000335 char *cpathname;
336 long mtime;
337{
338 FILE *fp;
339
340 fp = fopen(cpathname, "wb");
341 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000343 fprintf(stderr,
344 "# can't create %s\n", cpathname);
345 return;
346 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000348 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 PyMarshal_WriteLongToFile(0L, fp);
350 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353 fprintf(stderr, "# can't write %s\n", cpathname);
354 /* Don't keep partial file */
355 fclose(fp);
356 (void) unlink(cpathname);
357 return;
358 }
359 /* Now write the true mtime */
360 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362 fflush(fp);
363 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000365 fprintf(stderr, "# wrote %s\n", cpathname);
366#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000367 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368#endif
369}
370
371
372/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000373 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
374 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377load_source_module(name, pathname, fp)
378 char *name;
379 char *pathname;
380 FILE *fp;
381{
382 long mtime;
383 FILE *fpc;
384 char buf[MAXPATHLEN+1];
385 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 PyCodeObject *co;
387 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 mtime = PyOS_GetLastModificationTime(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
391 if (cpathname != NULL &&
392 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
393 co = read_compiled_module(fpc);
394 fclose(fpc);
395 if (co == NULL)
396 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000398 fprintf(stderr, "import %s # precompiled from %s\n",
399 name, cpathname);
400 }
401 else {
402 co = parse_source_module(pathname, fp);
403 if (co == NULL)
404 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000406 fprintf(stderr, "import %s # from %s\n",
407 name, pathname);
408 write_compiled_module(co, cpathname, mtime);
409 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410 m = PyImport_ExecCodeModule(name, (PyObject *)co);
411 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000412
413 return m;
414}
415
416
417/* Search the path (default sys.path) for a module. Return the
418 corresponding filedescr struct, and (via return arguments) the
419 pathname and an open file. Return NULL if the module is not found. */
420
421static struct filedescr *
422find_module(name, path, buf, buflen, p_fp)
423 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 /* Output parameters: */
426 char *buf;
427 int buflen;
428 FILE **p_fp;
429{
430 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000431 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000432 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433
Guido van Rossumac279101996-08-22 23:10:58 +0000434#ifdef MS_COREDLL
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000435 extern FILE *PyWin_FindRegisteredModule();
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000436 if ((fp=PyWin_FindRegisteredModule(name, &fdp, buf, buflen))!=NULL) {
437 *p_fp = fp;
438 return fdp;
439 }
440#endif
441
442
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 path = PySys_GetObject("path");
445 if (path == NULL || !PyList_Check(path)) {
446 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000447 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 return NULL;
449 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451 namelen = strlen(name);
452 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 PyObject *v = PyList_GetItem(path, i);
454 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 len = PyString_Size(v);
457 if (len + 2 + namelen + _PyImport_MaxSuffixSize >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000460 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000462#ifdef macintosh
463 if ( PyMac_FindResourceModule(name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 static struct filedescr resfiledescr =
465 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000466
467 return &resfiledescr;
468 }
469#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 if (len > 0 && buf[len-1] != SEP)
471 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000472#ifdef IMPORT_8x3_NAMES
473 /* see if we are searching in directory dos_8x3 */
474 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
475 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000477 for (j = 0; (ch = name[j]) && j < 8; j++)
478 if (isupper(ch))
479 buf[len++] = tolower(ch);
480 else
481 buf[len++] = ch;
482 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000483 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000484#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000485 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000486 strcpy(buf+len, name);
487 len += namelen;
488 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000492 fprintf(stderr, "# trying %s\n", buf);
493 fp = fopen(buf, fdp->mode);
494 if (fp != NULL)
495 break;
496 }
497 if (fp != NULL)
498 break;
499 }
500 if (fp == NULL) {
501 char buf[256];
502 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 return NULL;
505 }
506
507 *p_fp = fp;
508 return fdp;
509}
510
511
512/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000513 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516load_module(name)
517 char *name;
518{
519 char buf[MAXPATHLEN+1];
520 struct filedescr *fdp;
521 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 if (fdp == NULL)
526 return NULL;
527
528 switch (fdp->type) {
529
530 case PY_SOURCE:
531 m = load_source_module(name, buf, fp);
532 break;
533
534 case PY_COMPILED:
535 m = load_compiled_module(name, buf, fp);
536 break;
537
538 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540 break;
541
Jack Jansen9c96a921995-02-15 22:57:06 +0000542#ifdef macintosh
543 case PY_RESOURCE:
544 m = PyMac_LoadResourceModule(name, buf);
545 break;
546#endif
547
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000550 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000551 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000552
553 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000554 if ( fp )
555 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000556
557 return m;
558}
559
560
561/* Initialize a built-in module.
562 Return 1 for succes, 0 if the module is not found, and -1 with
563 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000564
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000565static int
566init_builtin(name)
567 char *name;
568{
569 int i;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000570 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
571 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
572 if (_PyImport_Inittab[i].initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000574 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000575 return -1;
576 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (Py_VerboseFlag)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000578 fprintf(stderr, "import %s # builtin\n",
579 name);
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000580 (*_PyImport_Inittab[i].initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000583 return 1;
584 }
585 }
586 return 0;
587}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000588
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000590/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000592static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000593find_frozen(name)
594 char *name;
595{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000596 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000597
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000599 if (p->name == NULL)
600 return NULL;
601 if (strcmp(p->name, name) == 0)
602 break;
603 }
604 return p;
605}
606
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000608get_frozen_object(name)
609 char *name;
610{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000611 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000612
613 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000615 return NULL;
616 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000618}
619
620/* Initialize a frozen module.
621 Return 1 for succes, 0 if the module is not found, and -1 with
622 an exception set if the initialization failed.
623 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000624
625int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000627 char *name;
628{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000629 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 PyObject *co;
631 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000632
633 if (p == NULL)
634 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000636 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000638 if (co == NULL)
639 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 if (!PyCode_Check(co)) {
641 Py_DECREF(co);
642 PyErr_SetString(PyExc_TypeError,
643 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000644 return -1;
645 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 m = PyImport_ExecCodeModule(name, co);
647 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000648 if (m == NULL)
649 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000651 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000652}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000653
654
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000655/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000656 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000657
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658PyObject *
659PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000661{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000663
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000664 if (import_modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyErr_SetString(PyExc_SystemError,
666 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000667 return NULL;
668 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if ((m = PyDict_GetItemString(import_modules, name)) != NULL) {
670 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000671 }
672 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if ((i = init_builtin(name)) ||
675 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 if (i < 0)
677 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 if ((m = PyDict_GetItemString(import_modules,
679 name)) == NULL) {
680 if (PyErr_Occurred() == NULL)
681 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682 "built-in module not initialized properly");
683 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000684 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000686 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687 else
688 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000689 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690
691 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000692}
693
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694
695/* Re-import a module of any kind and return its module object, WITH
696 INCREMENTED REFERENCE COUNT */
697
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698PyObject *
699PyImport_ReloadModule(m)
700 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701{
702 char *name;
703 int i;
704
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 if (m == NULL || !PyModule_Check(m)) {
706 PyErr_SetString(PyExc_TypeError,
707 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 return NULL;
709 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 if (name == NULL)
712 return NULL;
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000713 if (import_modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyErr_SetString(PyExc_SystemError,
715 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000716 return NULL;
717 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (m != PyDict_GetItemString(import_modules, name)) {
719 PyErr_SetString(PyExc_ImportError,
720 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721 return NULL;
722 }
723 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 if ((i = init_builtin(name)) ||
725 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 if (i < 0)
727 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 }
730 else
731 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 return m;
733}
734
735
736/* Module 'imp' provides Python access to the primitives used for
737 importing modules.
738*/
739
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 PyObject *self;
743 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744{
745 char buf[4];
746
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000749 buf[0] = (char) ((MAGIC >> 0) & 0xff);
750 buf[1] = (char) ((MAGIC >> 8) & 0xff);
751 buf[2] = (char) ((MAGIC >> 16) & 0xff);
752 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755}
756
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 PyObject *self;
760 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 struct filedescr *fdp;
764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768 if (list == NULL)
769 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
771 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772 fdp->suffix, fdp->mode, fdp->type);
773 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 return NULL;
776 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 if (PyList_Append(list, item) < 0) {
778 Py_DECREF(list);
779 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780 return NULL;
781 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 }
784 return list;
785}
786
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 PyObject *self;
790 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 PyObject *path = NULL;
795 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 struct filedescr *fdp;
797 char pathname[MAXPATHLEN+1];
798 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 return NULL;
801 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
802 if (fdp == NULL)
803 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805 if (fob == NULL) {
806 fclose(fp);
807 return NULL;
808 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 return ret;
813}
814
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 PyObject *self;
818 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819{
820 char *name;
821 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 PyObject *m;
823 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824 return NULL;
825 ret = init_builtin(name);
826 if (ret < 0)
827 return NULL;
828 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 Py_INCREF(Py_None);
830 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 m = PyImport_AddModule(name);
833 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834 return m;
835}
836
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyObject *self;
840 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841{
842 char *name;
843 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyObject *m;
845 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 if (ret < 0)
849 return NULL;
850 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 Py_INCREF(Py_None);
852 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 m = PyImport_AddModule(name);
855 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 return m;
857}
858
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000860imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 PyObject *self;
862 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000863{
864 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000867 return NULL;
868 return get_frozen_object(name);
869}
870
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 PyObject *self;
874 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875{
876 int i;
877 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000880 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
881 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
882 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 }
887 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889}
890
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyObject *self;
894 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000896 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901 if (p->name == NULL)
902 break;
903 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000905 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907}
908
909static FILE *
910get_file(pathname, fob, mode)
911 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913 char *mode;
914{
915 FILE *fp;
916 if (fob == NULL) {
917 fp = fopen(pathname, mode);
918 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920 }
921 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 PyErr_SetString(PyExc_ValueError,
925 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 }
927 return fp;
928}
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyObject *self;
933 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934{
935 char *name;
936 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 PyObject *fob = NULL;
938 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
941 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 return NULL;
943 fp = get_file(pathname, fob, "rb");
944 if (fp == NULL)
945 return NULL;
946 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947 return m;
948}
949
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000951imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 PyObject *self;
953 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954{
955 char *name;
956 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyObject *fob = NULL;
958 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000959 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
961 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000963 if (fob)
964 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +0000966 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967}
968
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 PyObject *self;
972 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973{
974 char *name;
975 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 PyObject *fob = NULL;
977 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
980 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981 return NULL;
982 fp = get_file(pathname, fob, "r");
983 if (fp == NULL)
984 return NULL;
985 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 return m;
987}
988
Jack Jansen9c96a921995-02-15 22:57:06 +0000989#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +0000990static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +0000991imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 PyObject *self;
993 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +0000994{
995 char *name;
996 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +0000998
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001000 return NULL;
1001 m = PyMac_LoadResourceModule(name, pathname);
1002 return m;
1003}
1004#endif /* macintosh */
1005
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 PyObject *self;
1009 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010{
1011 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015}
1016
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001018 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 {"get_magic", imp_get_magic, 1},
1020 {"get_suffixes", imp_get_suffixes, 1},
1021 {"find_module", imp_find_module, 1},
1022 {"init_builtin", imp_init_builtin, 1},
1023 {"init_frozen", imp_init_frozen, 1},
1024 {"is_builtin", imp_is_builtin, 1},
1025 {"is_frozen", imp_is_frozen, 1},
1026 {"load_compiled", imp_load_compiled, 1},
1027 {"load_dynamic", imp_load_dynamic, 1},
1028 {"load_source", imp_load_source, 1},
1029 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001030#ifdef macintosh
1031 {"load_resource", imp_load_resource, 1},
1032#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033 {NULL, NULL} /* sentinel */
1034};
1035
1036void
1037initimp()
1038{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 m = Py_InitModule("imp", imp_methods);
1042 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 v = PyInt_FromLong(SEARCH_ERROR);
1045 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1046 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 v = PyInt_FromLong(PY_SOURCE);
1049 PyDict_SetItemString(d, "PY_SOURCE", v);
1050 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 v = PyInt_FromLong(PY_COMPILED);
1053 PyDict_SetItemString(d, "PY_COMPILED", v);
1054 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 v = PyInt_FromLong(C_EXTENSION);
1057 PyDict_SetItemString(d, "C_EXTENSION", v);
1058 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059
Jack Jansenae12e191995-06-18 20:06:44 +00001060#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 v = PyInt_FromLong(PY_RESOURCE);
1062 PyDict_SetItemString(d, "PY_RESOURCE", v);
1063 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001064#endif
1065
1066
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 if (PyErr_Occurred())
1068 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001069}