blob: fe24b2816f3536e7062233af9d81e429af1839be [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossum79f25d91997-04-29 20:08:16 +000052extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000053
Guido van Rossum6c849691994-09-26 15:47:17 +000054/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000055/* Change for each incompatible change */
56/* The value of CR and LF is incorporated so if you ever read or write
57 a .pyc file in text mode the magic number will be wrong; also, the
58 Apple MPW compiler swaps their values, botching string constants */
59/* XXX Perhaps the magic number should be frozen and a version field
60 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000061/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000062#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000063
Guido van Rossum25ce5661997-08-02 03:10:38 +000064/* See _PyImport_FixupExtension() below */
65static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000066
Guido van Rossum66f1fa81991-04-03 19:03:52 +000067
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069
70void
Guido van Rossum25ce5661997-08-02 03:10:38 +000071_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072{
Guido van Rossum0824f631997-03-11 18:37:35 +000073 if (Py_OptimizeFlag) {
74 /* Replace ".pyc" with ".pyo" in import_filetab */
75 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000077 if (strcmp(p->suffix, ".pyc") == 0)
78 p->suffix = ".pyo";
79 }
80 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Guido van Rossum25ce5661997-08-02 03:10:38 +000083void
84_PyImport_Fini()
85{
86 Py_XDECREF(extensions);
87 extensions = NULL;
88}
89
90
91/* Helper for sys */
92
93PyObject *
94PyImport_GetModuleDict()
95{
96 PyInterpreterState *interp = PyThreadState_Get()->interp;
97 if (interp->modules == NULL)
98 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
99 return interp->modules;
100}
101
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102
Guido van Rossum085d2691997-08-05 02:20:51 +0000103/* Helper for PyImport_Cleanup */
104
105static void
106clear_carefully(d)
107 PyObject *d;
108{
109 /* To make the execution order of destructors for global
110 objects a bit more predictable, we first zap all objects
111 whose name starts with a single underscore, before we clear
112 the entire dictionary. We zap them by replacing them with
113 None, rather than deleting them from the dictionary, to
114 avoid rehashing the dictionary (to some extent). */
115
116 int pos;
117 PyObject *key, *value;
118
119 pos = 0;
120 while (PyDict_Next(d, &pos, &key, &value)) {
121 if (value != Py_None && PyString_Check(key)) {
122 char *s = PyString_AsString(key);
123 if (s[0] == '_' && s[1] != '_')
124 PyDict_SetItem(d, key, Py_None);
125 }
126 }
127
128 PyDict_Clear(d);
129}
130
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132
Guido van Rossum3f5da241990-12-20 15:06:42 +0000133void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136 PyInterpreterState *interp = PyThreadState_Get()->interp;
137 PyObject *tmp = interp->modules;
138 if (tmp != NULL) {
139 int pos;
140 PyObject *key, *value;
141 interp->modules = NULL;
142 pos = 0;
143 while (PyDict_Next(tmp, &pos, &key, &value)) {
144 if (PyModule_Check(value)) {
145 PyObject *d = PyModule_GetDict(value);
Guido van Rossum085d2691997-08-05 02:20:51 +0000146 clear_carefully(d);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 }
148 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 PyDict_Clear(tmp);
150 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000152}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000153
154
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155/* Helper for pythonrun.c -- return magic number */
156
157long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159{
160 return MAGIC;
161}
162
163
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164/* Magic for extension modules (built-in as well as dynamically
165 loaded). To prevent initializing an extension module more than
166 once, we keep a static dictionary 'extensions' keyed by module name
167 (for built-in modules) or by filename (for dynamically loaded
168 modules), containing these modules. A copy od the module's
169 dictionary is stored by calling _PyImport_FixupExtension()
170 immediately after the module initialization function succeeds. A
171 copy can be retrieved from there by calling
172 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000173
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000175_PyImport_FixupExtension(name, filename)
176 char *name;
177 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000178{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000179 PyObject *modules, *mod, *dict, *copy;
180 if (extensions == NULL) {
181 extensions = PyDict_New();
182 if (extensions == NULL)
183 return NULL;
184 }
185 modules = PyImport_GetModuleDict();
186 mod = PyDict_GetItemString(modules, name);
187 if (mod == NULL || !PyModule_Check(mod)) {
188 PyErr_SetString(PyExc_SystemError,
189 "_PyImport_FixupExtension: module not loaded");
190 return NULL;
191 }
192 dict = PyModule_GetDict(mod);
193 if (dict == NULL)
194 return NULL;
195 copy = PyObject_CallMethod(dict, "copy", "");
196 if (copy == NULL)
197 return NULL;
198 PyDict_SetItemString(extensions, filename, copy);
199 Py_DECREF(copy);
200 return copy;
201}
202
203PyObject *
204_PyImport_FindExtension(name, filename)
205 char *name;
206 char *filename;
207{
208 PyObject *dict, *mod, *mdict, *result;
209 if (extensions == NULL)
210 return NULL;
211 dict = PyDict_GetItemString(extensions, filename);
212 if (dict == NULL)
213 return NULL;
214 mod = PyImport_AddModule(name);
215 if (mod == NULL)
216 return NULL;
217 mdict = PyModule_GetDict(mod);
218 if (mdict == NULL)
219 return NULL;
220 result = PyObject_CallMethod(mdict, "update", "O", dict);
221 if (result == NULL)
222 return NULL;
223 Py_DECREF(result);
224 if (Py_VerboseFlag)
225 fprintf(stderr, "import %s # previously loaded (%s)\n",
226 name, filename);
227 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000228}
229
230
231/* Get the module object corresponding to a module name.
232 First check the modules dictionary if there's one there,
233 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000234 Because the former action is most common, THIS DOES NOT RETURN A
235 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000236
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237PyObject *
238PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000239 char *name;
240{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000241 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000243
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000246 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248 if (m == NULL)
249 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000250 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252 return NULL;
253 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000255
256 return m;
257}
258
259
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000260/* Execute a code object in a module and return the module object
261 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000262
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263PyObject *
264PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000265 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000267{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272 if (m == NULL)
273 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 d = PyModule_GetDict(m);
275 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
276 if (PyDict_SetItemString(d, "__builtins__",
277 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000278 return NULL;
279 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000280 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 if (PyDict_SetItemString(d, "__file__",
282 ((PyCodeObject *)co)->co_filename) != 0)
283 PyErr_Clear(); /* Not important enough to report */
284 v = PyEval_EvalCode((PyCodeObject *)co, d, d); /* XXX owner? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285 if (v == NULL)
286 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000288
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000290 PyErr_SetString(PyExc_SystemError,
291 "loaded module not found in sys.modules");
292 return NULL;
293 }
294
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000296
297 return m;
298}
299
300
301/* Given a pathname for a Python source file, fill a buffer with the
302 pathname for the corresponding compiled file. Return the pathname
303 for the compiled file, or NULL if there's no space in the buffer.
304 Doesn't set an exception. */
305
306static char *
307make_compiled_pathname(pathname, buf, buflen)
308 char *pathname;
309 char *buf;
310 int buflen;
311{
312 int len;
313
314 len = strlen(pathname);
315 if (len+2 > buflen)
316 return NULL;
317 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000318 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000319
320 return buf;
321}
322
323
324/* Given a pathname for a Python source file, its time of last
325 modification, and a pathname for a compiled file, check whether the
326 compiled file represents the same version of the source. If so,
327 return a FILE pointer for the compiled file, positioned just after
328 the header; if not, return NULL.
329 Doesn't set an exception. */
330
331static FILE *
332check_compiled_module(pathname, mtime, cpathname)
333 char *pathname;
334 long mtime;
335 char *cpathname;
336{
337 FILE *fp;
338 long magic;
339 long pyc_mtime;
340
341 fp = fopen(cpathname, "rb");
342 if (fp == NULL)
343 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000347 fprintf(stderr, "# %s has bad magic\n", cpathname);
348 fclose(fp);
349 return NULL;
350 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000352 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354 fprintf(stderr, "# %s has bad mtime\n", cpathname);
355 fclose(fp);
356 return NULL;
357 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000359 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
360 return fp;
361}
362
363
364/* Read a code object from a file and check it for validity */
365
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000367read_compiled_module(fp)
368 FILE *fp;
369{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 if (co == NULL || !PyCode_Check(co)) {
375 if (!PyErr_Occurred())
376 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377 "Non-code object in .pyc file");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000378 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379 return NULL;
380 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382}
383
384
385/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000386 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389load_compiled_module(name, cpathname, fp)
390 char *name;
391 char *cpathname;
392 FILE *fp;
393{
394 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyCodeObject *co;
396 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 PyErr_SetString(PyExc_ImportError,
401 "Bad magic number in .pyc file");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000402 return NULL;
403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405 co = read_compiled_module(fp);
406 if (co == NULL)
407 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 fprintf(stderr, "import %s # precompiled from %s\n",
410 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 m = PyImport_ExecCodeModule(name, (PyObject *)co);
412 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
414 return m;
415}
416
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417/* Parse a source file and return the corresponding code object */
418
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420parse_source_module(pathname, fp)
421 char *pathname;
422 FILE *fp;
423{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 node *n;
426
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000427 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 if (n == NULL)
429 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 co = PyNode_Compile(n, pathname);
431 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432
433 return co;
434}
435
436
437/* Write a compiled module to a file, placing the time of last
438 modification of its source into the header.
439 Errors are ignored, if a write error occurs an attempt is made to
440 remove the file. */
441
442static void
443write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445 char *cpathname;
446 long mtime;
447{
448 FILE *fp;
449
450 fp = fopen(cpathname, "wb");
451 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 fprintf(stderr,
454 "# can't create %s\n", cpathname);
455 return;
456 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyMarshal_WriteLongToFile(0L, fp);
460 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 fprintf(stderr, "# can't write %s\n", cpathname);
464 /* Don't keep partial file */
465 fclose(fp);
466 (void) unlink(cpathname);
467 return;
468 }
469 /* Now write the true mtime */
470 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472 fflush(fp);
473 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 fprintf(stderr, "# wrote %s\n", cpathname);
476#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000477 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000478#endif
479}
480
481
482/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000483 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
484 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000485
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487load_source_module(name, pathname, fp)
488 char *name;
489 char *pathname;
490 FILE *fp;
491{
492 long mtime;
493 FILE *fpc;
494 char buf[MAXPATHLEN+1];
495 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 PyCodeObject *co;
497 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 mtime = PyOS_GetLastModificationTime(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
501 if (cpathname != NULL &&
502 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
503 co = read_compiled_module(fpc);
504 fclose(fpc);
505 if (co == NULL)
506 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508 fprintf(stderr, "import %s # precompiled from %s\n",
509 name, cpathname);
510 }
511 else {
512 co = parse_source_module(pathname, fp);
513 if (co == NULL)
514 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 fprintf(stderr, "import %s # from %s\n",
517 name, pathname);
518 write_compiled_module(co, cpathname, mtime);
519 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 m = PyImport_ExecCodeModule(name, (PyObject *)co);
521 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522
523 return m;
524}
525
526
527/* Search the path (default sys.path) for a module. Return the
528 corresponding filedescr struct, and (via return arguments) the
529 pathname and an open file. Return NULL if the module is not found. */
530
531static struct filedescr *
532find_module(name, path, buf, buflen, p_fp)
533 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 /* Output parameters: */
536 char *buf;
537 int buflen;
538 FILE **p_fp;
539{
540 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000541 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000542 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543
Guido van Rossumac279101996-08-22 23:10:58 +0000544#ifdef MS_COREDLL
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000545 extern FILE *PyWin_FindRegisteredModule();
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000546 if ((fp=PyWin_FindRegisteredModule(name, &fdp, buf, buflen))!=NULL) {
547 *p_fp = fp;
548 return fdp;
549 }
550#endif
551
552
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 path = PySys_GetObject("path");
555 if (path == NULL || !PyList_Check(path)) {
556 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000557 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 return NULL;
559 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000561 namelen = strlen(name);
562 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyObject *v = PyList_GetItem(path, i);
564 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000567 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000570 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000572#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000573#ifdef INTERN_STRINGS
574 /*
575 ** Speedup: each sys.path item is interned, and
576 ** FindResourceModule remembers which items refer to
577 ** folders (so we don't have to bother trying to look
578 ** into them for resources).
579 */
580 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
581 v = PyList_GET_ITEM(path, i);
582#endif
583 if ( PyMac_FindResourceModule((PyStringObject *)v, name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 static struct filedescr resfiledescr =
585 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000586
587 return &resfiledescr;
588 }
589#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 if (len > 0 && buf[len-1] != SEP)
591 buf[len++] = SEP;
Guido van Rossum741689d1997-08-12 14:53:39 +0000592#ifdef macintosh
593 fdp = PyMac_FindModuleExtension(buf, &len, name);
594 if ( fdp )
595 fp = fopen(buf, fdp->mode);
596#else
Guido van Rossum40f470f1996-05-23 22:51:04 +0000597#ifdef IMPORT_8x3_NAMES
598 /* see if we are searching in directory dos_8x3 */
599 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
600 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000602 for (j = 0; (ch = name[j]) && j < 8; j++)
603 if (isupper(ch))
604 buf[len++] = tolower(ch);
605 else
606 buf[len++] = ch;
607 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000608 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000609#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000610 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000611 strcpy(buf+len, name);
612 len += namelen;
613 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617 fprintf(stderr, "# trying %s\n", buf);
618 fp = fopen(buf, fdp->mode);
619 if (fp != NULL)
620 break;
621 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000622#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623 if (fp != NULL)
624 break;
625 }
626 if (fp == NULL) {
627 char buf[256];
628 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 return NULL;
631 }
632
633 *p_fp = fp;
634 return fdp;
635}
636
637
638/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000639 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642load_module(name)
643 char *name;
644{
645 char buf[MAXPATHLEN+1];
646 struct filedescr *fdp;
647 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651 if (fdp == NULL)
652 return NULL;
653
654 switch (fdp->type) {
655
656 case PY_SOURCE:
657 m = load_source_module(name, buf, fp);
658 break;
659
660 case PY_COMPILED:
661 m = load_compiled_module(name, buf, fp);
662 break;
663
664 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666 break;
667
Jack Jansen9c96a921995-02-15 22:57:06 +0000668#ifdef macintosh
669 case PY_RESOURCE:
670 m = PyMac_LoadResourceModule(name, buf);
671 break;
672#endif
673
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000677 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678
679 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000680 if ( fp )
681 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682
683 return m;
684}
685
686
687/* Initialize a built-in module.
688 Return 1 for succes, 0 if the module is not found, and -1 with
689 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000690
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000691static int
692init_builtin(name)
693 char *name;
694{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000695 struct _inittab *p;
696 PyObject *mod;
697
698 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
699 return 1;
700
701 for (p = _PyImport_Inittab; p->name != NULL; p++) {
702 if (strcmp(name, p->name) == 0) {
703 if (p->initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000705 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000706 return -1;
707 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000709 fprintf(stderr, "import %s # builtin\n", name);
710 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000713 if (_PyImport_FixupExtension(name, name) == NULL)
714 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000715 return 1;
716 }
717 }
718 return 0;
719}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000720
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000722/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000724static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000725find_frozen(name)
726 char *name;
727{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000728 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000729
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000731 if (p->name == NULL)
732 return NULL;
733 if (strcmp(p->name, name) == 0)
734 break;
735 }
736 return p;
737}
738
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000740get_frozen_object(name)
741 char *name;
742{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000743 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000744
745 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000747 return NULL;
748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000750}
751
752/* Initialize a frozen module.
753 Return 1 for succes, 0 if the module is not found, and -1 with
754 an exception set if the initialization failed.
755 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000756
757int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000759 char *name;
760{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000761 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 PyObject *co;
763 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000764
765 if (p == NULL)
766 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000768 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000770 if (co == NULL)
771 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 if (!PyCode_Check(co)) {
773 Py_DECREF(co);
774 PyErr_SetString(PyExc_TypeError,
775 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000776 return -1;
777 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 m = PyImport_ExecCodeModule(name, co);
779 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000780 if (m == NULL)
781 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000783 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000784}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000785
786
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000788 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000789
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790PyObject *
791PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000792 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000793{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000794 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000796
Guido van Rossum25ce5661997-08-02 03:10:38 +0000797 if ((m = PyDict_GetItemString(modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000799 }
800 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000801 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 if ((i = init_builtin(name)) ||
803 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 if (i < 0)
805 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000806 if ((m = PyDict_GetItemString(modules,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 name)) == NULL) {
808 if (PyErr_Occurred() == NULL)
809 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 "built-in module not initialized properly");
811 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000812 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000814 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 else
816 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000817 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818
819 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000820}
821
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822
823/* Re-import a module of any kind and return its module object, WITH
824 INCREMENTED REFERENCE COUNT */
825
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826PyObject *
827PyImport_ReloadModule(m)
828 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000830 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831 char *name;
832 int i;
833
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 if (m == NULL || !PyModule_Check(m)) {
835 PyErr_SetString(PyExc_TypeError,
836 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837 return NULL;
838 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840 if (name == NULL)
841 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000842 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyErr_SetString(PyExc_ImportError,
844 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845 return NULL;
846 }
847 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 if ((i = init_builtin(name)) ||
849 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850 if (i < 0)
851 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 }
854 else
855 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 return m;
857}
858
859
Guido van Rossumd47a0a81997-08-14 20:11:26 +0000860/* Higher-level import emulator which emulates the "import" statement
861 more accurately -- it invokes the __import__() function from the
862 builtins of the current globals. This means that the import is
863 done using whatever import hooks are installed in the current
864 environment, e.g. by "ni" or "rexec". */
865
866PyObject *
867PyImport_Import(module_name)
868 PyObject *module_name;
869{
870 static PyObject *silly_list = NULL;
871 static PyObject *builtins_str = NULL;
872 static PyObject *import_str = NULL;
873 static PyObject *standard_builtins = NULL;
874 PyObject *globals = NULL;
875 PyObject *import = NULL;
876 PyObject *builtins = NULL;
877 PyObject *r = NULL;
878
879 /* Initialize constant string objects */
880 if (silly_list == NULL) {
881 import_str = PyString_InternFromString("__import__");
882 if (import_str == NULL)
883 return NULL;
884 builtins_str = PyString_InternFromString("__builtins__");
885 if (builtins_str == NULL)
886 return NULL;
887 silly_list = Py_BuildValue("[s]", "__doc__");
888 if (silly_list == NULL)
889 return NULL;
890 }
891
892 /* Get the builtins from current globals */
893 globals = PyEval_GetGlobals();
894 if(globals != NULL) {
895 builtins = PyObject_GetItem(globals, builtins_str);
896 if (builtins == NULL)
897 goto err;
898 }
899 else {
900 /* No globals -- use standard builtins, and fake globals */
901 PyErr_Clear();
902
903 if (standard_builtins == NULL) {
904 standard_builtins =
905 PyImport_ImportModule("__builtin__");
906 if (standard_builtins == NULL)
907 return NULL;
908 }
909
910 builtins = standard_builtins;
911 Py_INCREF(builtins);
912 globals = Py_BuildValue("{OO}", builtins_str, builtins);
913 if (globals == NULL)
914 goto err;
915 }
916
917 /* Get the __import__ function from the builtins */
918 if (PyDict_Check(builtins))
919 import=PyObject_GetItem(builtins, import_str);
920 else
921 import=PyObject_GetAttr(builtins, import_str);
922 if (import == NULL)
923 goto err;
924
925 /* Call the _import__ function with the proper argument list */
926 r = PyObject_CallFunction(import, "OOOO",
927 module_name, globals, globals, silly_list);
928
929 err:
930 Py_XDECREF(globals);
931 Py_XDECREF(builtins);
932 Py_XDECREF(import);
933
934 return r;
935}
936
937
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938/* Module 'imp' provides Python access to the primitives used for
939 importing modules.
940*/
941
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000943imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 PyObject *self;
945 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000946{
947 char buf[4];
948
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000950 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000951 buf[0] = (char) ((MAGIC >> 0) & 0xff);
952 buf[1] = (char) ((MAGIC >> 8) & 0xff);
953 buf[2] = (char) ((MAGIC >> 16) & 0xff);
954 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957}
958
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *self;
962 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 struct filedescr *fdp;
966
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000968 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 if (list == NULL)
971 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
973 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000974 fdp->suffix, fdp->mode, fdp->type);
975 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977 return NULL;
978 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 if (PyList_Append(list, item) < 0) {
980 Py_DECREF(list);
981 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 return NULL;
983 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 }
986 return list;
987}
988
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 PyObject *self;
992 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000995 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 PyObject *path = NULL;
997 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 struct filedescr *fdp;
999 char pathname[MAXPATHLEN+1];
1000 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001001 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001002 return NULL;
1003 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1004 if (fdp == NULL)
1005 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 if (fob == NULL) {
1008 fclose(fp);
1009 return NULL;
1010 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001012 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014 return ret;
1015}
1016
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 PyObject *self;
1020 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021{
1022 char *name;
1023 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 PyObject *m;
1025 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 return NULL;
1027 ret = init_builtin(name);
1028 if (ret < 0)
1029 return NULL;
1030 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 Py_INCREF(Py_None);
1032 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 m = PyImport_AddModule(name);
1035 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036 return m;
1037}
1038
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyObject *self;
1042 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043{
1044 char *name;
1045 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 PyObject *m;
1047 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001050 if (ret < 0)
1051 return NULL;
1052 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 Py_INCREF(Py_None);
1054 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 m = PyImport_AddModule(name);
1057 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058 return m;
1059}
1060
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001062imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063 PyObject *self;
1064 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001065{
1066 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001067
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001069 return NULL;
1070 return get_frozen_object(name);
1071}
1072
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 PyObject *self;
1076 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077{
1078 int i;
1079 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001081 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +00001082 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
1083 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
1084 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001086 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001088 }
1089 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001091}
1092
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 PyObject *self;
1096 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001097{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001098 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001099 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001103 if (p->name == NULL)
1104 break;
1105 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001107 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001109}
1110
1111static FILE *
1112get_file(pathname, fob, mode)
1113 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001115 char *mode;
1116{
1117 FILE *fp;
1118 if (fob == NULL) {
1119 fp = fopen(pathname, mode);
1120 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001122 }
1123 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001125 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 PyErr_SetString(PyExc_ValueError,
1127 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001128 }
1129 return fp;
1130}
1131
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001133imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *self;
1135 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001136{
1137 char *name;
1138 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyObject *fob = NULL;
1140 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001141 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1143 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144 return NULL;
1145 fp = get_file(pathname, fob, "rb");
1146 if (fp == NULL)
1147 return NULL;
1148 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 return m;
1150}
1151
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyObject *self;
1155 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156{
1157 char *name;
1158 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyObject *fob = NULL;
1160 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001161 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1163 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001165 if (fob)
1166 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001168 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001169}
1170
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001172imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyObject *self;
1174 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175{
1176 char *name;
1177 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 PyObject *fob = NULL;
1179 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1182 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183 return NULL;
1184 fp = get_file(pathname, fob, "r");
1185 if (fp == NULL)
1186 return NULL;
1187 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 return m;
1189}
1190
Jack Jansen9c96a921995-02-15 22:57:06 +00001191#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001193imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 PyObject *self;
1195 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001196{
1197 char *name;
1198 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001200
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001202 return NULL;
1203 m = PyMac_LoadResourceModule(name, pathname);
1204 return m;
1205}
1206#endif /* macintosh */
1207
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 PyObject *self;
1211 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001212{
1213 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001216 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217}
1218
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001220 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221 {"get_magic", imp_get_magic, 1},
1222 {"get_suffixes", imp_get_suffixes, 1},
1223 {"find_module", imp_find_module, 1},
1224 {"init_builtin", imp_init_builtin, 1},
1225 {"init_frozen", imp_init_frozen, 1},
1226 {"is_builtin", imp_is_builtin, 1},
1227 {"is_frozen", imp_is_frozen, 1},
1228 {"load_compiled", imp_load_compiled, 1},
1229 {"load_dynamic", imp_load_dynamic, 1},
1230 {"load_source", imp_load_source, 1},
1231 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001232#ifdef macintosh
1233 {"load_resource", imp_load_resource, 1},
1234#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235 {NULL, NULL} /* sentinel */
1236};
1237
1238void
1239initimp()
1240{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 m = Py_InitModule("imp", imp_methods);
1244 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 v = PyInt_FromLong(SEARCH_ERROR);
1247 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1248 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 v = PyInt_FromLong(PY_SOURCE);
1251 PyDict_SetItemString(d, "PY_SOURCE", v);
1252 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253
Guido van Rossum79f25d91997-04-29 20:08:16 +00001254 v = PyInt_FromLong(PY_COMPILED);
1255 PyDict_SetItemString(d, "PY_COMPILED", v);
1256 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 v = PyInt_FromLong(C_EXTENSION);
1259 PyDict_SetItemString(d, "C_EXTENSION", v);
1260 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261
Jack Jansenae12e191995-06-18 20:06:44 +00001262#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 v = PyInt_FromLong(PY_RESOURCE);
1264 PyDict_SetItemString(d, "PY_RESOURCE", v);
1265 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001266#endif
1267
1268
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 if (PyErr_Occurred())
1270 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271}