blob: 446b4991ce7ba92ceaf8f7182d4af9db9a5cbb70 [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
573 if ( PyMac_FindResourceModule(name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 static struct filedescr resfiledescr =
575 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000576
577 return &resfiledescr;
578 }
579#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580 if (len > 0 && buf[len-1] != SEP)
581 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000582#ifdef IMPORT_8x3_NAMES
583 /* see if we are searching in directory dos_8x3 */
584 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
585 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000587 for (j = 0; (ch = name[j]) && j < 8; j++)
588 if (isupper(ch))
589 buf[len++] = tolower(ch);
590 else
591 buf[len++] = ch;
592 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000593 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000594#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000595 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000596 strcpy(buf+len, name);
597 len += namelen;
598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000602 fprintf(stderr, "# trying %s\n", buf);
603 fp = fopen(buf, fdp->mode);
604 if (fp != NULL)
605 break;
606 }
607 if (fp != NULL)
608 break;
609 }
610 if (fp == NULL) {
611 char buf[256];
612 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000614 return NULL;
615 }
616
617 *p_fp = fp;
618 return fdp;
619}
620
621
622/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000623 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626load_module(name)
627 char *name;
628{
629 char buf[MAXPATHLEN+1];
630 struct filedescr *fdp;
631 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000633
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 if (fdp == NULL)
636 return NULL;
637
638 switch (fdp->type) {
639
640 case PY_SOURCE:
641 m = load_source_module(name, buf, fp);
642 break;
643
644 case PY_COMPILED:
645 m = load_compiled_module(name, buf, fp);
646 break;
647
648 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 break;
651
Jack Jansen9c96a921995-02-15 22:57:06 +0000652#ifdef macintosh
653 case PY_RESOURCE:
654 m = PyMac_LoadResourceModule(name, buf);
655 break;
656#endif
657
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000658 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000661 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662
663 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000664 if ( fp )
665 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666
667 return m;
668}
669
670
671/* Initialize a built-in module.
672 Return 1 for succes, 0 if the module is not found, and -1 with
673 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000674
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000675static int
676init_builtin(name)
677 char *name;
678{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000679 PyInterpreterState *interp = PyThreadState_Get()->interp;
680 struct _inittab *p;
681 PyObject *mod;
682
683 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
684 return 1;
685
686 for (p = _PyImport_Inittab; p->name != NULL; p++) {
687 if (strcmp(name, p->name) == 0) {
688 if (p->initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000690 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000691 return -1;
692 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000694 fprintf(stderr, "import %s # builtin\n", name);
695 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000698 if (_PyImport_FixupExtension(name, name) == NULL)
699 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000700 return 1;
701 }
702 }
703 return 0;
704}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000705
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000707/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000709static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000710find_frozen(name)
711 char *name;
712{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000713 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000714
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000716 if (p->name == NULL)
717 return NULL;
718 if (strcmp(p->name, name) == 0)
719 break;
720 }
721 return p;
722}
723
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000725get_frozen_object(name)
726 char *name;
727{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000728 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000729
730 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000732 return NULL;
733 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000735}
736
737/* Initialize a frozen module.
738 Return 1 for succes, 0 if the module is not found, and -1 with
739 an exception set if the initialization failed.
740 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000741
742int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000744 char *name;
745{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000746 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 PyObject *co;
748 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000749
750 if (p == NULL)
751 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000753 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000755 if (co == NULL)
756 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 if (!PyCode_Check(co)) {
758 Py_DECREF(co);
759 PyErr_SetString(PyExc_TypeError,
760 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000761 return -1;
762 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 m = PyImport_ExecCodeModule(name, co);
764 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000765 if (m == NULL)
766 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000768 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000769}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000770
771
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000773 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000774
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775PyObject *
776PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000778{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000779 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000781
Guido van Rossum25ce5661997-08-02 03:10:38 +0000782 if ((m = PyDict_GetItemString(modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000784 }
785 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 if ((i = init_builtin(name)) ||
788 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789 if (i < 0)
790 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000791 if ((m = PyDict_GetItemString(modules,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 name)) == NULL) {
793 if (PyErr_Occurred() == NULL)
794 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795 "built-in module not initialized properly");
796 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000797 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000799 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 else
801 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000802 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803
804 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000805}
806
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
808/* Re-import a module of any kind and return its module object, WITH
809 INCREMENTED REFERENCE COUNT */
810
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811PyObject *
812PyImport_ReloadModule(m)
813 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000815 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816 char *name;
817 int i;
818
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 if (m == NULL || !PyModule_Check(m)) {
820 PyErr_SetString(PyExc_TypeError,
821 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 return NULL;
823 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825 if (name == NULL)
826 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000827 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyErr_SetString(PyExc_ImportError,
829 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830 return NULL;
831 }
832 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 if ((i = init_builtin(name)) ||
834 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835 if (i < 0)
836 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000838 }
839 else
840 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 return m;
842}
843
844
845/* Module 'imp' provides Python access to the primitives used for
846 importing modules.
847*/
848
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 PyObject *self;
852 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853{
854 char buf[4];
855
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000858 buf[0] = (char) ((MAGIC >> 0) & 0xff);
859 buf[1] = (char) ((MAGIC >> 8) & 0xff);
860 buf[2] = (char) ((MAGIC >> 16) & 0xff);
861 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864}
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyObject *self;
869 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000872 struct filedescr *fdp;
873
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000877 if (list == NULL)
878 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
880 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 fdp->suffix, fdp->mode, fdp->type);
882 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884 return NULL;
885 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 if (PyList_Append(list, item) < 0) {
887 Py_DECREF(list);
888 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 return NULL;
890 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 }
893 return list;
894}
895
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 PyObject *self;
899 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 PyObject *path = NULL;
904 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000905 struct filedescr *fdp;
906 char pathname[MAXPATHLEN+1];
907 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000909 return NULL;
910 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
911 if (fdp == NULL)
912 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 if (fob == NULL) {
915 fclose(fp);
916 return NULL;
917 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 return ret;
922}
923
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 PyObject *self;
927 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000928{
929 char *name;
930 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyObject *m;
932 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 return NULL;
934 ret = init_builtin(name);
935 if (ret < 0)
936 return NULL;
937 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 Py_INCREF(Py_None);
939 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000940 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 m = PyImport_AddModule(name);
942 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000943 return m;
944}
945
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 PyObject *self;
949 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000950{
951 char *name;
952 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 PyObject *m;
954 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957 if (ret < 0)
958 return NULL;
959 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 Py_INCREF(Py_None);
961 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 m = PyImport_AddModule(name);
964 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 return m;
966}
967
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000969imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyObject *self;
971 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000972{
973 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000974
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000976 return NULL;
977 return get_frozen_object(name);
978}
979
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *self;
983 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984{
985 int i;
986 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000989 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
990 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
991 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000993 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000995 }
996 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998}
999
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 PyObject *self;
1003 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004{
Guido van Rossumcfd0a221996-06-17 17:06:34 +00001005 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010 if (p->name == NULL)
1011 break;
1012 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016}
1017
1018static FILE *
1019get_file(pathname, fob, mode)
1020 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022 char *mode;
1023{
1024 FILE *fp;
1025 if (fob == NULL) {
1026 fp = fopen(pathname, mode);
1027 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001029 }
1030 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyErr_SetString(PyExc_ValueError,
1034 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 }
1036 return fp;
1037}
1038
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyObject *self;
1042 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043{
1044 char *name;
1045 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 PyObject *fob = NULL;
1047 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1050 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 return NULL;
1052 fp = get_file(pathname, fob, "rb");
1053 if (fp == NULL)
1054 return NULL;
1055 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056 return m;
1057}
1058
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 PyObject *self;
1062 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001063{
1064 char *name;
1065 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 PyObject *fob = NULL;
1067 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001068 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1070 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001072 if (fob)
1073 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001075 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076}
1077
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001079imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 PyObject *self;
1081 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082{
1083 char *name;
1084 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 PyObject *fob = NULL;
1086 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
1089 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090 return NULL;
1091 fp = get_file(pathname, fob, "r");
1092 if (fp == NULL)
1093 return NULL;
1094 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001095 return m;
1096}
1097
Jack Jansen9c96a921995-02-15 22:57:06 +00001098#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001100imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyObject *self;
1102 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001103{
1104 char *name;
1105 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001107
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001109 return NULL;
1110 m = PyMac_LoadResourceModule(name, pathname);
1111 return m;
1112}
1113#endif /* macintosh */
1114
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001116imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 PyObject *self;
1118 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001119{
1120 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001124}
1125
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001127 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001128 {"get_magic", imp_get_magic, 1},
1129 {"get_suffixes", imp_get_suffixes, 1},
1130 {"find_module", imp_find_module, 1},
1131 {"init_builtin", imp_init_builtin, 1},
1132 {"init_frozen", imp_init_frozen, 1},
1133 {"is_builtin", imp_is_builtin, 1},
1134 {"is_frozen", imp_is_frozen, 1},
1135 {"load_compiled", imp_load_compiled, 1},
1136 {"load_dynamic", imp_load_dynamic, 1},
1137 {"load_source", imp_load_source, 1},
1138 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001139#ifdef macintosh
1140 {"load_resource", imp_load_resource, 1},
1141#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 {NULL, NULL} /* sentinel */
1143};
1144
1145void
1146initimp()
1147{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 m = Py_InitModule("imp", imp_methods);
1151 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 v = PyInt_FromLong(SEARCH_ERROR);
1154 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1155 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 v = PyInt_FromLong(PY_SOURCE);
1158 PyDict_SetItemString(d, "PY_SOURCE", v);
1159 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 v = PyInt_FromLong(PY_COMPILED);
1162 PyDict_SetItemString(d, "PY_COMPILED", v);
1163 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 v = PyInt_FromLong(C_EXTENSION);
1166 PyDict_SetItemString(d, "C_EXTENSION", v);
1167 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168
Jack Jansenae12e191995-06-18 20:06:44 +00001169#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 v = PyInt_FromLong(PY_RESOURCE);
1171 PyDict_SetItemString(d, "PY_RESOURCE", v);
1172 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001173#endif
1174
1175
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 if (PyErr_Occurred())
1177 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178}