blob: f33e5d6749a7fa2acd96bcce49ef8cbad8caf5b5 [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
861/* Module 'imp' provides Python access to the primitives used for
862 importing modules.
863*/
864
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 PyObject *self;
868 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869{
870 char buf[4];
871
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000874 buf[0] = (char) ((MAGIC >> 0) & 0xff);
875 buf[1] = (char) ((MAGIC >> 8) & 0xff);
876 buf[2] = (char) ((MAGIC >> 16) & 0xff);
877 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880}
881
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 PyObject *self;
885 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 struct filedescr *fdp;
889
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 if (list == NULL)
894 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
896 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 fdp->suffix, fdp->mode, fdp->type);
898 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 return NULL;
901 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 if (PyList_Append(list, item) < 0) {
903 Py_DECREF(list);
904 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000905 return NULL;
906 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908 }
909 return list;
910}
911
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *self;
915 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *path = NULL;
920 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 struct filedescr *fdp;
922 char pathname[MAXPATHLEN+1];
923 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925 return NULL;
926 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
927 if (fdp == NULL)
928 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000930 if (fob == NULL) {
931 fclose(fp);
932 return NULL;
933 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000935 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937 return ret;
938}
939
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 PyObject *self;
943 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944{
945 char *name;
946 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 PyObject *m;
948 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949 return NULL;
950 ret = init_builtin(name);
951 if (ret < 0)
952 return NULL;
953 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 Py_INCREF(Py_None);
955 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 m = PyImport_AddModule(name);
958 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 return m;
960}
961
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000963imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 PyObject *self;
965 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000966{
967 char *name;
968 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 PyObject *m;
970 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000971 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973 if (ret < 0)
974 return NULL;
975 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 Py_INCREF(Py_None);
977 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 m = PyImport_AddModule(name);
980 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981 return m;
982}
983
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000985imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 PyObject *self;
987 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000988{
989 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000990
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000992 return NULL;
993 return get_frozen_object(name);
994}
995
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 PyObject *self;
999 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000{
1001 int i;
1002 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +00001005 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
1006 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
1007 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011 }
1012 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014}
1015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyObject *self;
1019 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001021 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 if (p->name == NULL)
1027 break;
1028 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032}
1033
1034static FILE *
1035get_file(pathname, fob, mode)
1036 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 char *mode;
1039{
1040 FILE *fp;
1041 if (fob == NULL) {
1042 fp = fopen(pathname, mode);
1043 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001045 }
1046 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 PyErr_SetString(PyExc_ValueError,
1050 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 }
1052 return fp;
1053}
1054
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 PyObject *self;
1058 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059{
1060 char *name;
1061 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 PyObject *fob = NULL;
1063 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1066 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001067 return NULL;
1068 fp = get_file(pathname, fob, "rb");
1069 if (fp == NULL)
1070 return NULL;
1071 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 return m;
1073}
1074
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 PyObject *self;
1078 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001079{
1080 char *name;
1081 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject *fob = NULL;
1083 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001084 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1086 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001088 if (fob)
1089 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001091 return m;
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_load_source(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{
1099 char *name;
1100 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyObject *fob = NULL;
1102 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001103 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1105 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001106 return NULL;
1107 fp = get_file(pathname, fob, "r");
1108 if (fp == NULL)
1109 return NULL;
1110 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001111 return m;
1112}
1113
Jack Jansen9c96a921995-02-15 22:57:06 +00001114#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001116imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 PyObject *self;
1118 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001119{
1120 char *name;
1121 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001123
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001125 return NULL;
1126 m = PyMac_LoadResourceModule(name, pathname);
1127 return m;
1128}
1129#endif /* macintosh */
1130
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001132imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 PyObject *self;
1134 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135{
1136 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001138 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140}
1141
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001143 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144 {"get_magic", imp_get_magic, 1},
1145 {"get_suffixes", imp_get_suffixes, 1},
1146 {"find_module", imp_find_module, 1},
1147 {"init_builtin", imp_init_builtin, 1},
1148 {"init_frozen", imp_init_frozen, 1},
1149 {"is_builtin", imp_is_builtin, 1},
1150 {"is_frozen", imp_is_frozen, 1},
1151 {"load_compiled", imp_load_compiled, 1},
1152 {"load_dynamic", imp_load_dynamic, 1},
1153 {"load_source", imp_load_source, 1},
1154 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001155#ifdef macintosh
1156 {"load_resource", imp_load_resource, 1},
1157#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158 {NULL, NULL} /* sentinel */
1159};
1160
1161void
1162initimp()
1163{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 m = Py_InitModule("imp", imp_methods);
1167 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 v = PyInt_FromLong(SEARCH_ERROR);
1170 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1171 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001172
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 v = PyInt_FromLong(PY_SOURCE);
1174 PyDict_SetItemString(d, "PY_SOURCE", v);
1175 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 v = PyInt_FromLong(PY_COMPILED);
1178 PyDict_SetItemString(d, "PY_COMPILED", v);
1179 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 v = PyInt_FromLong(C_EXTENSION);
1182 PyDict_SetItemString(d, "C_EXTENSION", v);
1183 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001184
Jack Jansenae12e191995-06-18 20:06:44 +00001185#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 v = PyInt_FromLong(PY_RESOURCE);
1187 PyDict_SetItemString(d, "PY_RESOURCE", v);
1188 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001189#endif
1190
1191
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 if (PyErr_Occurred())
1193 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194}