blob: 2368143c6378b1847b78e326750660feecb04645 [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 PyInterpreterState *interp = PyThreadState_Get()->interp;
696 struct _inittab *p;
697 PyObject *mod;
698
699 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
700 return 1;
701
702 for (p = _PyImport_Inittab; p->name != NULL; p++) {
703 if (strcmp(name, p->name) == 0) {
704 if (p->initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000706 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000707 return -1;
708 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000710 fprintf(stderr, "import %s # builtin\n", name);
711 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000714 if (_PyImport_FixupExtension(name, name) == NULL)
715 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000716 return 1;
717 }
718 }
719 return 0;
720}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000721
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000723/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000725static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000726find_frozen(name)
727 char *name;
728{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000729 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000730
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000732 if (p->name == NULL)
733 return NULL;
734 if (strcmp(p->name, name) == 0)
735 break;
736 }
737 return p;
738}
739
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000741get_frozen_object(name)
742 char *name;
743{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000744 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000745
746 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000748 return NULL;
749 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000751}
752
753/* Initialize a frozen module.
754 Return 1 for succes, 0 if the module is not found, and -1 with
755 an exception set if the initialization failed.
756 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000757
758int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000760 char *name;
761{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000762 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 PyObject *co;
764 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000765
766 if (p == NULL)
767 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000769 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000771 if (co == NULL)
772 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 if (!PyCode_Check(co)) {
774 Py_DECREF(co);
775 PyErr_SetString(PyExc_TypeError,
776 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000777 return -1;
778 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 m = PyImport_ExecCodeModule(name, co);
780 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000781 if (m == NULL)
782 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000784 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000785}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000786
787
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000789 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000790
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791PyObject *
792PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000794{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000795 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000797
Guido van Rossum25ce5661997-08-02 03:10:38 +0000798 if ((m = PyDict_GetItemString(modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000800 }
801 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 if ((i = init_builtin(name)) ||
804 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805 if (i < 0)
806 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000807 if ((m = PyDict_GetItemString(modules,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 name)) == NULL) {
809 if (PyErr_Occurred() == NULL)
810 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811 "built-in module not initialized properly");
812 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000813 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000815 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816 else
817 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000818 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819
820 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000821}
822
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823
824/* Re-import a module of any kind and return its module object, WITH
825 INCREMENTED REFERENCE COUNT */
826
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827PyObject *
828PyImport_ReloadModule(m)
829 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000831 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832 char *name;
833 int i;
834
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 if (m == NULL || !PyModule_Check(m)) {
836 PyErr_SetString(PyExc_TypeError,
837 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838 return NULL;
839 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 if (name == NULL)
842 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000843 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyErr_SetString(PyExc_ImportError,
845 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846 return NULL;
847 }
848 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 if ((i = init_builtin(name)) ||
850 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851 if (i < 0)
852 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854 }
855 else
856 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857 return m;
858}
859
860
Guido van Rossumd47a0a81997-08-14 20:11:26 +0000861/* Higher-level import emulator which emulates the "import" statement
862 more accurately -- it invokes the __import__() function from the
863 builtins of the current globals. This means that the import is
864 done using whatever import hooks are installed in the current
865 environment, e.g. by "ni" or "rexec". */
866
867PyObject *
868PyImport_Import(module_name)
869 PyObject *module_name;
870{
871 static PyObject *silly_list = NULL;
872 static PyObject *builtins_str = NULL;
873 static PyObject *import_str = NULL;
874 static PyObject *standard_builtins = NULL;
875 PyObject *globals = NULL;
876 PyObject *import = NULL;
877 PyObject *builtins = NULL;
878 PyObject *r = NULL;
879
880 /* Initialize constant string objects */
881 if (silly_list == NULL) {
882 import_str = PyString_InternFromString("__import__");
883 if (import_str == NULL)
884 return NULL;
885 builtins_str = PyString_InternFromString("__builtins__");
886 if (builtins_str == NULL)
887 return NULL;
888 silly_list = Py_BuildValue("[s]", "__doc__");
889 if (silly_list == NULL)
890 return NULL;
891 }
892
893 /* Get the builtins from current globals */
894 globals = PyEval_GetGlobals();
895 if(globals != NULL) {
896 builtins = PyObject_GetItem(globals, builtins_str);
897 if (builtins == NULL)
898 goto err;
899 }
900 else {
901 /* No globals -- use standard builtins, and fake globals */
902 PyErr_Clear();
903
904 if (standard_builtins == NULL) {
905 standard_builtins =
906 PyImport_ImportModule("__builtin__");
907 if (standard_builtins == NULL)
908 return NULL;
909 }
910
911 builtins = standard_builtins;
912 Py_INCREF(builtins);
913 globals = Py_BuildValue("{OO}", builtins_str, builtins);
914 if (globals == NULL)
915 goto err;
916 }
917
918 /* Get the __import__ function from the builtins */
919 if (PyDict_Check(builtins))
920 import=PyObject_GetItem(builtins, import_str);
921 else
922 import=PyObject_GetAttr(builtins, import_str);
923 if (import == NULL)
924 goto err;
925
926 /* Call the _import__ function with the proper argument list */
927 r = PyObject_CallFunction(import, "OOOO",
928 module_name, globals, globals, silly_list);
929
930 err:
931 Py_XDECREF(globals);
932 Py_XDECREF(builtins);
933 Py_XDECREF(import);
934
935 return r;
936}
937
938
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939/* Module 'imp' provides Python access to the primitives used for
940 importing modules.
941*/
942
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 PyObject *self;
946 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947{
948 char buf[4];
949
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000951 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000952 buf[0] = (char) ((MAGIC >> 0) & 0xff);
953 buf[1] = (char) ((MAGIC >> 8) & 0xff);
954 buf[2] = (char) ((MAGIC >> 16) & 0xff);
955 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958}
959
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 PyObject *self;
963 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000966 struct filedescr *fdp;
967
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 if (list == NULL)
972 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
974 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000975 fdp->suffix, fdp->mode, fdp->type);
976 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 return NULL;
979 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980 if (PyList_Append(list, item) < 0) {
981 Py_DECREF(list);
982 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 return NULL;
984 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 }
987 return list;
988}
989
Guido van Rossum79f25d91997-04-29 20:08:16 +0000990static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000991imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 PyObject *self;
993 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000996 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 PyObject *path = NULL;
998 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000999 struct filedescr *fdp;
1000 char pathname[MAXPATHLEN+1];
1001 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 return NULL;
1004 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1005 if (fdp == NULL)
1006 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 if (fob == NULL) {
1009 fclose(fp);
1010 return NULL;
1011 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 return ret;
1016}
1017
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 PyObject *self;
1021 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022{
1023 char *name;
1024 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 PyObject *m;
1026 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001027 return NULL;
1028 ret = init_builtin(name);
1029 if (ret < 0)
1030 return NULL;
1031 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 Py_INCREF(Py_None);
1033 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001034 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 m = PyImport_AddModule(name);
1036 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001037 return m;
1038}
1039
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001041imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001042 PyObject *self;
1043 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044{
1045 char *name;
1046 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047 PyObject *m;
1048 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001049 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 if (ret < 0)
1052 return NULL;
1053 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 Py_INCREF(Py_None);
1055 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 m = PyImport_AddModule(name);
1058 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059 return m;
1060}
1061
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001063imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 PyObject *self;
1065 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001066{
1067 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001068
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001070 return NULL;
1071 return get_frozen_object(name);
1072}
1073
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 PyObject *self;
1077 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078{
1079 int i;
1080 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +00001083 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
1084 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
1085 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001089 }
1090 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001092}
1093
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001095imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 PyObject *self;
1097 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001099 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001102 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001104 if (p->name == NULL)
1105 break;
1106 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001108 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001110}
1111
1112static FILE *
1113get_file(pathname, fob, mode)
1114 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001116 char *mode;
1117{
1118 FILE *fp;
1119 if (fob == NULL) {
1120 fp = fopen(pathname, mode);
1121 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001123 }
1124 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001126 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 PyErr_SetString(PyExc_ValueError,
1128 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001129 }
1130 return fp;
1131}
1132
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001134imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 PyObject *self;
1136 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001137{
1138 char *name;
1139 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 PyObject *fob = NULL;
1141 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1144 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145 return NULL;
1146 fp = get_file(pathname, fob, "rb");
1147 if (fp == NULL)
1148 return NULL;
1149 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150 return m;
1151}
1152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 PyObject *self;
1156 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157{
1158 char *name;
1159 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 PyObject *fob = NULL;
1161 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001162 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1164 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001166 if (fob)
1167 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001169 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170}
1171
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001173imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyObject *self;
1175 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176{
1177 char *name;
1178 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 PyObject *fob = NULL;
1180 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001181 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1183 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001184 return NULL;
1185 fp = get_file(pathname, fob, "r");
1186 if (fp == NULL)
1187 return NULL;
1188 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189 return m;
1190}
1191
Jack Jansen9c96a921995-02-15 22:57:06 +00001192#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001194imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 PyObject *self;
1196 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001197{
1198 char *name;
1199 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001201
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001203 return NULL;
1204 m = PyMac_LoadResourceModule(name, pathname);
1205 return m;
1206}
1207#endif /* macintosh */
1208
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001211 PyObject *self;
1212 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213{
1214 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001216 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218}
1219
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001221 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222 {"get_magic", imp_get_magic, 1},
1223 {"get_suffixes", imp_get_suffixes, 1},
1224 {"find_module", imp_find_module, 1},
1225 {"init_builtin", imp_init_builtin, 1},
1226 {"init_frozen", imp_init_frozen, 1},
1227 {"is_builtin", imp_is_builtin, 1},
1228 {"is_frozen", imp_is_frozen, 1},
1229 {"load_compiled", imp_load_compiled, 1},
1230 {"load_dynamic", imp_load_dynamic, 1},
1231 {"load_source", imp_load_source, 1},
1232 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001233#ifdef macintosh
1234 {"load_resource", imp_load_resource, 1},
1235#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236 {NULL, NULL} /* sentinel */
1237};
1238
1239void
1240initimp()
1241{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 m = Py_InitModule("imp", imp_methods);
1245 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 v = PyInt_FromLong(SEARCH_ERROR);
1248 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1249 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 v = PyInt_FromLong(PY_SOURCE);
1252 PyDict_SetItemString(d, "PY_SOURCE", v);
1253 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 v = PyInt_FromLong(PY_COMPILED);
1256 PyDict_SetItemString(d, "PY_COMPILED", v);
1257 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 v = PyInt_FromLong(C_EXTENSION);
1260 PyDict_SetItemString(d, "C_EXTENSION", v);
1261 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262
Jack Jansenae12e191995-06-18 20:06:44 +00001263#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 v = PyInt_FromLong(PY_RESOURCE);
1265 PyDict_SetItemString(d, "PY_RESOURCE", v);
1266 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001267#endif
1268
1269
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 if (PyErr_Occurred())
1271 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272}