blob: a53abaebb135022a657c98aca4ae86ff129b0d72 [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,
1003 char *buf, int buflen));
1004static 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);
1057 if (!ensure_fromlist(tail, fromlist, buf, buflen)) {
1058 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 */
1173 result = import_submodule(altmod, name, name);
1174 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 Rossum17fc85f1997-09-06 18:52:03 +00001206ensure_fromlist(mod, fromlist, buf, buflen)
1207 PyObject *mod;
1208 PyObject *fromlist;
1209 char *buf;
1210 int buflen;
1211{
1212 int i;
1213
1214 if (!PyObject_HasAttrString(mod, "__path__"))
1215 return 1;
1216
1217 for (i = 0; ; i++) {
1218 PyObject *item = PySequence_GetItem(fromlist, i);
1219 int hasit;
1220 if (item == NULL) {
1221 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1222 PyErr_Clear();
1223 return 1;
1224 }
1225 return 0;
1226 }
1227 if (!PyString_Check(item)) {
1228 PyErr_SetString(PyExc_TypeError,
1229 "Item in ``from list'' not a string");
1230 Py_DECREF(item);
1231 return 0;
1232 }
1233 if (PyString_AS_STRING(item)[0] == '*') {
1234 Py_DECREF(item);
1235 continue;
1236 }
1237 hasit = PyObject_HasAttr(mod, item);
1238 if (!hasit) {
1239 char *subname = PyString_AS_STRING(item);
1240 PyObject *submod;
1241 char *p;
1242 if (buflen + strlen(subname) >= MAXPATHLEN) {
1243 PyErr_SetString(PyExc_ValueError,
1244 "Module name too long");
1245 Py_DECREF(item);
1246 return 0;
1247 }
1248 p = buf + buflen;
1249 *p++ = '.';
1250 strcpy(p, subname);
1251 submod = import_submodule(mod, subname, buf);
1252 Py_XDECREF(submod);
1253 if (submod == NULL) {
1254 Py_DECREF(item);
1255 return 0;
1256 }
1257 }
1258 Py_DECREF(item);
1259 }
1260
1261 return 1;
1262}
1263
1264static PyObject *
1265import_submodule(mod, subname, fullname)
1266 PyObject *mod; /* May be None */
1267 char *subname;
1268 char *fullname;
1269{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001270 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001272
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001273 /* Require:
1274 if mod == None: subname == fullname
1275 else: mod.__name__ + "." + subname == fullname
1276 */
1277
1278 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001280 }
1281 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001282 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001283 char buf[MAXPATHLEN+1];
1284 struct filedescr *fdp;
1285 FILE *fp = NULL;
1286
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001287 path = PyObject_GetAttrString(mod, "__path__");
1288 if (path == NULL)
1289 PyErr_Clear();
1290
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001291 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001292 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001293 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001294 if (fdp == NULL) {
1295 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1296 return NULL;
1297 PyErr_Clear();
1298 Py_INCREF(Py_None);
1299 return Py_None;
1300 }
1301 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001302 if (fp)
1303 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001304 if (m != NULL && mod != Py_None) {
1305 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1306 Py_DECREF(m);
1307 m = NULL;
1308 }
1309 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001310 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311
1312 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001313}
1314
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315
1316/* Re-import a module of any kind and return its module object, WITH
1317 INCREMENTED REFERENCE COUNT */
1318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319PyObject *
1320PyImport_ReloadModule(m)
1321 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001323 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001324 PyObject *path = NULL;
1325 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001326 char buf[MAXPATHLEN+1];
1327 struct filedescr *fdp;
1328 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001329
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 if (m == NULL || !PyModule_Check(m)) {
1331 PyErr_SetString(PyExc_TypeError,
1332 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333 return NULL;
1334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001336 if (name == NULL)
1337 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001338 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 PyErr_Format(PyExc_ImportError,
1340 "reload(): module %.200s not in sys.modules",
1341 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001342 return NULL;
1343 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001344 subname = strrchr(name, '.');
1345 if (subname == NULL)
1346 subname = name;
1347 else {
1348 PyObject *parentname, *parent;
1349 parentname = PyString_FromStringAndSize(name, (subname-name));
1350 if (parentname == NULL)
1351 return NULL;
1352 parent = PyDict_GetItem(modules, parentname);
1353 if (parent == NULL) {
1354 PyErr_Format(PyExc_ImportError,
1355 "reload(): parent %.200s not in sys.modules",
1356 name);
1357 return NULL;
1358 }
1359 subname++;
1360 path = PyObject_GetAttrString(parent, "__path__");
1361 if (path == NULL)
1362 PyErr_Clear();
1363 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001364 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001365 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1366 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001367 if (fdp == NULL)
1368 return NULL;
1369 m = load_module(name, fp, buf, fdp->type);
1370 if (fp)
1371 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 return m;
1373}
1374
1375
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001376/* Higher-level import emulator which emulates the "import" statement
1377 more accurately -- it invokes the __import__() function from the
1378 builtins of the current globals. This means that the import is
1379 done using whatever import hooks are installed in the current
1380 environment, e.g. by "ni" or "rexec". */
1381
1382PyObject *
1383PyImport_Import(module_name)
1384 PyObject *module_name;
1385{
1386 static PyObject *silly_list = NULL;
1387 static PyObject *builtins_str = NULL;
1388 static PyObject *import_str = NULL;
1389 static PyObject *standard_builtins = NULL;
1390 PyObject *globals = NULL;
1391 PyObject *import = NULL;
1392 PyObject *builtins = NULL;
1393 PyObject *r = NULL;
1394
1395 /* Initialize constant string objects */
1396 if (silly_list == NULL) {
1397 import_str = PyString_InternFromString("__import__");
1398 if (import_str == NULL)
1399 return NULL;
1400 builtins_str = PyString_InternFromString("__builtins__");
1401 if (builtins_str == NULL)
1402 return NULL;
1403 silly_list = Py_BuildValue("[s]", "__doc__");
1404 if (silly_list == NULL)
1405 return NULL;
1406 }
1407
1408 /* Get the builtins from current globals */
1409 globals = PyEval_GetGlobals();
1410 if(globals != NULL) {
1411 builtins = PyObject_GetItem(globals, builtins_str);
1412 if (builtins == NULL)
1413 goto err;
1414 }
1415 else {
1416 /* No globals -- use standard builtins, and fake globals */
1417 PyErr_Clear();
1418
1419 if (standard_builtins == NULL) {
1420 standard_builtins =
1421 PyImport_ImportModule("__builtin__");
1422 if (standard_builtins == NULL)
1423 return NULL;
1424 }
1425
1426 builtins = standard_builtins;
1427 Py_INCREF(builtins);
1428 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1429 if (globals == NULL)
1430 goto err;
1431 }
1432
1433 /* Get the __import__ function from the builtins */
1434 if (PyDict_Check(builtins))
1435 import=PyObject_GetItem(builtins, import_str);
1436 else
1437 import=PyObject_GetAttr(builtins, import_str);
1438 if (import == NULL)
1439 goto err;
1440
1441 /* Call the _import__ function with the proper argument list */
1442 r = PyObject_CallFunction(import, "OOOO",
1443 module_name, globals, globals, silly_list);
1444
1445 err:
1446 Py_XDECREF(globals);
1447 Py_XDECREF(builtins);
1448 Py_XDECREF(import);
1449
1450 return r;
1451}
1452
1453
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001454/* Module 'imp' provides Python access to the primitives used for
1455 importing modules.
1456*/
1457
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001460 PyObject *self;
1461 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462{
1463 char buf[4];
1464
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001466 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001467 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1468 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1469 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1470 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001471
Guido van Rossum79f25d91997-04-29 20:08:16 +00001472 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473}
1474
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001476imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 PyObject *self;
1478 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001479{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001481 struct filedescr *fdp;
1482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001486 if (list == NULL)
1487 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1489 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490 fdp->suffix, fdp->mode, fdp->type);
1491 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001493 return NULL;
1494 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 if (PyList_Append(list, item) < 0) {
1496 Py_DECREF(list);
1497 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001498 return NULL;
1499 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001501 }
1502 return list;
1503}
1504
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001506call_find_module(name, path)
1507 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001508 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001510 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 struct filedescr *fdp;
1513 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001514 FILE *fp = NULL;
1515
1516 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001517 if (path == Py_None)
1518 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001519 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1520 if (fdp == NULL)
1521 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001522 if (fp != NULL) {
1523 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1524 if (fob == NULL) {
1525 fclose(fp);
1526 return NULL;
1527 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001529 else {
1530 fob = Py_None;
1531 Py_INCREF(fob);
1532 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001534 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001536 return ret;
1537}
1538
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001540imp_find_module(self, args)
1541 PyObject *self;
1542 PyObject *args;
1543{
1544 char *name;
1545 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001546 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001547 return NULL;
1548 return call_find_module(name, path);
1549}
1550
1551static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001552imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 PyObject *self;
1554 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001555{
1556 char *name;
1557 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 PyObject *m;
1559 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001560 return NULL;
1561 ret = init_builtin(name);
1562 if (ret < 0)
1563 return NULL;
1564 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 Py_INCREF(Py_None);
1566 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001567 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 m = PyImport_AddModule(name);
1569 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001570 return m;
1571}
1572
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001574imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575 PyObject *self;
1576 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577{
1578 char *name;
1579 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 PyObject *m;
1581 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001582 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001584 if (ret < 0)
1585 return NULL;
1586 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 Py_INCREF(Py_None);
1588 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001589 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 m = PyImport_AddModule(name);
1591 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001592 return m;
1593}
1594
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001596imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 PyObject *self;
1598 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001599{
1600 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001601
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001603 return NULL;
1604 return get_frozen_object(name);
1605}
1606
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001608imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *self;
1610 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001614 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001615 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001616}
1617
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620 PyObject *self;
1621 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001623 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001625 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001626 return PyInt_FromLong(is_frozen(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627}
1628
1629static FILE *
1630get_file(pathname, fob, mode)
1631 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001633 char *mode;
1634{
1635 FILE *fp;
1636 if (fob == NULL) {
1637 fp = fopen(pathname, mode);
1638 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640 }
1641 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 PyErr_SetString(PyExc_ValueError,
1645 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646 }
1647 return fp;
1648}
1649
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652 PyObject *self;
1653 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001654{
1655 char *name;
1656 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 PyObject *fob = NULL;
1658 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001659 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001660 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001662 return NULL;
1663 fp = get_file(pathname, fob, "rb");
1664 if (fp == NULL)
1665 return NULL;
1666 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001667 if (fob == NULL)
1668 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 return m;
1670}
1671
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001673imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 PyObject *self;
1675 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676{
1677 char *name;
1678 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 PyObject *fob = NULL;
1680 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001681 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1683 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001684 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001685 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001686 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001687 if (fp == NULL)
1688 return NULL;
1689 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001691 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001692}
1693
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 PyObject *self;
1697 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001698{
1699 char *name;
1700 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 PyObject *fob = NULL;
1702 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001703 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001704 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001706 return NULL;
1707 fp = get_file(pathname, fob, "r");
1708 if (fp == NULL)
1709 return NULL;
1710 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001711 if (fob == NULL)
1712 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713 return m;
1714}
1715
Jack Jansen9c96a921995-02-15 22:57:06 +00001716#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001718imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 PyObject *self;
1720 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001721{
1722 char *name;
1723 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001725
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001727 return NULL;
1728 m = PyMac_LoadResourceModule(name, pathname);
1729 return m;
1730}
1731#endif /* macintosh */
1732
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001734imp_load_module(self, args)
1735 PyObject *self;
1736 PyObject *args;
1737{
1738 char *name;
1739 PyObject *fob;
1740 char *pathname;
1741 char *suffix; /* Unused */
1742 char *mode;
1743 int type;
1744 FILE *fp;
1745
1746 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1747 &name, &fob, &pathname,
1748 &suffix, &mode, &type))
1749 return NULL;
1750 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1751 PyErr_Format(PyExc_ValueError,
1752 "invalid file open mode %.200s", mode);
1753 return NULL;
1754 }
1755 if (fob == Py_None)
1756 fp = NULL;
1757 else {
1758 if (!PyFile_Check(fob)) {
1759 PyErr_SetString(PyExc_ValueError,
1760 "load_module arg#2 should be a file or None");
1761 return NULL;
1762 }
1763 fp = get_file(pathname, fob, mode);
1764 if (fp == NULL)
1765 return NULL;
1766 }
1767 return load_module(name, fp, pathname, type);
1768}
1769
1770static PyObject *
1771imp_load_package(self, args)
1772 PyObject *self;
1773 PyObject *args;
1774{
1775 char *name;
1776 char *pathname;
1777 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1778 return NULL;
1779 return load_package(name, pathname);
1780}
1781
1782static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001783imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 PyObject *self;
1785 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786{
1787 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001789 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001791}
1792
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001793static PyObject *
1794imp_find_module_in_package(self, args)
1795 PyObject *self;
1796 PyObject *args;
1797{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001798 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001799 PyObject *packagename = NULL;
1800 PyObject *package;
1801 PyObject *modules;
1802 PyObject *path;
1803
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001804 if (!PyArg_ParseTuple(args, "s|S", &name, &packagename))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001805 return NULL;
1806 if (packagename == NULL || PyString_GET_SIZE(packagename) == 0) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001807 return call_find_module(name, (PyObject *)NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001808 }
1809 modules = PyImport_GetModuleDict();
1810 package = PyDict_GetItem(modules, packagename);
1811 if (package == NULL) {
1812 PyErr_Format(PyExc_ImportError,
1813 "No package named %.200s",
1814 PyString_AS_STRING(packagename));
1815 return NULL;
1816 }
1817 path = PyObject_GetAttrString(package, "__path__");
1818 if (path == NULL) {
1819 PyErr_Format(PyExc_ImportError,
1820 "Package %.200s has no __path__ attribute",
1821 PyString_AS_STRING(packagename));
1822 return NULL;
1823 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001824 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001825}
1826
1827static PyObject *
1828imp_find_module_in_directory(self, args)
1829 PyObject *self;
1830 PyObject *args;
1831{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001832 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001833 PyObject *directory;
1834 PyObject *path;
1835
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001836 if (!PyArg_ParseTuple(args, "sS", &name, &directory))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001837 return NULL;
1838 path = Py_BuildValue("[O]", directory);
1839 if (path == NULL)
1840 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001841 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001842}
1843
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844static PyMethodDef imp_methods[] = {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001845 {"find_module", imp_find_module, 1},
1846 {"find_module_in_directory", imp_find_module_in_directory, 1},
1847 {"find_module_in_package", imp_find_module_in_package, 1},
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001848 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001849 {"get_magic", imp_get_magic, 1},
1850 {"get_suffixes", imp_get_suffixes, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001851 {"init_builtin", imp_init_builtin, 1},
1852 {"init_frozen", imp_init_frozen, 1},
1853 {"is_builtin", imp_is_builtin, 1},
1854 {"is_frozen", imp_is_frozen, 1},
1855 {"load_compiled", imp_load_compiled, 1},
1856 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001857 {"load_module", imp_load_module, 1},
1858 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001859#ifdef macintosh
1860 {"load_resource", imp_load_resource, 1},
1861#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001862 {"load_source", imp_load_source, 1},
1863 {"new_module", imp_new_module, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 {NULL, NULL} /* sentinel */
1865};
1866
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001867int
1868setint(d, name, value)
1869 PyObject *d;
1870 char *name;
1871 int value;
1872{
1873 PyObject *v;
1874 int err;
1875
1876 v = PyInt_FromLong((long)value);
1877 err = PyDict_SetItemString(d, name, v);
1878 Py_XDECREF(v);
1879 return err;
1880}
1881
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882void
1883initimp()
1884{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001885 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 m = Py_InitModule("imp", imp_methods);
1888 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001890 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1891 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1892 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1893 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1894 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1895 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1896 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1897 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001898
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001899 failure:
1900 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001901}