blob: 9f68c626cd2f01ca7ff0baaf33b9667487fdd38e [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 Rossum771c6c81997-10-31 18:37:24 +000083/* This table is defined in config.c: */
84extern struct _inittab _PyImport_Inittab[];
85
86struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000087
Guido van Rossum1ae940a1995-01-02 19:04:15 +000088/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089
90void
Guido van Rossum25ce5661997-08-02 03:10:38 +000091_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
Guido van Rossum0824f631997-03-11 18:37:35 +000093 if (Py_OptimizeFlag) {
94 /* Replace ".pyc" with ".pyo" in import_filetab */
95 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000096 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000097 if (strcmp(p->suffix, ".pyc") == 0)
98 p->suffix = ".pyo";
99 }
100 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101}
102
Guido van Rossum25ce5661997-08-02 03:10:38 +0000103void
104_PyImport_Fini()
105{
106 Py_XDECREF(extensions);
107 extensions = NULL;
108}
109
110
111/* Helper for sys */
112
113PyObject *
114PyImport_GetModuleDict()
115{
116 PyInterpreterState *interp = PyThreadState_Get()->interp;
117 if (interp->modules == NULL)
118 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
119 return interp->modules;
120}
121
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122
Guido van Rossum085d2691997-08-05 02:20:51 +0000123/* Helper for PyImport_Cleanup */
124
125static void
126clear_carefully(d)
127 PyObject *d;
128{
129 /* To make the execution order of destructors for global
130 objects a bit more predictable, we first zap all objects
131 whose name starts with a single underscore, before we clear
132 the entire dictionary. We zap them by replacing them with
133 None, rather than deleting them from the dictionary, to
134 avoid rehashing the dictionary (to some extent). */
135
136 int pos;
137 PyObject *key, *value;
138
139 pos = 0;
140 while (PyDict_Next(d, &pos, &key, &value)) {
141 if (value != Py_None && PyString_Check(key)) {
142 char *s = PyString_AsString(key);
143 if (s[0] == '_' && s[1] != '_')
144 PyDict_SetItem(d, key, Py_None);
145 }
146 }
147
148 PyDict_Clear(d);
149}
150
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152
Guido van Rossum3f5da241990-12-20 15:06:42 +0000153void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156 PyInterpreterState *interp = PyThreadState_Get()->interp;
157 PyObject *tmp = interp->modules;
158 if (tmp != NULL) {
159 int pos;
160 PyObject *key, *value;
161 interp->modules = NULL;
162 pos = 0;
163 while (PyDict_Next(tmp, &pos, &key, &value)) {
164 if (PyModule_Check(value)) {
165 PyObject *d = PyModule_GetDict(value);
Guido van Rossum085d2691997-08-05 02:20:51 +0000166 clear_carefully(d);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167 }
168 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 PyDict_Clear(tmp);
170 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000172}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000173
174
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175/* Helper for pythonrun.c -- return magic number */
176
177long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000179{
180 return MAGIC;
181}
182
183
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184/* Magic for extension modules (built-in as well as dynamically
185 loaded). To prevent initializing an extension module more than
186 once, we keep a static dictionary 'extensions' keyed by module name
187 (for built-in modules) or by filename (for dynamically loaded
188 modules), containing these modules. A copy od the module's
189 dictionary is stored by calling _PyImport_FixupExtension()
190 immediately after the module initialization function succeeds. A
191 copy can be retrieved from there by calling
192 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000193
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195_PyImport_FixupExtension(name, filename)
196 char *name;
197 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000198{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 PyObject *modules, *mod, *dict, *copy;
200 if (extensions == NULL) {
201 extensions = PyDict_New();
202 if (extensions == NULL)
203 return NULL;
204 }
205 modules = PyImport_GetModuleDict();
206 mod = PyDict_GetItemString(modules, name);
207 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000208 PyErr_Format(PyExc_SystemError,
209 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000210 return NULL;
211 }
212 dict = PyModule_GetDict(mod);
213 if (dict == NULL)
214 return NULL;
215 copy = PyObject_CallMethod(dict, "copy", "");
216 if (copy == NULL)
217 return NULL;
218 PyDict_SetItemString(extensions, filename, copy);
219 Py_DECREF(copy);
220 return copy;
221}
222
223PyObject *
224_PyImport_FindExtension(name, filename)
225 char *name;
226 char *filename;
227{
228 PyObject *dict, *mod, *mdict, *result;
229 if (extensions == NULL)
230 return NULL;
231 dict = PyDict_GetItemString(extensions, filename);
232 if (dict == NULL)
233 return NULL;
234 mod = PyImport_AddModule(name);
235 if (mod == NULL)
236 return NULL;
237 mdict = PyModule_GetDict(mod);
238 if (mdict == NULL)
239 return NULL;
240 result = PyObject_CallMethod(mdict, "update", "O", dict);
241 if (result == NULL)
242 return NULL;
243 Py_DECREF(result);
244 if (Py_VerboseFlag)
245 fprintf(stderr, "import %s # previously loaded (%s)\n",
246 name, filename);
247 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248}
249
250
251/* Get the module object corresponding to a module name.
252 First check the modules dictionary if there's one there,
253 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000254 Because the former action is most common, THIS DOES NOT RETURN A
255 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257PyObject *
258PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000259 char *name;
260{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000266 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268 if (m == NULL)
269 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272 return NULL;
273 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000275
276 return m;
277}
278
279
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000280/* Execute a code object in a module and return the module object
281 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283PyObject *
284PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000288 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000292 if (m == NULL)
293 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 d = PyModule_GetDict(m);
295 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
296 if (PyDict_SetItemString(d, "__builtins__",
297 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000298 return NULL;
299 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000300 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 if (PyDict_SetItemString(d, "__file__",
302 ((PyCodeObject *)co)->co_filename) != 0)
303 PyErr_Clear(); /* Not important enough to report */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000304 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 if (v == NULL)
306 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000308
Guido van Rossum25ce5661997-08-02 03:10:38 +0000309 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000310 PyErr_Format(PyExc_ImportError,
311 "Loaded module %.200s not found in sys.modules",
312 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000313 return NULL;
314 }
315
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317
318 return m;
319}
320
321
322/* Given a pathname for a Python source file, fill a buffer with the
323 pathname for the corresponding compiled file. Return the pathname
324 for the compiled file, or NULL if there's no space in the buffer.
325 Doesn't set an exception. */
326
327static char *
328make_compiled_pathname(pathname, buf, buflen)
329 char *pathname;
330 char *buf;
331 int buflen;
332{
333 int len;
334
335 len = strlen(pathname);
336 if (len+2 > buflen)
337 return NULL;
338 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000339 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
341 return buf;
342}
343
344
345/* Given a pathname for a Python source file, its time of last
346 modification, and a pathname for a compiled file, check whether the
347 compiled file represents the same version of the source. If so,
348 return a FILE pointer for the compiled file, positioned just after
349 the header; if not, return NULL.
350 Doesn't set an exception. */
351
352static FILE *
353check_compiled_module(pathname, mtime, cpathname)
354 char *pathname;
355 long mtime;
356 char *cpathname;
357{
358 FILE *fp;
359 long magic;
360 long pyc_mtime;
361
362 fp = fopen(cpathname, "rb");
363 if (fp == NULL)
364 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000366 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368 fprintf(stderr, "# %s has bad magic\n", cpathname);
369 fclose(fp);
370 return NULL;
371 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375 fprintf(stderr, "# %s has bad mtime\n", cpathname);
376 fclose(fp);
377 return NULL;
378 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
381 return fp;
382}
383
384
385/* Read a code object from a file and check it for validity */
386
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000388read_compiled_module(cpathname, fp)
389 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 FILE *fp;
391{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 if (co == NULL || !PyCode_Check(co)) {
397 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000398 PyErr_Format(PyExc_ImportError,
399 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 return NULL;
402 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000404}
405
406
407/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000408 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000411load_compiled_module(name, cpathname, fp)
412 char *name;
413 char *cpathname;
414 FILE *fp;
415{
416 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 PyCodeObject *co;
418 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000422 PyErr_Format(PyExc_ImportError,
423 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 return NULL;
425 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000427 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 if (co == NULL)
429 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431 fprintf(stderr, "import %s # precompiled from %s\n",
432 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 m = PyImport_ExecCodeModule(name, (PyObject *)co);
434 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435
436 return m;
437}
438
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439/* Parse a source file and return the corresponding code object */
440
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442parse_source_module(pathname, fp)
443 char *pathname;
444 FILE *fp;
445{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 node *n;
448
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000449 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 if (n == NULL)
451 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 co = PyNode_Compile(n, pathname);
453 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454
455 return co;
456}
457
458
459/* Write a compiled module to a file, placing the time of last
460 modification of its source into the header.
461 Errors are ignored, if a write error occurs an attempt is made to
462 remove the file. */
463
464static void
465write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 char *cpathname;
468 long mtime;
469{
470 FILE *fp;
471
472 fp = fopen(cpathname, "wb");
473 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 fprintf(stderr,
476 "# can't create %s\n", cpathname);
477 return;
478 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyMarshal_WriteLongToFile(0L, fp);
482 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000485 fprintf(stderr, "# can't write %s\n", cpathname);
486 /* Don't keep partial file */
487 fclose(fp);
488 (void) unlink(cpathname);
489 return;
490 }
491 /* Now write the true mtime */
492 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 fflush(fp);
495 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 fprintf(stderr, "# wrote %s\n", cpathname);
498#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000499 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500#endif
501}
502
503
504/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000505 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
506 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509load_source_module(name, pathname, fp)
510 char *name;
511 char *pathname;
512 FILE *fp;
513{
514 long mtime;
515 FILE *fpc;
516 char buf[MAXPATHLEN+1];
517 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 PyCodeObject *co;
519 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000521 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
523 if (cpathname != NULL &&
524 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000525 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 fclose(fpc);
527 if (co == NULL)
528 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 fprintf(stderr, "import %s # precompiled from %s\n",
531 name, cpathname);
532 }
533 else {
534 co = parse_source_module(pathname, fp);
535 if (co == NULL)
536 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 fprintf(stderr, "import %s # from %s\n",
539 name, pathname);
540 write_compiled_module(co, cpathname, mtime);
541 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 m = PyImport_ExecCodeModule(name, (PyObject *)co);
543 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544
545 return m;
546}
547
548
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000549/* Forward */
550static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
551static struct filedescr *find_module Py_PROTO((char *, PyObject *,
552 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000553static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000554
555/* Load a package and return its module object WITH INCREMENTED
556 REFERENCE COUNT */
557
558static PyObject *
559load_package(name, pathname)
560 char *name;
561 char *pathname;
562{
563 PyObject *m, *d, *file, *path;
564 int err;
565 char buf[MAXPATHLEN+1];
566 FILE *fp = NULL;
567 struct filedescr *fdp;
568
569 m = PyImport_AddModule(name);
570 if (m == NULL)
571 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000572 if (Py_VerboseFlag)
573 fprintf(stderr, "import %s # directory %s\n",
574 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000575 d = PyModule_GetDict(m);
576 file = PyString_FromString(pathname);
577 if (file == NULL)
578 return NULL;
579 path = Py_BuildValue("[O]", file);
580 if (path == NULL) {
581 Py_DECREF(file);
582 return NULL;
583 }
584 err = PyDict_SetItemString(d, "__file__", file);
585 if (err == 0)
586 err = PyDict_SetItemString(d, "__path__", path);
587 if (err != 0) {
588 m = NULL;
589 goto cleanup;
590 }
591 buf[0] = '\0';
592 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
593 if (fdp == NULL) {
594 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
595 PyErr_Clear();
596 }
597 else
598 m = NULL;
599 goto cleanup;
600 }
601 m = load_module(name, fp, buf, fdp->type);
602 if (fp != NULL)
603 fclose(fp);
604 cleanup:
605 Py_XINCREF(m);
606 Py_XDECREF(path);
607 Py_XDECREF(file);
608 return m;
609}
610
611
612/* Helper to test for built-in module */
613
614static int
615is_builtin(name)
616 char *name;
617{
618 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000619 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
620 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
621 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000622 return -1;
623 else
624 return 1;
625 }
626 }
627 return 0;
628}
629
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000630
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631/* Search the path (default sys.path) for a module. Return the
632 corresponding filedescr struct, and (via return arguments) the
633 pathname and an open file. Return NULL if the module is not found. */
634
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000635#ifdef MS_COREDLL
636extern FILE *PyWin_FindRegisteredModule();
637#endif
638
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639static struct filedescr *
640find_module(name, path, buf, buflen, p_fp)
641 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643 /* Output parameters: */
644 char *buf;
645 int buflen;
646 FILE **p_fp;
647{
648 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000649 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000650 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000651 struct stat statbuf;
652
653 if (path == NULL) {
654 if (is_builtin(name)) {
655 static struct filedescr fd = {"", "", C_BUILTIN};
656 return &fd;
657 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000658 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000659 static struct filedescr fd = {"", "", PY_FROZEN};
660 return &fd;
661 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000662
Guido van Rossumac279101996-08-22 23:10:58 +0000663#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000664 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
665 if (fp != NULL) {
666 *p_fp = fp;
667 return fdp;
668 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000669#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000670 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000671
672
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 path = PySys_GetObject("path");
675 if (path == NULL || !PyList_Check(path)) {
676 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000677 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000678 return NULL;
679 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 namelen = strlen(name);
682 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyObject *v = PyList_GetItem(path, i);
684 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000687 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000690 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000692#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000693#ifdef INTERN_STRINGS
694 /*
695 ** Speedup: each sys.path item is interned, and
696 ** FindResourceModule remembers which items refer to
697 ** folders (so we don't have to bother trying to look
698 ** into them for resources).
699 */
700 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
701 v = PyList_GET_ITEM(path, i);
702#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000703 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 static struct filedescr resfiledescr =
705 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000706
707 return &resfiledescr;
708 }
709#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000710 if (len > 0 && buf[len-1] != SEP
711#ifdef ALTSEP
712 && buf[len-1] != ALTSEP
713#endif
714 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000716#ifdef IMPORT_8x3_NAMES
717 /* see if we are searching in directory dos_8x3 */
718 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
719 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000721 for (j = 0; (ch = name[j]) && j < 8; j++)
722 if (isupper(ch))
723 buf[len++] = tolower(ch);
724 else
725 buf[len++] = ch;
726 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000727 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000728#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000729 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000730 strcpy(buf+len, name);
731 len += namelen;
732 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000733#ifdef HAVE_STAT
734 if (stat(buf, &statbuf) == 0) {
735 static struct filedescr fd = {"", "", PKG_DIRECTORY};
736 if (S_ISDIR(statbuf.st_mode))
737 return &fd;
738 }
739#else
740 /* XXX How are you going to test for directories? */
741#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000742#ifdef macintosh
743 fdp = PyMac_FindModuleExtension(buf, &len, name);
744 if (fdp)
745 fp = fopen(buf, fdp->mode);
746#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750 fprintf(stderr, "# trying %s\n", buf);
751 fp = fopen(buf, fdp->mode);
752 if (fp != NULL)
753 break;
754 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000755#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 if (fp != NULL)
757 break;
758 }
759 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000760 PyErr_Format(PyExc_ImportError,
761 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 return NULL;
763 }
764
765 *p_fp = fp;
766 return fdp;
767}
768
769
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000770static int init_builtin Py_PROTO((char *)); /* Forward */
771
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000773 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000776load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000778 FILE *fp;
779 char *buf;
780 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000782 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000784 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000786 /* First check that there's an open file (if we need one) */
787 switch (type) {
788 case PY_SOURCE:
789 case PY_COMPILED:
790 if (fp == NULL) {
791 PyErr_Format(PyExc_ValueError,
792 "file object required for import (type code %d)",
793 type);
794 return NULL;
795 }
796 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000798 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799
800 case PY_SOURCE:
801 m = load_source_module(name, buf, fp);
802 break;
803
804 case PY_COMPILED:
805 m = load_compiled_module(name, buf, fp);
806 break;
807
808 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 break;
811
Jack Jansen9c96a921995-02-15 22:57:06 +0000812#ifdef macintosh
813 case PY_RESOURCE:
814 m = PyMac_LoadResourceModule(name, buf);
815 break;
816#endif
817
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000818 case PKG_DIRECTORY:
819 m = load_package(name, buf);
820 break;
821
822 case C_BUILTIN:
823 case PY_FROZEN:
824 if (type == C_BUILTIN)
825 err = init_builtin(name);
826 else
827 err = PyImport_ImportFrozenModule(name);
828 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000829 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000830 if (err == 0) {
831 PyErr_Format(PyExc_ImportError,
832 "Purported %s module %.200s not found",
833 type == C_BUILTIN ?
834 "builtin" : "frozen",
835 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000836 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000837 }
838 modules = PyImport_GetModuleDict();
839 m = PyDict_GetItemString(modules, name);
840 if (m == NULL) {
841 PyErr_Format(
842 PyExc_ImportError,
843 "%s module %.200s not properly initialized",
844 type == C_BUILTIN ?
845 "builtin" : "frozen",
846 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000847 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000848 }
849 Py_INCREF(m);
850 break;
851
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000853 PyErr_Format(PyExc_ImportError,
854 "Don't know how to import %.200s (type code %d)",
855 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000856 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857
858 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859
860 return m;
861}
862
863
864/* Initialize a built-in module.
865 Return 1 for succes, 0 if the module is not found, and -1 with
866 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000867
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000868static int
869init_builtin(name)
870 char *name;
871{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000872 struct _inittab *p;
873 PyObject *mod;
874
875 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
876 return 1;
877
Guido van Rossum771c6c81997-10-31 18:37:24 +0000878 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000879 if (strcmp(name, p->name) == 0) {
880 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000881 PyErr_Format(PyExc_ImportError,
882 "Cannot re-init internal module %.200s",
883 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000884 return -1;
885 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000887 fprintf(stderr, "import %s # builtin\n", name);
888 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000891 if (_PyImport_FixupExtension(name, name) == NULL)
892 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000893 return 1;
894 }
895 }
896 return 0;
897}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000898
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000900/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000902static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000903find_frozen(name)
904 char *name;
905{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000906 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000907
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000909 if (p->name == NULL)
910 return NULL;
911 if (strcmp(p->name, name) == 0)
912 break;
913 }
914 return p;
915}
916
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000918get_frozen_object(name)
919 char *name;
920{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000921 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000922
923 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000924 PyErr_Format(PyExc_ImportError,
925 "No such frozen object named %.200s",
926 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000927 return NULL;
928 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000930}
931
932/* Initialize a frozen module.
933 Return 1 for succes, 0 if the module is not found, and -1 with
934 an exception set if the initialization failed.
935 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000936
937int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000939 char *name;
940{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000941 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 PyObject *co;
943 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000944
945 if (p == NULL)
946 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000948 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000950 if (co == NULL)
951 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 if (!PyCode_Check(co)) {
953 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000954 PyErr_Format(PyExc_TypeError,
955 "frozen object %.200s is not a code object",
956 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000957 return -1;
958 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 m = PyImport_ExecCodeModule(name, co);
960 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000961 if (m == NULL)
962 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000964 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000965}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000966
967
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000968/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000969 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000970
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971PyObject *
972PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000974{
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000975 static PyObject *fromlist = NULL;
976 if (fromlist == NULL && strchr(name, '.') != NULL) {
977 fromlist = Py_BuildValue("[s]", "*");
978 if (fromlist == NULL)
979 return NULL;
980 }
981 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000982}
983
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000984/* Forward declarations for helper routines */
985static PyObject *get_parent Py_PROTO((PyObject *globals,
986 char *buf, int *p_buflen));
987static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
988 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +0000989static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000990static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +0000991 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000992static PyObject * import_submodule Py_PROTO((PyObject *mod,
993 char *name, char *fullname));
994
995/* The Magnum Opus of dotted-name import :-) */
996
997/* XXX TO DO:
998 - Remember misses in package directories so package submodules
999 that all import the same toplevel module don't keep hitting on the
1000 package directory first
1001*/
1002
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001003PyObject *
1004PyImport_ImportModuleEx(name, globals, locals, fromlist)
1005 char *name;
1006 PyObject *globals;
1007 PyObject *locals;
1008 PyObject *fromlist;
1009{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001010 char buf[MAXPATHLEN+1];
1011 int buflen = 0;
1012 PyObject *parent, *head, *next, *tail;
1013
1014 parent = get_parent(globals, buf, &buflen);
1015 if (parent == NULL)
1016 return NULL;
1017
1018 head = load_next(parent, Py_None, &name, buf, &buflen);
1019 if (head == NULL)
1020 return NULL;
1021
1022 tail = head;
1023 Py_INCREF(tail);
1024 while (name) {
1025 next = load_next(tail, tail, &name, buf, &buflen);
1026 Py_DECREF(tail);
1027 if (next == NULL) {
1028 Py_DECREF(head);
1029 return NULL;
1030 }
1031 tail = next;
1032 }
1033
1034 if (fromlist != NULL) {
1035 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1036 fromlist = NULL;
1037 }
1038
1039 if (fromlist == NULL) {
1040 Py_DECREF(tail);
1041 return head;
1042 }
1043
1044 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001045 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001046 Py_DECREF(tail);
1047 return NULL;
1048 }
1049
1050 return tail;
1051}
1052
1053static PyObject *
1054get_parent(globals, buf, p_buflen)
1055 PyObject *globals;
1056 char *buf;
1057 int *p_buflen;
1058{
1059 static PyObject *namestr = NULL;
1060 static PyObject *pathstr = NULL;
1061 PyObject *modname, *modpath, *modules, *parent;
1062
1063 if (globals == NULL || !PyDict_Check(globals))
1064 return Py_None;
1065
1066 if (namestr == NULL) {
1067 namestr = PyString_InternFromString("__name__");
1068 if (namestr == NULL)
1069 return NULL;
1070 }
1071 if (pathstr == NULL) {
1072 pathstr = PyString_InternFromString("__path__");
1073 if (pathstr == NULL)
1074 return NULL;
1075 }
1076
1077 *buf = '\0';
1078 *p_buflen = 0;
1079 modname = PyDict_GetItem(globals, namestr);
1080 if (modname == NULL || !PyString_Check(modname))
1081 return Py_None;
1082
1083 modpath = PyDict_GetItem(globals, pathstr);
1084 if (modpath != NULL) {
1085 int len = PyString_GET_SIZE(modname);
1086 if (len > MAXPATHLEN) {
1087 PyErr_SetString(PyExc_ValueError,
1088 "Module name too long");
1089 return NULL;
1090 }
1091 strcpy(buf, PyString_AS_STRING(modname));
1092 *p_buflen = len;
1093 }
1094 else {
1095 char *start = PyString_AS_STRING(modname);
1096 char *lastdot = strrchr(start, '.');
1097 int len;
1098 if (lastdot == NULL)
1099 return Py_None;
1100 len = lastdot - start;
1101 if (len >= MAXPATHLEN) {
1102 PyErr_SetString(PyExc_ValueError,
1103 "Module name too long");
1104 return NULL;
1105 }
1106 strncpy(buf, start, len);
1107 buf[len] = '\0';
1108 *p_buflen = len;
1109 }
1110
1111 modules = PyImport_GetModuleDict();
1112 parent = PyDict_GetItemString(modules, buf);
1113 if (parent == NULL)
1114 parent = Py_None;
1115 return parent;
1116 /* We expect, but can't guarantee, if parent != None, that:
1117 - parent.__name__ == buf
1118 - parent.__dict__ is globals
1119 If this is violated... Who cares? */
1120}
1121
1122static PyObject *
1123load_next(mod, altmod, p_name, buf, p_buflen)
1124 PyObject *mod;
1125 PyObject *altmod; /* Either None or same as mod */
1126 char **p_name;
1127 char *buf;
1128 int *p_buflen;
1129{
1130 char *name = *p_name;
1131 char *dot = strchr(name, '.');
1132 int len;
1133 char *p;
1134 PyObject *result;
1135
1136 if (dot == NULL) {
1137 *p_name = NULL;
1138 len = strlen(name);
1139 }
1140 else {
1141 *p_name = dot+1;
1142 len = dot-name;
1143 }
1144
1145 p = buf + *p_buflen;
1146 if (p != buf)
1147 *p++ = '.';
1148 if (p+len-buf >= MAXPATHLEN) {
1149 PyErr_SetString(PyExc_ValueError,
1150 "Module name too long");
1151 return NULL;
1152 }
1153 strncpy(p, name, len);
1154 p[len] = '\0';
1155 *p_buflen = p+len-buf;
1156
1157 result = import_submodule(mod, p, buf);
1158 if (result == Py_None && altmod != mod) {
1159 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001160 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001161 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001162 if (result != NULL && result != Py_None) {
1163 if (mark_miss(buf) != 0) {
1164 Py_DECREF(result);
1165 return NULL;
1166 }
1167 strncpy(buf, name, len);
1168 buf[len] = '\0';
1169 *p_buflen = len;
1170 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001171 }
1172 if (result == NULL)
1173 return NULL;
1174
1175 if (result == Py_None) {
1176 Py_DECREF(result);
1177 PyErr_Format(PyExc_ImportError,
1178 "No module named %.200s", name);
1179 return NULL;
1180 }
1181
1182 return result;
1183}
1184
1185static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001186mark_miss(name)
1187 char *name;
1188{
1189 PyObject *modules = PyImport_GetModuleDict();
1190 return PyDict_SetItemString(modules, name, Py_None);
1191}
1192
1193static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001194ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001195 PyObject *mod;
1196 PyObject *fromlist;
1197 char *buf;
1198 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001199 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001200{
1201 int i;
1202
1203 if (!PyObject_HasAttrString(mod, "__path__"))
1204 return 1;
1205
1206 for (i = 0; ; i++) {
1207 PyObject *item = PySequence_GetItem(fromlist, i);
1208 int hasit;
1209 if (item == NULL) {
1210 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1211 PyErr_Clear();
1212 return 1;
1213 }
1214 return 0;
1215 }
1216 if (!PyString_Check(item)) {
1217 PyErr_SetString(PyExc_TypeError,
1218 "Item in ``from list'' not a string");
1219 Py_DECREF(item);
1220 return 0;
1221 }
1222 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001223 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001224 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001225 /* See if the package defines __all__ */
1226 if (recursive)
1227 continue; /* Avoid endless recursion */
1228 all = PyObject_GetAttrString(mod, "__all__");
1229 if (all == NULL)
1230 PyErr_Clear();
1231 else {
1232 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1233 return 0;
1234 Py_DECREF(all);
1235 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001236 continue;
1237 }
1238 hasit = PyObject_HasAttr(mod, item);
1239 if (!hasit) {
1240 char *subname = PyString_AS_STRING(item);
1241 PyObject *submod;
1242 char *p;
1243 if (buflen + strlen(subname) >= MAXPATHLEN) {
1244 PyErr_SetString(PyExc_ValueError,
1245 "Module name too long");
1246 Py_DECREF(item);
1247 return 0;
1248 }
1249 p = buf + buflen;
1250 *p++ = '.';
1251 strcpy(p, subname);
1252 submod = import_submodule(mod, subname, buf);
1253 Py_XDECREF(submod);
1254 if (submod == NULL) {
1255 Py_DECREF(item);
1256 return 0;
1257 }
1258 }
1259 Py_DECREF(item);
1260 }
1261
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001262 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001263}
1264
1265static PyObject *
1266import_submodule(mod, subname, fullname)
1267 PyObject *mod; /* May be None */
1268 char *subname;
1269 char *fullname;
1270{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001271 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001273
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001274 /* Require:
1275 if mod == None: subname == fullname
1276 else: mod.__name__ + "." + subname == fullname
1277 */
1278
1279 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001281 }
1282 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001283 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001284 char buf[MAXPATHLEN+1];
1285 struct filedescr *fdp;
1286 FILE *fp = NULL;
1287
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001288 path = PyObject_GetAttrString(mod, "__path__");
1289 if (path == NULL)
1290 PyErr_Clear();
1291
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001292 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001293 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001294 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001295 if (fdp == NULL) {
1296 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1297 return NULL;
1298 PyErr_Clear();
1299 Py_INCREF(Py_None);
1300 return Py_None;
1301 }
1302 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001303 if (fp)
1304 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001305 if (m != NULL && mod != Py_None) {
1306 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1307 Py_DECREF(m);
1308 m = NULL;
1309 }
1310 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001311 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312
1313 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001314}
1315
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316
1317/* Re-import a module of any kind and return its module object, WITH
1318 INCREMENTED REFERENCE COUNT */
1319
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320PyObject *
1321PyImport_ReloadModule(m)
1322 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001324 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001325 PyObject *path = NULL;
1326 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001327 char buf[MAXPATHLEN+1];
1328 struct filedescr *fdp;
1329 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 if (m == NULL || !PyModule_Check(m)) {
1332 PyErr_SetString(PyExc_TypeError,
1333 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001334 return NULL;
1335 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337 if (name == NULL)
1338 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001339 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001340 PyErr_Format(PyExc_ImportError,
1341 "reload(): module %.200s not in sys.modules",
1342 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001343 return NULL;
1344 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001345 subname = strrchr(name, '.');
1346 if (subname == NULL)
1347 subname = name;
1348 else {
1349 PyObject *parentname, *parent;
1350 parentname = PyString_FromStringAndSize(name, (subname-name));
1351 if (parentname == NULL)
1352 return NULL;
1353 parent = PyDict_GetItem(modules, parentname);
1354 if (parent == NULL) {
1355 PyErr_Format(PyExc_ImportError,
1356 "reload(): parent %.200s not in sys.modules",
1357 name);
1358 return NULL;
1359 }
1360 subname++;
1361 path = PyObject_GetAttrString(parent, "__path__");
1362 if (path == NULL)
1363 PyErr_Clear();
1364 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001365 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001366 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1367 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001368 if (fdp == NULL)
1369 return NULL;
1370 m = load_module(name, fp, buf, fdp->type);
1371 if (fp)
1372 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001373 return m;
1374}
1375
1376
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001377/* Higher-level import emulator which emulates the "import" statement
1378 more accurately -- it invokes the __import__() function from the
1379 builtins of the current globals. This means that the import is
1380 done using whatever import hooks are installed in the current
1381 environment, e.g. by "ni" or "rexec". */
1382
1383PyObject *
1384PyImport_Import(module_name)
1385 PyObject *module_name;
1386{
1387 static PyObject *silly_list = NULL;
1388 static PyObject *builtins_str = NULL;
1389 static PyObject *import_str = NULL;
1390 static PyObject *standard_builtins = NULL;
1391 PyObject *globals = NULL;
1392 PyObject *import = NULL;
1393 PyObject *builtins = NULL;
1394 PyObject *r = NULL;
1395
1396 /* Initialize constant string objects */
1397 if (silly_list == NULL) {
1398 import_str = PyString_InternFromString("__import__");
1399 if (import_str == NULL)
1400 return NULL;
1401 builtins_str = PyString_InternFromString("__builtins__");
1402 if (builtins_str == NULL)
1403 return NULL;
1404 silly_list = Py_BuildValue("[s]", "__doc__");
1405 if (silly_list == NULL)
1406 return NULL;
1407 }
1408
1409 /* Get the builtins from current globals */
1410 globals = PyEval_GetGlobals();
1411 if(globals != NULL) {
1412 builtins = PyObject_GetItem(globals, builtins_str);
1413 if (builtins == NULL)
1414 goto err;
1415 }
1416 else {
1417 /* No globals -- use standard builtins, and fake globals */
1418 PyErr_Clear();
1419
1420 if (standard_builtins == NULL) {
1421 standard_builtins =
1422 PyImport_ImportModule("__builtin__");
1423 if (standard_builtins == NULL)
1424 return NULL;
1425 }
1426
1427 builtins = standard_builtins;
1428 Py_INCREF(builtins);
1429 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1430 if (globals == NULL)
1431 goto err;
1432 }
1433
1434 /* Get the __import__ function from the builtins */
1435 if (PyDict_Check(builtins))
1436 import=PyObject_GetItem(builtins, import_str);
1437 else
1438 import=PyObject_GetAttr(builtins, import_str);
1439 if (import == NULL)
1440 goto err;
1441
1442 /* Call the _import__ function with the proper argument list */
1443 r = PyObject_CallFunction(import, "OOOO",
1444 module_name, globals, globals, silly_list);
1445
1446 err:
1447 Py_XDECREF(globals);
1448 Py_XDECREF(builtins);
1449 Py_XDECREF(import);
1450
1451 return r;
1452}
1453
1454
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455/* Module 'imp' provides Python access to the primitives used for
1456 importing modules.
1457*/
1458
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001460imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 PyObject *self;
1462 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463{
1464 char buf[4];
1465
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001468 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1469 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1470 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1471 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001474}
1475
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001477imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 PyObject *self;
1479 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001480{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482 struct filedescr *fdp;
1483
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001485 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001487 if (list == NULL)
1488 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1490 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001491 fdp->suffix, fdp->mode, fdp->type);
1492 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001494 return NULL;
1495 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 if (PyList_Append(list, item) < 0) {
1497 Py_DECREF(list);
1498 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499 return NULL;
1500 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001502 }
1503 return list;
1504}
1505
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001507call_find_module(name, path)
1508 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001509 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001513 struct filedescr *fdp;
1514 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001515 FILE *fp = NULL;
1516
1517 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001518 if (path == Py_None)
1519 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001520 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1521 if (fdp == NULL)
1522 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001523 if (fp != NULL) {
1524 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1525 if (fob == NULL) {
1526 fclose(fp);
1527 return NULL;
1528 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001529 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001530 else {
1531 fob = Py_None;
1532 Py_INCREF(fob);
1533 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001535 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001537 return ret;
1538}
1539
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001541imp_find_module(self, args)
1542 PyObject *self;
1543 PyObject *args;
1544{
1545 char *name;
1546 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001547 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001548 return NULL;
1549 return call_find_module(name, path);
1550}
1551
1552static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001553imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 PyObject *self;
1555 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001556{
1557 char *name;
1558 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559 PyObject *m;
1560 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001561 return NULL;
1562 ret = init_builtin(name);
1563 if (ret < 0)
1564 return NULL;
1565 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 Py_INCREF(Py_None);
1567 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001569 m = PyImport_AddModule(name);
1570 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001571 return m;
1572}
1573
Guido van Rossum79f25d91997-04-29 20:08:16 +00001574static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001575imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 PyObject *self;
1577 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001578{
1579 char *name;
1580 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 PyObject *m;
1582 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001583 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001585 if (ret < 0)
1586 return NULL;
1587 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 Py_INCREF(Py_None);
1589 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001590 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 m = PyImport_AddModule(name);
1592 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001593 return m;
1594}
1595
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001597imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 PyObject *self;
1599 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001600{
1601 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001602
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001604 return NULL;
1605 return get_frozen_object(name);
1606}
1607
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 PyObject *self;
1611 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001613 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001614 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001615 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001616 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617}
1618
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001620imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 PyObject *self;
1622 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001623{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001625 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001626 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001627 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628}
1629
1630static FILE *
1631get_file(pathname, fob, mode)
1632 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001634 char *mode;
1635{
1636 FILE *fp;
1637 if (fob == NULL) {
1638 fp = fopen(pathname, mode);
1639 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001640 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001641 }
1642 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001643 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001644 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 PyErr_SetString(PyExc_ValueError,
1646 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001647 }
1648 return fp;
1649}
1650
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001652imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 PyObject *self;
1654 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001655{
1656 char *name;
1657 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 PyObject *fob = NULL;
1659 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001660 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001661 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 return NULL;
1664 fp = get_file(pathname, fob, "rb");
1665 if (fp == NULL)
1666 return NULL;
1667 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001668 if (fob == NULL)
1669 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 return m;
1671}
1672
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001674imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001675 PyObject *self;
1676 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001677{
1678 char *name;
1679 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680 PyObject *fob = NULL;
1681 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001682 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001683 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1684 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001685 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001686 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001687 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001688 if (fp == NULL)
1689 return NULL;
1690 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001692 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001693}
1694
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001696imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 PyObject *self;
1698 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001699{
1700 char *name;
1701 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702 PyObject *fob = NULL;
1703 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001704 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001705 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001707 return NULL;
1708 fp = get_file(pathname, fob, "r");
1709 if (fp == NULL)
1710 return NULL;
1711 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001712 if (fob == NULL)
1713 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001714 return m;
1715}
1716
Jack Jansen9c96a921995-02-15 22:57:06 +00001717#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001719imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720 PyObject *self;
1721 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001722{
1723 char *name;
1724 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001725 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001726
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001728 return NULL;
1729 m = PyMac_LoadResourceModule(name, pathname);
1730 return m;
1731}
1732#endif /* macintosh */
1733
Guido van Rossum79f25d91997-04-29 20:08:16 +00001734static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001735imp_load_module(self, args)
1736 PyObject *self;
1737 PyObject *args;
1738{
1739 char *name;
1740 PyObject *fob;
1741 char *pathname;
1742 char *suffix; /* Unused */
1743 char *mode;
1744 int type;
1745 FILE *fp;
1746
1747 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1748 &name, &fob, &pathname,
1749 &suffix, &mode, &type))
1750 return NULL;
1751 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1752 PyErr_Format(PyExc_ValueError,
1753 "invalid file open mode %.200s", mode);
1754 return NULL;
1755 }
1756 if (fob == Py_None)
1757 fp = NULL;
1758 else {
1759 if (!PyFile_Check(fob)) {
1760 PyErr_SetString(PyExc_ValueError,
1761 "load_module arg#2 should be a file or None");
1762 return NULL;
1763 }
1764 fp = get_file(pathname, fob, mode);
1765 if (fp == NULL)
1766 return NULL;
1767 }
1768 return load_module(name, fp, pathname, type);
1769}
1770
1771static PyObject *
1772imp_load_package(self, args)
1773 PyObject *self;
1774 PyObject *args;
1775{
1776 char *name;
1777 char *pathname;
1778 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1779 return NULL;
1780 return load_package(name, pathname);
1781}
1782
1783static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001784imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 PyObject *self;
1786 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001787{
1788 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001790 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792}
1793
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001794/* Doc strings */
1795
1796static char doc_imp[] = "\
1797This module provides the components needed to build your own\n\
1798__import__ function. Undocumented functions are obsolete.\n\
1799";
1800
1801static char doc_find_module[] = "\
1802find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
1803Search for a module. If path is omitted or None, search for a\n\
1804built-in, frozen or special module and continue search in sys.path.\n\
1805The module name cannot contain '.'; to search for a submodule of a\n\
1806package, pass the submodule name and the package's __path__.\
1807";
1808
1809static char doc_load_module[] = "\
1810load_module(name, file, filename, (suffix, mode, type)) -> module\n\
1811Load a module, given information returned by find_module().\n\
1812The module name must include the full package name, if any.\
1813";
1814
1815static char doc_get_magic[] = "\
1816get_magic() -> string\n\
1817Return the magic number for .pyc or .pyo files.\
1818";
1819
1820static char doc_get_suffixes[] = "\
1821get_suffixes() -> [(suffix, mode, type), ...]\n\
1822Return a list of (suffix, mode, type) tuples describing the files\n\
1823that find_module() looks for.\
1824";
1825
1826static char doc_new_module[] = "\
1827new_module(name) -> module\n\
1828Create a new module. Do not enter it in sys.modules.\n\
1829The module name must include the full package name, if any.\
1830";
1831
Guido van Rossum79f25d91997-04-29 20:08:16 +00001832static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001833 {"find_module", imp_find_module, 1, doc_find_module},
1834 {"get_magic", imp_get_magic, 1, doc_get_magic},
1835 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
1836 {"load_module", imp_load_module, 1, doc_load_module},
1837 {"new_module", imp_new_module, 1, doc_new_module},
1838 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001839 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001840 {"init_builtin", imp_init_builtin, 1},
1841 {"init_frozen", imp_init_frozen, 1},
1842 {"is_builtin", imp_is_builtin, 1},
1843 {"is_frozen", imp_is_frozen, 1},
1844 {"load_compiled", imp_load_compiled, 1},
1845 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001846 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001847#ifdef macintosh
1848 {"load_resource", imp_load_resource, 1},
1849#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001850 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001851 {NULL, NULL} /* sentinel */
1852};
1853
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001854int
1855setint(d, name, value)
1856 PyObject *d;
1857 char *name;
1858 int value;
1859{
1860 PyObject *v;
1861 int err;
1862
1863 v = PyInt_FromLong((long)value);
1864 err = PyDict_SetItemString(d, name, v);
1865 Py_XDECREF(v);
1866 return err;
1867}
1868
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869void
1870initimp()
1871{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001872 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001873
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001874 m = Py_InitModule4("imp", imp_methods, doc_imp,
1875 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001876 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001878 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1879 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1880 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1881 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1882 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1883 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1884 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1885 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001887 failure:
1888 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889}