blob: 3bf205f25e9342f18b57b1deda262443dfce0e20 [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 **));
549
550/* Load a package and return its module object WITH INCREMENTED
551 REFERENCE COUNT */
552
553static PyObject *
554load_package(name, pathname)
555 char *name;
556 char *pathname;
557{
558 PyObject *m, *d, *file, *path;
559 int err;
560 char buf[MAXPATHLEN+1];
561 FILE *fp = NULL;
562 struct filedescr *fdp;
563
564 m = PyImport_AddModule(name);
565 if (m == NULL)
566 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000567 if (Py_VerboseFlag)
568 fprintf(stderr, "import %s # directory %s\n",
569 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000570 d = PyModule_GetDict(m);
571 file = PyString_FromString(pathname);
572 if (file == NULL)
573 return NULL;
574 path = Py_BuildValue("[O]", file);
575 if (path == NULL) {
576 Py_DECREF(file);
577 return NULL;
578 }
579 err = PyDict_SetItemString(d, "__file__", file);
580 if (err == 0)
581 err = PyDict_SetItemString(d, "__path__", path);
582 if (err != 0) {
583 m = NULL;
584 goto cleanup;
585 }
586 buf[0] = '\0';
587 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
588 if (fdp == NULL) {
589 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
590 PyErr_Clear();
591 }
592 else
593 m = NULL;
594 goto cleanup;
595 }
596 m = load_module(name, fp, buf, fdp->type);
597 if (fp != NULL)
598 fclose(fp);
599 cleanup:
600 Py_XINCREF(m);
601 Py_XDECREF(path);
602 Py_XDECREF(file);
603 return m;
604}
605
606
607/* Helper to test for built-in module */
608
609static int
610is_builtin(name)
611 char *name;
612{
613 int i;
614 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
615 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
616 if (_PyImport_Inittab[i].initfunc == NULL)
617 return -1;
618 else
619 return 1;
620 }
621 }
622 return 0;
623}
624
625/* Helper to test for frozen module */
626
627static int
628is_frozen(name)
629 char *name;
630{
631 struct _frozen *p;
632 for (p = PyImport_FrozenModules; ; p++) {
633 if (p->name == NULL)
634 break;
635 if (strcmp(p->name, name) == 0)
636 return 1;
637 }
638 return 0;
639}
640
641
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642/* Search the path (default sys.path) for a module. Return the
643 corresponding filedescr struct, and (via return arguments) the
644 pathname and an open file. Return NULL if the module is not found. */
645
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000646#ifdef MS_COREDLL
647extern FILE *PyWin_FindRegisteredModule();
648#endif
649
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650static struct filedescr *
651find_module(name, path, buf, buflen, p_fp)
652 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 /* Output parameters: */
655 char *buf;
656 int buflen;
657 FILE **p_fp;
658{
659 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000660 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000661 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000662 struct stat statbuf;
663
664 if (path == NULL) {
665 if (is_builtin(name)) {
666 static struct filedescr fd = {"", "", C_BUILTIN};
667 return &fd;
668 }
669 if (is_frozen(name)) {
670 static struct filedescr fd = {"", "", PY_FROZEN};
671 return &fd;
672 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673
Guido van Rossumac279101996-08-22 23:10:58 +0000674#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000675 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
676 if (fp != NULL) {
677 *p_fp = fp;
678 return fdp;
679 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000680#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000681 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000682
683
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 path = PySys_GetObject("path");
686 if (path == NULL || !PyList_Check(path)) {
687 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000688 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 return NULL;
690 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 namelen = strlen(name);
693 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 PyObject *v = PyList_GetItem(path, i);
695 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000698 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000701 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000702 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000703#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000704#ifdef INTERN_STRINGS
705 /*
706 ** Speedup: each sys.path item is interned, and
707 ** FindResourceModule remembers which items refer to
708 ** folders (so we don't have to bother trying to look
709 ** into them for resources).
710 */
711 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
712 v = PyList_GET_ITEM(path, i);
713#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000714 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 static struct filedescr resfiledescr =
716 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000717
718 return &resfiledescr;
719 }
720#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000721 if (len > 0 && buf[len-1] != SEP
722#ifdef ALTSEP
723 && buf[len-1] != ALTSEP
724#endif
725 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 buf[len++] = SEP;
Guido van Rossum741689d1997-08-12 14:53:39 +0000727#ifdef macintosh
728 fdp = PyMac_FindModuleExtension(buf, &len, name);
729 if ( fdp )
730 fp = fopen(buf, fdp->mode);
731#else
Guido van Rossum40f470f1996-05-23 22:51:04 +0000732#ifdef IMPORT_8x3_NAMES
733 /* see if we are searching in directory dos_8x3 */
734 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
735 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000737 for (j = 0; (ch = name[j]) && j < 8; j++)
738 if (isupper(ch))
739 buf[len++] = tolower(ch);
740 else
741 buf[len++] = ch;
742 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000743 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000744#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000745 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000746 strcpy(buf+len, name);
747 len += namelen;
748 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000749#ifdef HAVE_STAT
750 if (stat(buf, &statbuf) == 0) {
751 static struct filedescr fd = {"", "", PKG_DIRECTORY};
752 if (S_ISDIR(statbuf.st_mode))
753 return &fd;
754 }
755#else
756 /* XXX How are you going to test for directories? */
757#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 fprintf(stderr, "# trying %s\n", buf);
762 fp = fopen(buf, fdp->mode);
763 if (fp != NULL)
764 break;
765 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000766#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767 if (fp != NULL)
768 break;
769 }
770 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000771 PyErr_Format(PyExc_ImportError,
772 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 return NULL;
774 }
775
776 *p_fp = fp;
777 return fdp;
778}
779
780
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000781static int init_builtin Py_PROTO((char *)); /* Forward */
782
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000784 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000787load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000789 FILE *fp;
790 char *buf;
791 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000792{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000793 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000795 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000797 /* First check that there's an open file (if we need one) */
798 switch (type) {
799 case PY_SOURCE:
800 case PY_COMPILED:
801 if (fp == NULL) {
802 PyErr_Format(PyExc_ValueError,
803 "file object required for import (type code %d)",
804 type);
805 return NULL;
806 }
807 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000809 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810
811 case PY_SOURCE:
812 m = load_source_module(name, buf, fp);
813 break;
814
815 case PY_COMPILED:
816 m = load_compiled_module(name, buf, fp);
817 break;
818
819 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821 break;
822
Jack Jansen9c96a921995-02-15 22:57:06 +0000823#ifdef macintosh
824 case PY_RESOURCE:
825 m = PyMac_LoadResourceModule(name, buf);
826 break;
827#endif
828
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000829 case PKG_DIRECTORY:
830 m = load_package(name, buf);
831 break;
832
833 case C_BUILTIN:
834 case PY_FROZEN:
835 if (type == C_BUILTIN)
836 err = init_builtin(name);
837 else
838 err = PyImport_ImportFrozenModule(name);
839 if (err < 0)
840 goto failure;
841 if (err == 0) {
842 PyErr_Format(PyExc_ImportError,
843 "Purported %s module %.200s not found",
844 type == C_BUILTIN ?
845 "builtin" : "frozen",
846 name);
847 goto failure;
848 }
849 modules = PyImport_GetModuleDict();
850 m = PyDict_GetItemString(modules, name);
851 if (m == NULL) {
852 PyErr_Format(
853 PyExc_ImportError,
854 "%s module %.200s not properly initialized",
855 type == C_BUILTIN ?
856 "builtin" : "frozen",
857 name);
858 goto failure;
859 }
860 Py_INCREF(m);
861 break;
862
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000864 failure:
865 PyErr_Format(PyExc_ImportError,
866 "Don't know how to import %.200s (type code %d)",
867 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000868 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869
870 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871
872 return m;
873}
874
875
876/* Initialize a built-in module.
877 Return 1 for succes, 0 if the module is not found, and -1 with
878 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000879
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000880static int
881init_builtin(name)
882 char *name;
883{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000884 struct _inittab *p;
885 PyObject *mod;
886
887 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
888 return 1;
889
890 for (p = _PyImport_Inittab; p->name != NULL; p++) {
891 if (strcmp(name, p->name) == 0) {
892 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000893 PyErr_Format(PyExc_ImportError,
894 "Cannot re-init internal module %.200s",
895 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000896 return -1;
897 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000899 fprintf(stderr, "import %s # builtin\n", name);
900 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000903 if (_PyImport_FixupExtension(name, name) == NULL)
904 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000905 return 1;
906 }
907 }
908 return 0;
909}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000910
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000912/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000914static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000915find_frozen(name)
916 char *name;
917{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000918 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000919
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000921 if (p->name == NULL)
922 return NULL;
923 if (strcmp(p->name, name) == 0)
924 break;
925 }
926 return p;
927}
928
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000930get_frozen_object(name)
931 char *name;
932{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000933 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000934
935 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000936 PyErr_Format(PyExc_ImportError,
937 "No such frozen object named %.200s",
938 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000939 return NULL;
940 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000942}
943
944/* Initialize a frozen module.
945 Return 1 for succes, 0 if the module is not found, and -1 with
946 an exception set if the initialization failed.
947 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000948
949int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000951 char *name;
952{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000953 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 PyObject *co;
955 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000956
957 if (p == NULL)
958 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000960 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000962 if (co == NULL)
963 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 if (!PyCode_Check(co)) {
965 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000966 PyErr_Format(PyExc_TypeError,
967 "frozen object %.200s is not a code object",
968 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000969 return -1;
970 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 m = PyImport_ExecCodeModule(name, co);
972 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000973 if (m == NULL)
974 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000976 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000977}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000978
979
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000980/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000981 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000982
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983PyObject *
984PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000986{
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000987 static PyObject *fromlist = NULL;
988 if (fromlist == NULL && strchr(name, '.') != NULL) {
989 fromlist = Py_BuildValue("[s]", "*");
990 if (fromlist == NULL)
991 return NULL;
992 }
993 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000994}
995
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000996/* Forward declarations for helper routines */
997static PyObject *get_parent Py_PROTO((PyObject *globals,
998 char *buf, int *p_buflen));
999static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1000 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001001static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001002static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001003 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001004static PyObject * import_submodule Py_PROTO((PyObject *mod,
1005 char *name, char *fullname));
1006
1007/* The Magnum Opus of dotted-name import :-) */
1008
1009/* XXX TO DO:
1010 - Remember misses in package directories so package submodules
1011 that all import the same toplevel module don't keep hitting on the
1012 package directory first
1013*/
1014
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001015PyObject *
1016PyImport_ImportModuleEx(name, globals, locals, fromlist)
1017 char *name;
1018 PyObject *globals;
1019 PyObject *locals;
1020 PyObject *fromlist;
1021{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001022 char buf[MAXPATHLEN+1];
1023 int buflen = 0;
1024 PyObject *parent, *head, *next, *tail;
1025
1026 parent = get_parent(globals, buf, &buflen);
1027 if (parent == NULL)
1028 return NULL;
1029
1030 head = load_next(parent, Py_None, &name, buf, &buflen);
1031 if (head == NULL)
1032 return NULL;
1033
1034 tail = head;
1035 Py_INCREF(tail);
1036 while (name) {
1037 next = load_next(tail, tail, &name, buf, &buflen);
1038 Py_DECREF(tail);
1039 if (next == NULL) {
1040 Py_DECREF(head);
1041 return NULL;
1042 }
1043 tail = next;
1044 }
1045
1046 if (fromlist != NULL) {
1047 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1048 fromlist = NULL;
1049 }
1050
1051 if (fromlist == NULL) {
1052 Py_DECREF(tail);
1053 return head;
1054 }
1055
1056 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001057 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001058 Py_DECREF(tail);
1059 return NULL;
1060 }
1061
1062 return tail;
1063}
1064
1065static PyObject *
1066get_parent(globals, buf, p_buflen)
1067 PyObject *globals;
1068 char *buf;
1069 int *p_buflen;
1070{
1071 static PyObject *namestr = NULL;
1072 static PyObject *pathstr = NULL;
1073 PyObject *modname, *modpath, *modules, *parent;
1074
1075 if (globals == NULL || !PyDict_Check(globals))
1076 return Py_None;
1077
1078 if (namestr == NULL) {
1079 namestr = PyString_InternFromString("__name__");
1080 if (namestr == NULL)
1081 return NULL;
1082 }
1083 if (pathstr == NULL) {
1084 pathstr = PyString_InternFromString("__path__");
1085 if (pathstr == NULL)
1086 return NULL;
1087 }
1088
1089 *buf = '\0';
1090 *p_buflen = 0;
1091 modname = PyDict_GetItem(globals, namestr);
1092 if (modname == NULL || !PyString_Check(modname))
1093 return Py_None;
1094
1095 modpath = PyDict_GetItem(globals, pathstr);
1096 if (modpath != NULL) {
1097 int len = PyString_GET_SIZE(modname);
1098 if (len > MAXPATHLEN) {
1099 PyErr_SetString(PyExc_ValueError,
1100 "Module name too long");
1101 return NULL;
1102 }
1103 strcpy(buf, PyString_AS_STRING(modname));
1104 *p_buflen = len;
1105 }
1106 else {
1107 char *start = PyString_AS_STRING(modname);
1108 char *lastdot = strrchr(start, '.');
1109 int len;
1110 if (lastdot == NULL)
1111 return Py_None;
1112 len = lastdot - start;
1113 if (len >= MAXPATHLEN) {
1114 PyErr_SetString(PyExc_ValueError,
1115 "Module name too long");
1116 return NULL;
1117 }
1118 strncpy(buf, start, len);
1119 buf[len] = '\0';
1120 *p_buflen = len;
1121 }
1122
1123 modules = PyImport_GetModuleDict();
1124 parent = PyDict_GetItemString(modules, buf);
1125 if (parent == NULL)
1126 parent = Py_None;
1127 return parent;
1128 /* We expect, but can't guarantee, if parent != None, that:
1129 - parent.__name__ == buf
1130 - parent.__dict__ is globals
1131 If this is violated... Who cares? */
1132}
1133
1134static PyObject *
1135load_next(mod, altmod, p_name, buf, p_buflen)
1136 PyObject *mod;
1137 PyObject *altmod; /* Either None or same as mod */
1138 char **p_name;
1139 char *buf;
1140 int *p_buflen;
1141{
1142 char *name = *p_name;
1143 char *dot = strchr(name, '.');
1144 int len;
1145 char *p;
1146 PyObject *result;
1147
1148 if (dot == NULL) {
1149 *p_name = NULL;
1150 len = strlen(name);
1151 }
1152 else {
1153 *p_name = dot+1;
1154 len = dot-name;
1155 }
1156
1157 p = buf + *p_buflen;
1158 if (p != buf)
1159 *p++ = '.';
1160 if (p+len-buf >= MAXPATHLEN) {
1161 PyErr_SetString(PyExc_ValueError,
1162 "Module name too long");
1163 return NULL;
1164 }
1165 strncpy(p, name, len);
1166 p[len] = '\0';
1167 *p_buflen = p+len-buf;
1168
1169 result = import_submodule(mod, p, buf);
1170 if (result == Py_None && altmod != mod) {
1171 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001172 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001173 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001174 if (result != NULL && result != Py_None) {
1175 if (mark_miss(buf) != 0) {
1176 Py_DECREF(result);
1177 return NULL;
1178 }
1179 strncpy(buf, name, len);
1180 buf[len] = '\0';
1181 *p_buflen = len;
1182 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001183 }
1184 if (result == NULL)
1185 return NULL;
1186
1187 if (result == Py_None) {
1188 Py_DECREF(result);
1189 PyErr_Format(PyExc_ImportError,
1190 "No module named %.200s", name);
1191 return NULL;
1192 }
1193
1194 return result;
1195}
1196
1197static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001198mark_miss(name)
1199 char *name;
1200{
1201 PyObject *modules = PyImport_GetModuleDict();
1202 return PyDict_SetItemString(modules, name, Py_None);
1203}
1204
1205static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001206ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001207 PyObject *mod;
1208 PyObject *fromlist;
1209 char *buf;
1210 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001211 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001212{
1213 int i;
1214
1215 if (!PyObject_HasAttrString(mod, "__path__"))
1216 return 1;
1217
1218 for (i = 0; ; i++) {
1219 PyObject *item = PySequence_GetItem(fromlist, i);
1220 int hasit;
1221 if (item == NULL) {
1222 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1223 PyErr_Clear();
1224 return 1;
1225 }
1226 return 0;
1227 }
1228 if (!PyString_Check(item)) {
1229 PyErr_SetString(PyExc_TypeError,
1230 "Item in ``from list'' not a string");
1231 Py_DECREF(item);
1232 return 0;
1233 }
1234 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001235 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001236 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001237 /* See if the package defines __all__ */
1238 if (recursive)
1239 continue; /* Avoid endless recursion */
1240 all = PyObject_GetAttrString(mod, "__all__");
1241 if (all == NULL)
1242 PyErr_Clear();
1243 else {
1244 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1245 return 0;
1246 Py_DECREF(all);
1247 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001248 continue;
1249 }
1250 hasit = PyObject_HasAttr(mod, item);
1251 if (!hasit) {
1252 char *subname = PyString_AS_STRING(item);
1253 PyObject *submod;
1254 char *p;
1255 if (buflen + strlen(subname) >= MAXPATHLEN) {
1256 PyErr_SetString(PyExc_ValueError,
1257 "Module name too long");
1258 Py_DECREF(item);
1259 return 0;
1260 }
1261 p = buf + buflen;
1262 *p++ = '.';
1263 strcpy(p, subname);
1264 submod = import_submodule(mod, subname, buf);
1265 Py_XDECREF(submod);
1266 if (submod == NULL) {
1267 Py_DECREF(item);
1268 return 0;
1269 }
1270 }
1271 Py_DECREF(item);
1272 }
1273
1274 return 1;
1275}
1276
1277static PyObject *
1278import_submodule(mod, subname, fullname)
1279 PyObject *mod; /* May be None */
1280 char *subname;
1281 char *fullname;
1282{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001283 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001285
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001286 /* Require:
1287 if mod == None: subname == fullname
1288 else: mod.__name__ + "." + subname == fullname
1289 */
1290
1291 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001293 }
1294 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001295 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001296 char buf[MAXPATHLEN+1];
1297 struct filedescr *fdp;
1298 FILE *fp = NULL;
1299
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001300 path = PyObject_GetAttrString(mod, "__path__");
1301 if (path == NULL)
1302 PyErr_Clear();
1303
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001304 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001305 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001306 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001307 if (fdp == NULL) {
1308 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1309 return NULL;
1310 PyErr_Clear();
1311 Py_INCREF(Py_None);
1312 return Py_None;
1313 }
1314 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001315 if (fp)
1316 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001317 if (m != NULL && mod != Py_None) {
1318 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1319 Py_DECREF(m);
1320 m = NULL;
1321 }
1322 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001323 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001324
1325 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001326}
1327
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328
1329/* Re-import a module of any kind and return its module object, WITH
1330 INCREMENTED REFERENCE COUNT */
1331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332PyObject *
1333PyImport_ReloadModule(m)
1334 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001336 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001337 PyObject *path = NULL;
1338 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 char buf[MAXPATHLEN+1];
1340 struct filedescr *fdp;
1341 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001342
Guido van Rossum79f25d91997-04-29 20:08:16 +00001343 if (m == NULL || !PyModule_Check(m)) {
1344 PyErr_SetString(PyExc_TypeError,
1345 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346 return NULL;
1347 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349 if (name == NULL)
1350 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001351 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001352 PyErr_Format(PyExc_ImportError,
1353 "reload(): module %.200s not in sys.modules",
1354 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001355 return NULL;
1356 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001357 subname = strrchr(name, '.');
1358 if (subname == NULL)
1359 subname = name;
1360 else {
1361 PyObject *parentname, *parent;
1362 parentname = PyString_FromStringAndSize(name, (subname-name));
1363 if (parentname == NULL)
1364 return NULL;
1365 parent = PyDict_GetItem(modules, parentname);
1366 if (parent == NULL) {
1367 PyErr_Format(PyExc_ImportError,
1368 "reload(): parent %.200s not in sys.modules",
1369 name);
1370 return NULL;
1371 }
1372 subname++;
1373 path = PyObject_GetAttrString(parent, "__path__");
1374 if (path == NULL)
1375 PyErr_Clear();
1376 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001377 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001378 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1379 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001380 if (fdp == NULL)
1381 return NULL;
1382 m = load_module(name, fp, buf, fdp->type);
1383 if (fp)
1384 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 return m;
1386}
1387
1388
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001389/* Higher-level import emulator which emulates the "import" statement
1390 more accurately -- it invokes the __import__() function from the
1391 builtins of the current globals. This means that the import is
1392 done using whatever import hooks are installed in the current
1393 environment, e.g. by "ni" or "rexec". */
1394
1395PyObject *
1396PyImport_Import(module_name)
1397 PyObject *module_name;
1398{
1399 static PyObject *silly_list = NULL;
1400 static PyObject *builtins_str = NULL;
1401 static PyObject *import_str = NULL;
1402 static PyObject *standard_builtins = NULL;
1403 PyObject *globals = NULL;
1404 PyObject *import = NULL;
1405 PyObject *builtins = NULL;
1406 PyObject *r = NULL;
1407
1408 /* Initialize constant string objects */
1409 if (silly_list == NULL) {
1410 import_str = PyString_InternFromString("__import__");
1411 if (import_str == NULL)
1412 return NULL;
1413 builtins_str = PyString_InternFromString("__builtins__");
1414 if (builtins_str == NULL)
1415 return NULL;
1416 silly_list = Py_BuildValue("[s]", "__doc__");
1417 if (silly_list == NULL)
1418 return NULL;
1419 }
1420
1421 /* Get the builtins from current globals */
1422 globals = PyEval_GetGlobals();
1423 if(globals != NULL) {
1424 builtins = PyObject_GetItem(globals, builtins_str);
1425 if (builtins == NULL)
1426 goto err;
1427 }
1428 else {
1429 /* No globals -- use standard builtins, and fake globals */
1430 PyErr_Clear();
1431
1432 if (standard_builtins == NULL) {
1433 standard_builtins =
1434 PyImport_ImportModule("__builtin__");
1435 if (standard_builtins == NULL)
1436 return NULL;
1437 }
1438
1439 builtins = standard_builtins;
1440 Py_INCREF(builtins);
1441 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1442 if (globals == NULL)
1443 goto err;
1444 }
1445
1446 /* Get the __import__ function from the builtins */
1447 if (PyDict_Check(builtins))
1448 import=PyObject_GetItem(builtins, import_str);
1449 else
1450 import=PyObject_GetAttr(builtins, import_str);
1451 if (import == NULL)
1452 goto err;
1453
1454 /* Call the _import__ function with the proper argument list */
1455 r = PyObject_CallFunction(import, "OOOO",
1456 module_name, globals, globals, silly_list);
1457
1458 err:
1459 Py_XDECREF(globals);
1460 Py_XDECREF(builtins);
1461 Py_XDECREF(import);
1462
1463 return r;
1464}
1465
1466
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467/* Module 'imp' provides Python access to the primitives used for
1468 importing modules.
1469*/
1470
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 PyObject *self;
1474 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475{
1476 char buf[4];
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001479 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001480 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1481 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1482 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1483 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001486}
1487
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001489imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 PyObject *self;
1491 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001494 struct filedescr *fdp;
1495
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001497 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499 if (list == NULL)
1500 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1502 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503 fdp->suffix, fdp->mode, fdp->type);
1504 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506 return NULL;
1507 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 if (PyList_Append(list, item) < 0) {
1509 Py_DECREF(list);
1510 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001511 return NULL;
1512 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001514 }
1515 return list;
1516}
1517
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001519call_find_module(name, path)
1520 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001521 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001525 struct filedescr *fdp;
1526 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001527 FILE *fp = NULL;
1528
1529 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001530 if (path == Py_None)
1531 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001532 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1533 if (fdp == NULL)
1534 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001535 if (fp != NULL) {
1536 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1537 if (fob == NULL) {
1538 fclose(fp);
1539 return NULL;
1540 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001541 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001542 else {
1543 fob = Py_None;
1544 Py_INCREF(fob);
1545 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001547 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001549 return ret;
1550}
1551
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001553imp_find_module(self, args)
1554 PyObject *self;
1555 PyObject *args;
1556{
1557 char *name;
1558 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001559 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001560 return NULL;
1561 return call_find_module(name, path);
1562}
1563
1564static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001565imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 PyObject *self;
1567 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568{
1569 char *name;
1570 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 PyObject *m;
1572 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001573 return NULL;
1574 ret = init_builtin(name);
1575 if (ret < 0)
1576 return NULL;
1577 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001578 Py_INCREF(Py_None);
1579 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001580 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 m = PyImport_AddModule(name);
1582 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001583 return m;
1584}
1585
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001587imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 PyObject *self;
1589 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001590{
1591 char *name;
1592 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 PyObject *m;
1594 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001595 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001597 if (ret < 0)
1598 return NULL;
1599 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 Py_INCREF(Py_None);
1601 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 m = PyImport_AddModule(name);
1604 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001605 return m;
1606}
1607
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001609imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 PyObject *self;
1611 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001612{
1613 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001614
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001616 return NULL;
1617 return get_frozen_object(name);
1618}
1619
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001621imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 PyObject *self;
1623 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001625 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001628 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001629}
1630
Guido van Rossum79f25d91997-04-29 20:08:16 +00001631static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001632imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 PyObject *self;
1634 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001635{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001636 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001639 return PyInt_FromLong(is_frozen(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640}
1641
1642static FILE *
1643get_file(pathname, fob, mode)
1644 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646 char *mode;
1647{
1648 FILE *fp;
1649 if (fob == NULL) {
1650 fp = fopen(pathname, mode);
1651 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001653 }
1654 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 PyErr_SetString(PyExc_ValueError,
1658 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001659 }
1660 return fp;
1661}
1662
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001664imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 PyObject *self;
1666 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001667{
1668 char *name;
1669 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670 PyObject *fob = NULL;
1671 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001672 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001673 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 return NULL;
1676 fp = get_file(pathname, fob, "rb");
1677 if (fp == NULL)
1678 return NULL;
1679 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001680 if (fob == NULL)
1681 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001682 return m;
1683}
1684
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001686imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 PyObject *self;
1688 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689{
1690 char *name;
1691 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 PyObject *fob = NULL;
1693 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001694 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1696 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001697 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001698 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001699 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001700 if (fp == NULL)
1701 return NULL;
1702 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001704 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001705}
1706
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001708imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709 PyObject *self;
1710 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001711{
1712 char *name;
1713 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 PyObject *fob = NULL;
1715 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001716 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001717 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001719 return NULL;
1720 fp = get_file(pathname, fob, "r");
1721 if (fp == NULL)
1722 return NULL;
1723 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 if (fob == NULL)
1725 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 return m;
1727}
1728
Jack Jansen9c96a921995-02-15 22:57:06 +00001729#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001731imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001732 PyObject *self;
1733 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001734{
1735 char *name;
1736 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001737 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001738
Guido van Rossum79f25d91997-04-29 20:08:16 +00001739 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001740 return NULL;
1741 m = PyMac_LoadResourceModule(name, pathname);
1742 return m;
1743}
1744#endif /* macintosh */
1745
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001747imp_load_module(self, args)
1748 PyObject *self;
1749 PyObject *args;
1750{
1751 char *name;
1752 PyObject *fob;
1753 char *pathname;
1754 char *suffix; /* Unused */
1755 char *mode;
1756 int type;
1757 FILE *fp;
1758
1759 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1760 &name, &fob, &pathname,
1761 &suffix, &mode, &type))
1762 return NULL;
1763 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1764 PyErr_Format(PyExc_ValueError,
1765 "invalid file open mode %.200s", mode);
1766 return NULL;
1767 }
1768 if (fob == Py_None)
1769 fp = NULL;
1770 else {
1771 if (!PyFile_Check(fob)) {
1772 PyErr_SetString(PyExc_ValueError,
1773 "load_module arg#2 should be a file or None");
1774 return NULL;
1775 }
1776 fp = get_file(pathname, fob, mode);
1777 if (fp == NULL)
1778 return NULL;
1779 }
1780 return load_module(name, fp, pathname, type);
1781}
1782
1783static PyObject *
1784imp_load_package(self, args)
1785 PyObject *self;
1786 PyObject *args;
1787{
1788 char *name;
1789 char *pathname;
1790 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1791 return NULL;
1792 return load_package(name, pathname);
1793}
1794
1795static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 PyObject *self;
1798 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001799{
1800 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001804}
1805
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001806static PyObject *
1807imp_find_module_in_package(self, args)
1808 PyObject *self;
1809 PyObject *args;
1810{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001811 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001812 PyObject *packagename = NULL;
1813 PyObject *package;
1814 PyObject *modules;
1815 PyObject *path;
1816
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001817 if (!PyArg_ParseTuple(args, "s|S", &name, &packagename))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001818 return NULL;
1819 if (packagename == NULL || PyString_GET_SIZE(packagename) == 0) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001820 return call_find_module(name, (PyObject *)NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001821 }
1822 modules = PyImport_GetModuleDict();
1823 package = PyDict_GetItem(modules, packagename);
1824 if (package == NULL) {
1825 PyErr_Format(PyExc_ImportError,
1826 "No package named %.200s",
1827 PyString_AS_STRING(packagename));
1828 return NULL;
1829 }
1830 path = PyObject_GetAttrString(package, "__path__");
1831 if (path == NULL) {
1832 PyErr_Format(PyExc_ImportError,
1833 "Package %.200s has no __path__ attribute",
1834 PyString_AS_STRING(packagename));
1835 return NULL;
1836 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001837 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001838}
1839
1840static PyObject *
1841imp_find_module_in_directory(self, args)
1842 PyObject *self;
1843 PyObject *args;
1844{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001845 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001846 PyObject *directory;
1847 PyObject *path;
1848
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001849 if (!PyArg_ParseTuple(args, "sS", &name, &directory))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001850 return NULL;
1851 path = Py_BuildValue("[O]", directory);
1852 if (path == NULL)
1853 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001854 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001855}
1856
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857static PyMethodDef imp_methods[] = {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001858 {"find_module", imp_find_module, 1},
1859 {"find_module_in_directory", imp_find_module_in_directory, 1},
1860 {"find_module_in_package", imp_find_module_in_package, 1},
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001861 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001862 {"get_magic", imp_get_magic, 1},
1863 {"get_suffixes", imp_get_suffixes, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 {"init_builtin", imp_init_builtin, 1},
1865 {"init_frozen", imp_init_frozen, 1},
1866 {"is_builtin", imp_is_builtin, 1},
1867 {"is_frozen", imp_is_frozen, 1},
1868 {"load_compiled", imp_load_compiled, 1},
1869 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001870 {"load_module", imp_load_module, 1},
1871 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001872#ifdef macintosh
1873 {"load_resource", imp_load_resource, 1},
1874#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001875 {"load_source", imp_load_source, 1},
1876 {"new_module", imp_new_module, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877 {NULL, NULL} /* sentinel */
1878};
1879
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001880int
1881setint(d, name, value)
1882 PyObject *d;
1883 char *name;
1884 int value;
1885{
1886 PyObject *v;
1887 int err;
1888
1889 v = PyInt_FromLong((long)value);
1890 err = PyDict_SetItemString(d, name, v);
1891 Py_XDECREF(v);
1892 return err;
1893}
1894
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001895void
1896initimp()
1897{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001898 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001899
Guido van Rossum79f25d91997-04-29 20:08:16 +00001900 m = Py_InitModule("imp", imp_methods);
1901 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001902
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001903 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1904 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1905 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1906 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1907 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1908 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1909 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1910 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001911
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001912 failure:
1913 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914}