blob: 465397c5b1bc6590559d32e4b5b60cf673657dfc [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 Rossumaee0bad1997-09-05 07:33:22 +000052/* We expect that stat exists on most systems.
53 It's confirmed on Unix, Mac and Windows.
54 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
55#ifndef DONT_HAVE_STAT
56#define HAVE_STAT
57
58#include <sys/types.h>
59#include <sys/stat.h>
60
61#ifndef S_ISDIR
62#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
63#endif
64
65#endif
66
67
Guido van Rossum79f25d91997-04-29 20:08:16 +000068extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000069
Guido van Rossum6c849691994-09-26 15:47:17 +000070/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000071/* Change for each incompatible change */
72/* The value of CR and LF is incorporated so if you ever read or write
73 a .pyc file in text mode the magic number will be wrong; also, the
74 Apple MPW compiler swaps their values, botching string constants */
75/* XXX Perhaps the magic number should be frozen and a version field
76 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000077/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000078#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000079
Guido van Rossum25ce5661997-08-02 03:10:38 +000080/* See _PyImport_FixupExtension() below */
81static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000082
Guido van Rossum66f1fa81991-04-03 19:03:52 +000083
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085
86void
Guido van Rossum25ce5661997-08-02 03:10:38 +000087_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Guido van Rossum0824f631997-03-11 18:37:35 +000089 if (Py_OptimizeFlag) {
90 /* Replace ".pyc" with ".pyo" in import_filetab */
91 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000093 if (strcmp(p->suffix, ".pyc") == 0)
94 p->suffix = ".pyo";
95 }
96 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
Guido van Rossum25ce5661997-08-02 03:10:38 +000099void
100_PyImport_Fini()
101{
102 Py_XDECREF(extensions);
103 extensions = NULL;
104}
105
106
107/* Helper for sys */
108
109PyObject *
110PyImport_GetModuleDict()
111{
112 PyInterpreterState *interp = PyThreadState_Get()->interp;
113 if (interp->modules == NULL)
114 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
115 return interp->modules;
116}
117
Guido van Rossum3f5da241990-12-20 15:06:42 +0000118
Guido van Rossum085d2691997-08-05 02:20:51 +0000119/* Helper for PyImport_Cleanup */
120
121static void
122clear_carefully(d)
123 PyObject *d;
124{
125 /* To make the execution order of destructors for global
126 objects a bit more predictable, we first zap all objects
127 whose name starts with a single underscore, before we clear
128 the entire dictionary. We zap them by replacing them with
129 None, rather than deleting them from the dictionary, to
130 avoid rehashing the dictionary (to some extent). */
131
132 int pos;
133 PyObject *key, *value;
134
135 pos = 0;
136 while (PyDict_Next(d, &pos, &key, &value)) {
137 if (value != Py_None && PyString_Check(key)) {
138 char *s = PyString_AsString(key);
139 if (s[0] == '_' && s[1] != '_')
140 PyDict_SetItem(d, key, Py_None);
141 }
142 }
143
144 PyDict_Clear(d);
145}
146
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152 PyInterpreterState *interp = PyThreadState_Get()->interp;
153 PyObject *tmp = interp->modules;
154 if (tmp != NULL) {
155 int pos;
156 PyObject *key, *value;
157 interp->modules = NULL;
158 pos = 0;
159 while (PyDict_Next(tmp, &pos, &key, &value)) {
160 if (PyModule_Check(value)) {
161 PyObject *d = PyModule_GetDict(value);
Guido van Rossum085d2691997-08-05 02:20:51 +0000162 clear_carefully(d);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000163 }
164 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 PyDict_Clear(tmp);
166 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000168}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000169
170
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000171/* Helper for pythonrun.c -- return magic number */
172
173long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175{
176 return MAGIC;
177}
178
179
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180/* Magic for extension modules (built-in as well as dynamically
181 loaded). To prevent initializing an extension module more than
182 once, we keep a static dictionary 'extensions' keyed by module name
183 (for built-in modules) or by filename (for dynamically loaded
184 modules), containing these modules. A copy od the module's
185 dictionary is stored by calling _PyImport_FixupExtension()
186 immediately after the module initialization function succeeds. A
187 copy can be retrieved from there by calling
188 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191_PyImport_FixupExtension(name, filename)
192 char *name;
193 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000194{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195 PyObject *modules, *mod, *dict, *copy;
196 if (extensions == NULL) {
197 extensions = PyDict_New();
198 if (extensions == NULL)
199 return NULL;
200 }
201 modules = PyImport_GetModuleDict();
202 mod = PyDict_GetItemString(modules, name);
203 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000204 PyErr_Format(PyExc_SystemError,
205 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000206 return NULL;
207 }
208 dict = PyModule_GetDict(mod);
209 if (dict == NULL)
210 return NULL;
211 copy = PyObject_CallMethod(dict, "copy", "");
212 if (copy == NULL)
213 return NULL;
214 PyDict_SetItemString(extensions, filename, copy);
215 Py_DECREF(copy);
216 return copy;
217}
218
219PyObject *
220_PyImport_FindExtension(name, filename)
221 char *name;
222 char *filename;
223{
224 PyObject *dict, *mod, *mdict, *result;
225 if (extensions == NULL)
226 return NULL;
227 dict = PyDict_GetItemString(extensions, filename);
228 if (dict == NULL)
229 return NULL;
230 mod = PyImport_AddModule(name);
231 if (mod == NULL)
232 return NULL;
233 mdict = PyModule_GetDict(mod);
234 if (mdict == NULL)
235 return NULL;
236 result = PyObject_CallMethod(mdict, "update", "O", dict);
237 if (result == NULL)
238 return NULL;
239 Py_DECREF(result);
240 if (Py_VerboseFlag)
241 fprintf(stderr, "import %s # previously loaded (%s)\n",
242 name, filename);
243 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244}
245
246
247/* Get the module object corresponding to a module name.
248 First check the modules dictionary if there's one there,
249 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000250 Because the former action is most common, THIS DOES NOT RETURN A
251 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253PyObject *
254PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000255 char *name;
256{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000257 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000259
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000262 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000264 if (m == NULL)
265 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268 return NULL;
269 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000271
272 return m;
273}
274
275
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000276/* Execute a code object in a module and return the module object
277 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279PyObject *
280PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000283{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000284 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000288 if (m == NULL)
289 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 d = PyModule_GetDict(m);
291 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
292 if (PyDict_SetItemString(d, "__builtins__",
293 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000294 return NULL;
295 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000296 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 if (PyDict_SetItemString(d, "__file__",
298 ((PyCodeObject *)co)->co_filename) != 0)
299 PyErr_Clear(); /* Not important enough to report */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000300 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000301 if (v == NULL)
302 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000304
Guido van Rossum25ce5661997-08-02 03:10:38 +0000305 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000306 PyErr_Format(PyExc_ImportError,
307 "Loaded module %.200s not found in sys.modules",
308 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000309 return NULL;
310 }
311
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000313
314 return m;
315}
316
317
318/* Given a pathname for a Python source file, fill a buffer with the
319 pathname for the corresponding compiled file. Return the pathname
320 for the compiled file, or NULL if there's no space in the buffer.
321 Doesn't set an exception. */
322
323static char *
324make_compiled_pathname(pathname, buf, buflen)
325 char *pathname;
326 char *buf;
327 int buflen;
328{
329 int len;
330
331 len = strlen(pathname);
332 if (len+2 > buflen)
333 return NULL;
334 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000335 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336
337 return buf;
338}
339
340
341/* Given a pathname for a Python source file, its time of last
342 modification, and a pathname for a compiled file, check whether the
343 compiled file represents the same version of the source. If so,
344 return a FILE pointer for the compiled file, positioned just after
345 the header; if not, return NULL.
346 Doesn't set an exception. */
347
348static FILE *
349check_compiled_module(pathname, mtime, cpathname)
350 char *pathname;
351 long mtime;
352 char *cpathname;
353{
354 FILE *fp;
355 long magic;
356 long pyc_mtime;
357
358 fp = fopen(cpathname, "rb");
359 if (fp == NULL)
360 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364 fprintf(stderr, "# %s has bad magic\n", cpathname);
365 fclose(fp);
366 return NULL;
367 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371 fprintf(stderr, "# %s has bad mtime\n", cpathname);
372 fclose(fp);
373 return NULL;
374 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
377 return fp;
378}
379
380
381/* Read a code object from a file and check it for validity */
382
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000384read_compiled_module(cpathname, fp)
385 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 FILE *fp;
387{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 if (co == NULL || !PyCode_Check(co)) {
393 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000394 PyErr_Format(PyExc_ImportError,
395 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 return NULL;
398 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000400}
401
402
403/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000404 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000407load_compiled_module(name, cpathname, fp)
408 char *name;
409 char *cpathname;
410 FILE *fp;
411{
412 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 PyCodeObject *co;
414 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415
Guido van Rossum79f25d91997-04-29 20:08:16 +0000416 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000418 PyErr_Format(PyExc_ImportError,
419 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420 return NULL;
421 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000423 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 if (co == NULL)
425 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427 fprintf(stderr, "import %s # precompiled from %s\n",
428 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 m = PyImport_ExecCodeModule(name, (PyObject *)co);
430 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431
432 return m;
433}
434
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435/* Parse a source file and return the corresponding code object */
436
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438parse_source_module(pathname, fp)
439 char *pathname;
440 FILE *fp;
441{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 node *n;
444
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000445 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 if (n == NULL)
447 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 co = PyNode_Compile(n, pathname);
449 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450
451 return co;
452}
453
454
455/* Write a compiled module to a file, placing the time of last
456 modification of its source into the header.
457 Errors are ignored, if a write error occurs an attempt is made to
458 remove the file. */
459
460static void
461write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 char *cpathname;
464 long mtime;
465{
466 FILE *fp;
467
468 fp = fopen(cpathname, "wb");
469 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471 fprintf(stderr,
472 "# can't create %s\n", cpathname);
473 return;
474 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 PyMarshal_WriteLongToFile(0L, fp);
478 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000479 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 fprintf(stderr, "# can't write %s\n", cpathname);
482 /* Don't keep partial file */
483 fclose(fp);
484 (void) unlink(cpathname);
485 return;
486 }
487 /* Now write the true mtime */
488 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 fflush(fp);
491 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 fprintf(stderr, "# wrote %s\n", cpathname);
494#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000495 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496#endif
497}
498
499
500/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000501 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
502 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505load_source_module(name, pathname, fp)
506 char *name;
507 char *pathname;
508 FILE *fp;
509{
510 long mtime;
511 FILE *fpc;
512 char buf[MAXPATHLEN+1];
513 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 PyCodeObject *co;
515 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000517 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
519 if (cpathname != NULL &&
520 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000521 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 fclose(fpc);
523 if (co == NULL)
524 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 fprintf(stderr, "import %s # precompiled from %s\n",
527 name, cpathname);
528 }
529 else {
530 co = parse_source_module(pathname, fp);
531 if (co == NULL)
532 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 fprintf(stderr, "import %s # from %s\n",
535 name, pathname);
536 write_compiled_module(co, cpathname, mtime);
537 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 m = PyImport_ExecCodeModule(name, (PyObject *)co);
539 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540
541 return m;
542}
543
544
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000545/* Forward */
546static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
547static struct filedescr *find_module Py_PROTO((char *, PyObject *,
548 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000549static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000550
551/* Load a package and return its module object WITH INCREMENTED
552 REFERENCE COUNT */
553
554static PyObject *
555load_package(name, pathname)
556 char *name;
557 char *pathname;
558{
559 PyObject *m, *d, *file, *path;
560 int err;
561 char buf[MAXPATHLEN+1];
562 FILE *fp = NULL;
563 struct filedescr *fdp;
564
565 m = PyImport_AddModule(name);
566 if (m == NULL)
567 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000568 if (Py_VerboseFlag)
569 fprintf(stderr, "import %s # directory %s\n",
570 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000571 d = PyModule_GetDict(m);
572 file = PyString_FromString(pathname);
573 if (file == NULL)
574 return NULL;
575 path = Py_BuildValue("[O]", file);
576 if (path == NULL) {
577 Py_DECREF(file);
578 return NULL;
579 }
580 err = PyDict_SetItemString(d, "__file__", file);
581 if (err == 0)
582 err = PyDict_SetItemString(d, "__path__", path);
583 if (err != 0) {
584 m = NULL;
585 goto cleanup;
586 }
587 buf[0] = '\0';
588 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
589 if (fdp == NULL) {
590 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
591 PyErr_Clear();
592 }
593 else
594 m = NULL;
595 goto cleanup;
596 }
597 m = load_module(name, fp, buf, fdp->type);
598 if (fp != NULL)
599 fclose(fp);
600 cleanup:
601 Py_XINCREF(m);
602 Py_XDECREF(path);
603 Py_XDECREF(file);
604 return m;
605}
606
607
608/* Helper to test for built-in module */
609
610static int
611is_builtin(name)
612 char *name;
613{
614 int i;
615 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
616 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
617 if (_PyImport_Inittab[i].initfunc == NULL)
618 return -1;
619 else
620 return 1;
621 }
622 }
623 return 0;
624}
625
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000626
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627/* Search the path (default sys.path) for a module. Return the
628 corresponding filedescr struct, and (via return arguments) the
629 pathname and an open file. Return NULL if the module is not found. */
630
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000631#ifdef MS_COREDLL
632extern FILE *PyWin_FindRegisteredModule();
633#endif
634
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635static struct filedescr *
636find_module(name, path, buf, buflen, p_fp)
637 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639 /* Output parameters: */
640 char *buf;
641 int buflen;
642 FILE **p_fp;
643{
644 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000645 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000646 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000647 struct stat statbuf;
648
649 if (path == NULL) {
650 if (is_builtin(name)) {
651 static struct filedescr fd = {"", "", C_BUILTIN};
652 return &fd;
653 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000654 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000655 static struct filedescr fd = {"", "", PY_FROZEN};
656 return &fd;
657 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000658
Guido van Rossumac279101996-08-22 23:10:58 +0000659#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000660 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
661 if (fp != NULL) {
662 *p_fp = fp;
663 return fdp;
664 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000665#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000666 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000667
668
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 path = PySys_GetObject("path");
671 if (path == NULL || !PyList_Check(path)) {
672 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000673 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 return NULL;
675 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000677 namelen = strlen(name);
678 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyObject *v = PyList_GetItem(path, i);
680 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000683 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000686 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000688#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000689#ifdef INTERN_STRINGS
690 /*
691 ** Speedup: each sys.path item is interned, and
692 ** FindResourceModule remembers which items refer to
693 ** folders (so we don't have to bother trying to look
694 ** into them for resources).
695 */
696 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
697 v = PyList_GET_ITEM(path, i);
698#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000699 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 static struct filedescr resfiledescr =
701 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000702
703 return &resfiledescr;
704 }
705#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000706 if (len > 0 && buf[len-1] != SEP
707#ifdef ALTSEP
708 && buf[len-1] != ALTSEP
709#endif
710 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000712#ifdef IMPORT_8x3_NAMES
713 /* see if we are searching in directory dos_8x3 */
714 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
715 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000717 for (j = 0; (ch = name[j]) && j < 8; j++)
718 if (isupper(ch))
719 buf[len++] = tolower(ch);
720 else
721 buf[len++] = ch;
722 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000723 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000724#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000725 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000726 strcpy(buf+len, name);
727 len += namelen;
728 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000729#ifdef HAVE_STAT
730 if (stat(buf, &statbuf) == 0) {
731 static struct filedescr fd = {"", "", PKG_DIRECTORY};
732 if (S_ISDIR(statbuf.st_mode))
733 return &fd;
734 }
735#else
736 /* XXX How are you going to test for directories? */
737#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000738#ifdef macintosh
739 fdp = PyMac_FindModuleExtension(buf, &len, name);
740 if (fdp)
741 fp = fopen(buf, fdp->mode);
742#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 fprintf(stderr, "# trying %s\n", buf);
747 fp = fopen(buf, fdp->mode);
748 if (fp != NULL)
749 break;
750 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000751#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 if (fp != NULL)
753 break;
754 }
755 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000756 PyErr_Format(PyExc_ImportError,
757 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 return NULL;
759 }
760
761 *p_fp = fp;
762 return fdp;
763}
764
765
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000766static int init_builtin Py_PROTO((char *)); /* Forward */
767
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000769 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000772load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000774 FILE *fp;
775 char *buf;
776 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000778 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000780 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 /* First check that there's an open file (if we need one) */
783 switch (type) {
784 case PY_SOURCE:
785 case PY_COMPILED:
786 if (fp == NULL) {
787 PyErr_Format(PyExc_ValueError,
788 "file object required for import (type code %d)",
789 type);
790 return NULL;
791 }
792 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000794 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795
796 case PY_SOURCE:
797 m = load_source_module(name, buf, fp);
798 break;
799
800 case PY_COMPILED:
801 m = load_compiled_module(name, buf, fp);
802 break;
803
804 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000806 break;
807
Jack Jansen9c96a921995-02-15 22:57:06 +0000808#ifdef macintosh
809 case PY_RESOURCE:
810 m = PyMac_LoadResourceModule(name, buf);
811 break;
812#endif
813
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000814 case PKG_DIRECTORY:
815 m = load_package(name, buf);
816 break;
817
818 case C_BUILTIN:
819 case PY_FROZEN:
820 if (type == C_BUILTIN)
821 err = init_builtin(name);
822 else
823 err = PyImport_ImportFrozenModule(name);
824 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000825 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000826 if (err == 0) {
827 PyErr_Format(PyExc_ImportError,
828 "Purported %s module %.200s not found",
829 type == C_BUILTIN ?
830 "builtin" : "frozen",
831 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000832 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000833 }
834 modules = PyImport_GetModuleDict();
835 m = PyDict_GetItemString(modules, name);
836 if (m == NULL) {
837 PyErr_Format(
838 PyExc_ImportError,
839 "%s module %.200s not properly initialized",
840 type == C_BUILTIN ?
841 "builtin" : "frozen",
842 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000843 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000844 }
845 Py_INCREF(m);
846 break;
847
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000849 PyErr_Format(PyExc_ImportError,
850 "Don't know how to import %.200s (type code %d)",
851 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000852 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853
854 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000855
856 return m;
857}
858
859
860/* Initialize a built-in module.
861 Return 1 for succes, 0 if the module is not found, and -1 with
862 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000863
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000864static int
865init_builtin(name)
866 char *name;
867{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000868 struct _inittab *p;
869 PyObject *mod;
870
871 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
872 return 1;
873
874 for (p = _PyImport_Inittab; p->name != NULL; p++) {
875 if (strcmp(name, p->name) == 0) {
876 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000877 PyErr_Format(PyExc_ImportError,
878 "Cannot re-init internal module %.200s",
879 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000880 return -1;
881 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000883 fprintf(stderr, "import %s # builtin\n", name);
884 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000887 if (_PyImport_FixupExtension(name, name) == NULL)
888 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000889 return 1;
890 }
891 }
892 return 0;
893}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000894
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000896/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000898static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000899find_frozen(name)
900 char *name;
901{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000902 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000903
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000905 if (p->name == NULL)
906 return NULL;
907 if (strcmp(p->name, name) == 0)
908 break;
909 }
910 return p;
911}
912
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000914get_frozen_object(name)
915 char *name;
916{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000917 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000918
919 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000920 PyErr_Format(PyExc_ImportError,
921 "No such frozen object named %.200s",
922 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000923 return NULL;
924 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000926}
927
928/* Initialize a frozen module.
929 Return 1 for succes, 0 if the module is not found, and -1 with
930 an exception set if the initialization failed.
931 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000932
933int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000935 char *name;
936{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000937 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 PyObject *co;
939 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000940
941 if (p == NULL)
942 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000944 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000946 if (co == NULL)
947 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 if (!PyCode_Check(co)) {
949 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000950 PyErr_Format(PyExc_TypeError,
951 "frozen object %.200s is not a code object",
952 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000953 return -1;
954 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 m = PyImport_ExecCodeModule(name, co);
956 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000957 if (m == NULL)
958 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000960 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000961}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000962
963
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000964/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000965 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000966
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967PyObject *
968PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000970{
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000971 static PyObject *fromlist = NULL;
972 if (fromlist == NULL && strchr(name, '.') != NULL) {
973 fromlist = Py_BuildValue("[s]", "*");
974 if (fromlist == NULL)
975 return NULL;
976 }
977 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000978}
979
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000980/* Forward declarations for helper routines */
981static PyObject *get_parent Py_PROTO((PyObject *globals,
982 char *buf, int *p_buflen));
983static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
984 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +0000985static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000986static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +0000987 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000988static PyObject * import_submodule Py_PROTO((PyObject *mod,
989 char *name, char *fullname));
990
991/* The Magnum Opus of dotted-name import :-) */
992
993/* XXX TO DO:
994 - Remember misses in package directories so package submodules
995 that all import the same toplevel module don't keep hitting on the
996 package directory first
997*/
998
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000999PyObject *
1000PyImport_ImportModuleEx(name, globals, locals, fromlist)
1001 char *name;
1002 PyObject *globals;
1003 PyObject *locals;
1004 PyObject *fromlist;
1005{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001006 char buf[MAXPATHLEN+1];
1007 int buflen = 0;
1008 PyObject *parent, *head, *next, *tail;
1009
1010 parent = get_parent(globals, buf, &buflen);
1011 if (parent == NULL)
1012 return NULL;
1013
1014 head = load_next(parent, Py_None, &name, buf, &buflen);
1015 if (head == NULL)
1016 return NULL;
1017
1018 tail = head;
1019 Py_INCREF(tail);
1020 while (name) {
1021 next = load_next(tail, tail, &name, buf, &buflen);
1022 Py_DECREF(tail);
1023 if (next == NULL) {
1024 Py_DECREF(head);
1025 return NULL;
1026 }
1027 tail = next;
1028 }
1029
1030 if (fromlist != NULL) {
1031 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1032 fromlist = NULL;
1033 }
1034
1035 if (fromlist == NULL) {
1036 Py_DECREF(tail);
1037 return head;
1038 }
1039
1040 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001041 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001042 Py_DECREF(tail);
1043 return NULL;
1044 }
1045
1046 return tail;
1047}
1048
1049static PyObject *
1050get_parent(globals, buf, p_buflen)
1051 PyObject *globals;
1052 char *buf;
1053 int *p_buflen;
1054{
1055 static PyObject *namestr = NULL;
1056 static PyObject *pathstr = NULL;
1057 PyObject *modname, *modpath, *modules, *parent;
1058
1059 if (globals == NULL || !PyDict_Check(globals))
1060 return Py_None;
1061
1062 if (namestr == NULL) {
1063 namestr = PyString_InternFromString("__name__");
1064 if (namestr == NULL)
1065 return NULL;
1066 }
1067 if (pathstr == NULL) {
1068 pathstr = PyString_InternFromString("__path__");
1069 if (pathstr == NULL)
1070 return NULL;
1071 }
1072
1073 *buf = '\0';
1074 *p_buflen = 0;
1075 modname = PyDict_GetItem(globals, namestr);
1076 if (modname == NULL || !PyString_Check(modname))
1077 return Py_None;
1078
1079 modpath = PyDict_GetItem(globals, pathstr);
1080 if (modpath != NULL) {
1081 int len = PyString_GET_SIZE(modname);
1082 if (len > MAXPATHLEN) {
1083 PyErr_SetString(PyExc_ValueError,
1084 "Module name too long");
1085 return NULL;
1086 }
1087 strcpy(buf, PyString_AS_STRING(modname));
1088 *p_buflen = len;
1089 }
1090 else {
1091 char *start = PyString_AS_STRING(modname);
1092 char *lastdot = strrchr(start, '.');
1093 int len;
1094 if (lastdot == NULL)
1095 return Py_None;
1096 len = lastdot - start;
1097 if (len >= MAXPATHLEN) {
1098 PyErr_SetString(PyExc_ValueError,
1099 "Module name too long");
1100 return NULL;
1101 }
1102 strncpy(buf, start, len);
1103 buf[len] = '\0';
1104 *p_buflen = len;
1105 }
1106
1107 modules = PyImport_GetModuleDict();
1108 parent = PyDict_GetItemString(modules, buf);
1109 if (parent == NULL)
1110 parent = Py_None;
1111 return parent;
1112 /* We expect, but can't guarantee, if parent != None, that:
1113 - parent.__name__ == buf
1114 - parent.__dict__ is globals
1115 If this is violated... Who cares? */
1116}
1117
1118static PyObject *
1119load_next(mod, altmod, p_name, buf, p_buflen)
1120 PyObject *mod;
1121 PyObject *altmod; /* Either None or same as mod */
1122 char **p_name;
1123 char *buf;
1124 int *p_buflen;
1125{
1126 char *name = *p_name;
1127 char *dot = strchr(name, '.');
1128 int len;
1129 char *p;
1130 PyObject *result;
1131
1132 if (dot == NULL) {
1133 *p_name = NULL;
1134 len = strlen(name);
1135 }
1136 else {
1137 *p_name = dot+1;
1138 len = dot-name;
1139 }
1140
1141 p = buf + *p_buflen;
1142 if (p != buf)
1143 *p++ = '.';
1144 if (p+len-buf >= MAXPATHLEN) {
1145 PyErr_SetString(PyExc_ValueError,
1146 "Module name too long");
1147 return NULL;
1148 }
1149 strncpy(p, name, len);
1150 p[len] = '\0';
1151 *p_buflen = p+len-buf;
1152
1153 result = import_submodule(mod, p, buf);
1154 if (result == Py_None && altmod != mod) {
1155 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001156 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001157 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001158 if (result != NULL && result != Py_None) {
1159 if (mark_miss(buf) != 0) {
1160 Py_DECREF(result);
1161 return NULL;
1162 }
1163 strncpy(buf, name, len);
1164 buf[len] = '\0';
1165 *p_buflen = len;
1166 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001167 }
1168 if (result == NULL)
1169 return NULL;
1170
1171 if (result == Py_None) {
1172 Py_DECREF(result);
1173 PyErr_Format(PyExc_ImportError,
1174 "No module named %.200s", name);
1175 return NULL;
1176 }
1177
1178 return result;
1179}
1180
1181static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001182mark_miss(name)
1183 char *name;
1184{
1185 PyObject *modules = PyImport_GetModuleDict();
1186 return PyDict_SetItemString(modules, name, Py_None);
1187}
1188
1189static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001190ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001191 PyObject *mod;
1192 PyObject *fromlist;
1193 char *buf;
1194 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001195 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001196{
1197 int i;
1198
1199 if (!PyObject_HasAttrString(mod, "__path__"))
1200 return 1;
1201
1202 for (i = 0; ; i++) {
1203 PyObject *item = PySequence_GetItem(fromlist, i);
1204 int hasit;
1205 if (item == NULL) {
1206 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1207 PyErr_Clear();
1208 return 1;
1209 }
1210 return 0;
1211 }
1212 if (!PyString_Check(item)) {
1213 PyErr_SetString(PyExc_TypeError,
1214 "Item in ``from list'' not a string");
1215 Py_DECREF(item);
1216 return 0;
1217 }
1218 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001219 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001220 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001221 /* See if the package defines __all__ */
1222 if (recursive)
1223 continue; /* Avoid endless recursion */
1224 all = PyObject_GetAttrString(mod, "__all__");
1225 if (all == NULL)
1226 PyErr_Clear();
1227 else {
1228 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1229 return 0;
1230 Py_DECREF(all);
1231 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001232 continue;
1233 }
1234 hasit = PyObject_HasAttr(mod, item);
1235 if (!hasit) {
1236 char *subname = PyString_AS_STRING(item);
1237 PyObject *submod;
1238 char *p;
1239 if (buflen + strlen(subname) >= MAXPATHLEN) {
1240 PyErr_SetString(PyExc_ValueError,
1241 "Module name too long");
1242 Py_DECREF(item);
1243 return 0;
1244 }
1245 p = buf + buflen;
1246 *p++ = '.';
1247 strcpy(p, subname);
1248 submod = import_submodule(mod, subname, buf);
1249 Py_XDECREF(submod);
1250 if (submod == NULL) {
1251 Py_DECREF(item);
1252 return 0;
1253 }
1254 }
1255 Py_DECREF(item);
1256 }
1257
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001258 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001259}
1260
1261static PyObject *
1262import_submodule(mod, subname, fullname)
1263 PyObject *mod; /* May be None */
1264 char *subname;
1265 char *fullname;
1266{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001267 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001269
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001270 /* Require:
1271 if mod == None: subname == fullname
1272 else: mod.__name__ + "." + subname == fullname
1273 */
1274
1275 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001277 }
1278 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001279 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001280 char buf[MAXPATHLEN+1];
1281 struct filedescr *fdp;
1282 FILE *fp = NULL;
1283
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001284 path = PyObject_GetAttrString(mod, "__path__");
1285 if (path == NULL)
1286 PyErr_Clear();
1287
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001288 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001289 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001290 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001291 if (fdp == NULL) {
1292 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1293 return NULL;
1294 PyErr_Clear();
1295 Py_INCREF(Py_None);
1296 return Py_None;
1297 }
1298 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001299 if (fp)
1300 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001301 if (m != NULL && mod != Py_None) {
1302 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1303 Py_DECREF(m);
1304 m = NULL;
1305 }
1306 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001307 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308
1309 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001310}
1311
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312
1313/* Re-import a module of any kind and return its module object, WITH
1314 INCREMENTED REFERENCE COUNT */
1315
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316PyObject *
1317PyImport_ReloadModule(m)
1318 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001320 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001321 PyObject *path = NULL;
1322 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001323 char buf[MAXPATHLEN+1];
1324 struct filedescr *fdp;
1325 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 if (m == NULL || !PyModule_Check(m)) {
1328 PyErr_SetString(PyExc_TypeError,
1329 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330 return NULL;
1331 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333 if (name == NULL)
1334 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001335 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001336 PyErr_Format(PyExc_ImportError,
1337 "reload(): module %.200s not in sys.modules",
1338 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001339 return NULL;
1340 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001341 subname = strrchr(name, '.');
1342 if (subname == NULL)
1343 subname = name;
1344 else {
1345 PyObject *parentname, *parent;
1346 parentname = PyString_FromStringAndSize(name, (subname-name));
1347 if (parentname == NULL)
1348 return NULL;
1349 parent = PyDict_GetItem(modules, parentname);
1350 if (parent == NULL) {
1351 PyErr_Format(PyExc_ImportError,
1352 "reload(): parent %.200s not in sys.modules",
1353 name);
1354 return NULL;
1355 }
1356 subname++;
1357 path = PyObject_GetAttrString(parent, "__path__");
1358 if (path == NULL)
1359 PyErr_Clear();
1360 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001361 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001362 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1363 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001364 if (fdp == NULL)
1365 return NULL;
1366 m = load_module(name, fp, buf, fdp->type);
1367 if (fp)
1368 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369 return m;
1370}
1371
1372
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001373/* Higher-level import emulator which emulates the "import" statement
1374 more accurately -- it invokes the __import__() function from the
1375 builtins of the current globals. This means that the import is
1376 done using whatever import hooks are installed in the current
1377 environment, e.g. by "ni" or "rexec". */
1378
1379PyObject *
1380PyImport_Import(module_name)
1381 PyObject *module_name;
1382{
1383 static PyObject *silly_list = NULL;
1384 static PyObject *builtins_str = NULL;
1385 static PyObject *import_str = NULL;
1386 static PyObject *standard_builtins = NULL;
1387 PyObject *globals = NULL;
1388 PyObject *import = NULL;
1389 PyObject *builtins = NULL;
1390 PyObject *r = NULL;
1391
1392 /* Initialize constant string objects */
1393 if (silly_list == NULL) {
1394 import_str = PyString_InternFromString("__import__");
1395 if (import_str == NULL)
1396 return NULL;
1397 builtins_str = PyString_InternFromString("__builtins__");
1398 if (builtins_str == NULL)
1399 return NULL;
1400 silly_list = Py_BuildValue("[s]", "__doc__");
1401 if (silly_list == NULL)
1402 return NULL;
1403 }
1404
1405 /* Get the builtins from current globals */
1406 globals = PyEval_GetGlobals();
1407 if(globals != NULL) {
1408 builtins = PyObject_GetItem(globals, builtins_str);
1409 if (builtins == NULL)
1410 goto err;
1411 }
1412 else {
1413 /* No globals -- use standard builtins, and fake globals */
1414 PyErr_Clear();
1415
1416 if (standard_builtins == NULL) {
1417 standard_builtins =
1418 PyImport_ImportModule("__builtin__");
1419 if (standard_builtins == NULL)
1420 return NULL;
1421 }
1422
1423 builtins = standard_builtins;
1424 Py_INCREF(builtins);
1425 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1426 if (globals == NULL)
1427 goto err;
1428 }
1429
1430 /* Get the __import__ function from the builtins */
1431 if (PyDict_Check(builtins))
1432 import=PyObject_GetItem(builtins, import_str);
1433 else
1434 import=PyObject_GetAttr(builtins, import_str);
1435 if (import == NULL)
1436 goto err;
1437
1438 /* Call the _import__ function with the proper argument list */
1439 r = PyObject_CallFunction(import, "OOOO",
1440 module_name, globals, globals, silly_list);
1441
1442 err:
1443 Py_XDECREF(globals);
1444 Py_XDECREF(builtins);
1445 Py_XDECREF(import);
1446
1447 return r;
1448}
1449
1450
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451/* Module 'imp' provides Python access to the primitives used for
1452 importing modules.
1453*/
1454
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001456imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 PyObject *self;
1458 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459{
1460 char buf[4];
1461
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001464 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1465 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1466 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1467 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001468
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001470}
1471
Guido van Rossum79f25d91997-04-29 20:08:16 +00001472static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 PyObject *self;
1475 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001476{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001478 struct filedescr *fdp;
1479
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001481 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001483 if (list == NULL)
1484 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1486 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001487 fdp->suffix, fdp->mode, fdp->type);
1488 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490 return NULL;
1491 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 if (PyList_Append(list, item) < 0) {
1493 Py_DECREF(list);
1494 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001495 return NULL;
1496 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001497 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001498 }
1499 return list;
1500}
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001503call_find_module(name, path)
1504 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001505 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509 struct filedescr *fdp;
1510 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001511 FILE *fp = NULL;
1512
1513 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001514 if (path == Py_None)
1515 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001516 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1517 if (fdp == NULL)
1518 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001519 if (fp != NULL) {
1520 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1521 if (fob == NULL) {
1522 fclose(fp);
1523 return NULL;
1524 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001525 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001526 else {
1527 fob = Py_None;
1528 Py_INCREF(fob);
1529 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001531 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001532 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 return ret;
1534}
1535
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001537imp_find_module(self, args)
1538 PyObject *self;
1539 PyObject *args;
1540{
1541 char *name;
1542 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001543 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001544 return NULL;
1545 return call_find_module(name, path);
1546}
1547
1548static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001549imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 PyObject *self;
1551 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001552{
1553 char *name;
1554 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 PyObject *m;
1556 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001557 return NULL;
1558 ret = init_builtin(name);
1559 if (ret < 0)
1560 return NULL;
1561 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562 Py_INCREF(Py_None);
1563 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001564 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 m = PyImport_AddModule(name);
1566 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001567 return m;
1568}
1569
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001571imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 PyObject *self;
1573 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001574{
1575 char *name;
1576 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyObject *m;
1578 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001579 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001581 if (ret < 0)
1582 return NULL;
1583 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 Py_INCREF(Py_None);
1585 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001586 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 m = PyImport_AddModule(name);
1588 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001589 return m;
1590}
1591
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001593imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 PyObject *self;
1595 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001596{
1597 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001598
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001600 return NULL;
1601 return get_frozen_object(name);
1602}
1603
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001605imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 PyObject *self;
1607 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001608{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001612 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001613}
1614
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001616imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 PyObject *self;
1618 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001620 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001623 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624}
1625
1626static FILE *
1627get_file(pathname, fob, mode)
1628 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001630 char *mode;
1631{
1632 FILE *fp;
1633 if (fob == NULL) {
1634 fp = fopen(pathname, mode);
1635 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001637 }
1638 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641 PyErr_SetString(PyExc_ValueError,
1642 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 }
1644 return fp;
1645}
1646
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649 PyObject *self;
1650 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651{
1652 char *name;
1653 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 PyObject *fob = NULL;
1655 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001657 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001659 return NULL;
1660 fp = get_file(pathname, fob, "rb");
1661 if (fp == NULL)
1662 return NULL;
1663 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001664 if (fob == NULL)
1665 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 return m;
1667}
1668
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001671 PyObject *self;
1672 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001673{
1674 char *name;
1675 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676 PyObject *fob = NULL;
1677 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001678 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1680 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001682 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001683 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001684 if (fp == NULL)
1685 return NULL;
1686 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001688 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689}
1690
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001692imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 PyObject *self;
1694 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695{
1696 char *name;
1697 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 PyObject *fob = NULL;
1699 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001700 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001701 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001703 return NULL;
1704 fp = get_file(pathname, fob, "r");
1705 if (fp == NULL)
1706 return NULL;
1707 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001708 if (fob == NULL)
1709 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001710 return m;
1711}
1712
Jack Jansen9c96a921995-02-15 22:57:06 +00001713#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001715imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *self;
1717 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001718{
1719 char *name;
1720 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001722
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001724 return NULL;
1725 m = PyMac_LoadResourceModule(name, pathname);
1726 return m;
1727}
1728#endif /* macintosh */
1729
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001731imp_load_module(self, args)
1732 PyObject *self;
1733 PyObject *args;
1734{
1735 char *name;
1736 PyObject *fob;
1737 char *pathname;
1738 char *suffix; /* Unused */
1739 char *mode;
1740 int type;
1741 FILE *fp;
1742
1743 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1744 &name, &fob, &pathname,
1745 &suffix, &mode, &type))
1746 return NULL;
1747 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1748 PyErr_Format(PyExc_ValueError,
1749 "invalid file open mode %.200s", mode);
1750 return NULL;
1751 }
1752 if (fob == Py_None)
1753 fp = NULL;
1754 else {
1755 if (!PyFile_Check(fob)) {
1756 PyErr_SetString(PyExc_ValueError,
1757 "load_module arg#2 should be a file or None");
1758 return NULL;
1759 }
1760 fp = get_file(pathname, fob, mode);
1761 if (fp == NULL)
1762 return NULL;
1763 }
1764 return load_module(name, fp, pathname, type);
1765}
1766
1767static PyObject *
1768imp_load_package(self, args)
1769 PyObject *self;
1770 PyObject *args;
1771{
1772 char *name;
1773 char *pathname;
1774 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1775 return NULL;
1776 return load_package(name, pathname);
1777}
1778
1779static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001780imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyObject *self;
1782 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783{
1784 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788}
1789
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001790/* Doc strings */
1791
1792static char doc_imp[] = "\
1793This module provides the components needed to build your own\n\
1794__import__ function. Undocumented functions are obsolete.\n\
1795";
1796
1797static char doc_find_module[] = "\
1798find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
1799Search for a module. If path is omitted or None, search for a\n\
1800built-in, frozen or special module and continue search in sys.path.\n\
1801The module name cannot contain '.'; to search for a submodule of a\n\
1802package, pass the submodule name and the package's __path__.\
1803";
1804
1805static char doc_load_module[] = "\
1806load_module(name, file, filename, (suffix, mode, type)) -> module\n\
1807Load a module, given information returned by find_module().\n\
1808The module name must include the full package name, if any.\
1809";
1810
1811static char doc_get_magic[] = "\
1812get_magic() -> string\n\
1813Return the magic number for .pyc or .pyo files.\
1814";
1815
1816static char doc_get_suffixes[] = "\
1817get_suffixes() -> [(suffix, mode, type), ...]\n\
1818Return a list of (suffix, mode, type) tuples describing the files\n\
1819that find_module() looks for.\
1820";
1821
1822static char doc_new_module[] = "\
1823new_module(name) -> module\n\
1824Create a new module. Do not enter it in sys.modules.\n\
1825The module name must include the full package name, if any.\
1826";
1827
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001829 {"find_module", imp_find_module, 1, doc_find_module},
1830 {"get_magic", imp_get_magic, 1, doc_get_magic},
1831 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
1832 {"load_module", imp_load_module, 1, doc_load_module},
1833 {"new_module", imp_new_module, 1, doc_new_module},
1834 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001835 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001836 {"init_builtin", imp_init_builtin, 1},
1837 {"init_frozen", imp_init_frozen, 1},
1838 {"is_builtin", imp_is_builtin, 1},
1839 {"is_frozen", imp_is_frozen, 1},
1840 {"load_compiled", imp_load_compiled, 1},
1841 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001842 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001843#ifdef macintosh
1844 {"load_resource", imp_load_resource, 1},
1845#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001846 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 {NULL, NULL} /* sentinel */
1848};
1849
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001850int
1851setint(d, name, value)
1852 PyObject *d;
1853 char *name;
1854 int value;
1855{
1856 PyObject *v;
1857 int err;
1858
1859 v = PyInt_FromLong((long)value);
1860 err = PyDict_SetItemString(d, name, v);
1861 Py_XDECREF(v);
1862 return err;
1863}
1864
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001865void
1866initimp()
1867{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001868 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001870 m = Py_InitModule4("imp", imp_methods, doc_imp,
1871 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001874 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1875 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1876 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1877 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1878 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1879 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1880 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1881 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001883 failure:
1884 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001885}