blob: a581c4f75f6881b6d3612b0c8526c99eeb56d9f9 [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));
1001static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
1002 char *buf, int buflen));
1003static PyObject * import_submodule Py_PROTO((PyObject *mod,
1004 char *name, char *fullname));
1005
1006/* The Magnum Opus of dotted-name import :-) */
1007
1008/* XXX TO DO:
1009 - Remember misses in package directories so package submodules
1010 that all import the same toplevel module don't keep hitting on the
1011 package directory first
1012*/
1013
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001014PyObject *
1015PyImport_ImportModuleEx(name, globals, locals, fromlist)
1016 char *name;
1017 PyObject *globals;
1018 PyObject *locals;
1019 PyObject *fromlist;
1020{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001021 char buf[MAXPATHLEN+1];
1022 int buflen = 0;
1023 PyObject *parent, *head, *next, *tail;
1024
1025 parent = get_parent(globals, buf, &buflen);
1026 if (parent == NULL)
1027 return NULL;
1028
1029 head = load_next(parent, Py_None, &name, buf, &buflen);
1030 if (head == NULL)
1031 return NULL;
1032
1033 tail = head;
1034 Py_INCREF(tail);
1035 while (name) {
1036 next = load_next(tail, tail, &name, buf, &buflen);
1037 Py_DECREF(tail);
1038 if (next == NULL) {
1039 Py_DECREF(head);
1040 return NULL;
1041 }
1042 tail = next;
1043 }
1044
1045 if (fromlist != NULL) {
1046 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1047 fromlist = NULL;
1048 }
1049
1050 if (fromlist == NULL) {
1051 Py_DECREF(tail);
1052 return head;
1053 }
1054
1055 Py_DECREF(head);
1056 if (!ensure_fromlist(tail, fromlist, buf, buflen)) {
1057 Py_DECREF(tail);
1058 return NULL;
1059 }
1060
1061 return tail;
1062}
1063
1064static PyObject *
1065get_parent(globals, buf, p_buflen)
1066 PyObject *globals;
1067 char *buf;
1068 int *p_buflen;
1069{
1070 static PyObject *namestr = NULL;
1071 static PyObject *pathstr = NULL;
1072 PyObject *modname, *modpath, *modules, *parent;
1073
1074 if (globals == NULL || !PyDict_Check(globals))
1075 return Py_None;
1076
1077 if (namestr == NULL) {
1078 namestr = PyString_InternFromString("__name__");
1079 if (namestr == NULL)
1080 return NULL;
1081 }
1082 if (pathstr == NULL) {
1083 pathstr = PyString_InternFromString("__path__");
1084 if (pathstr == NULL)
1085 return NULL;
1086 }
1087
1088 *buf = '\0';
1089 *p_buflen = 0;
1090 modname = PyDict_GetItem(globals, namestr);
1091 if (modname == NULL || !PyString_Check(modname))
1092 return Py_None;
1093
1094 modpath = PyDict_GetItem(globals, pathstr);
1095 if (modpath != NULL) {
1096 int len = PyString_GET_SIZE(modname);
1097 if (len > MAXPATHLEN) {
1098 PyErr_SetString(PyExc_ValueError,
1099 "Module name too long");
1100 return NULL;
1101 }
1102 strcpy(buf, PyString_AS_STRING(modname));
1103 *p_buflen = len;
1104 }
1105 else {
1106 char *start = PyString_AS_STRING(modname);
1107 char *lastdot = strrchr(start, '.');
1108 int len;
1109 if (lastdot == NULL)
1110 return Py_None;
1111 len = lastdot - start;
1112 if (len >= MAXPATHLEN) {
1113 PyErr_SetString(PyExc_ValueError,
1114 "Module name too long");
1115 return NULL;
1116 }
1117 strncpy(buf, start, len);
1118 buf[len] = '\0';
1119 *p_buflen = len;
1120 }
1121
1122 modules = PyImport_GetModuleDict();
1123 parent = PyDict_GetItemString(modules, buf);
1124 if (parent == NULL)
1125 parent = Py_None;
1126 return parent;
1127 /* We expect, but can't guarantee, if parent != None, that:
1128 - parent.__name__ == buf
1129 - parent.__dict__ is globals
1130 If this is violated... Who cares? */
1131}
1132
1133static PyObject *
1134load_next(mod, altmod, p_name, buf, p_buflen)
1135 PyObject *mod;
1136 PyObject *altmod; /* Either None or same as mod */
1137 char **p_name;
1138 char *buf;
1139 int *p_buflen;
1140{
1141 char *name = *p_name;
1142 char *dot = strchr(name, '.');
1143 int len;
1144 char *p;
1145 PyObject *result;
1146
1147 if (dot == NULL) {
1148 *p_name = NULL;
1149 len = strlen(name);
1150 }
1151 else {
1152 *p_name = dot+1;
1153 len = dot-name;
1154 }
1155
1156 p = buf + *p_buflen;
1157 if (p != buf)
1158 *p++ = '.';
1159 if (p+len-buf >= MAXPATHLEN) {
1160 PyErr_SetString(PyExc_ValueError,
1161 "Module name too long");
1162 return NULL;
1163 }
1164 strncpy(p, name, len);
1165 p[len] = '\0';
1166 *p_buflen = p+len-buf;
1167
1168 result = import_submodule(mod, p, buf);
1169 if (result == Py_None && altmod != mod) {
1170 Py_DECREF(result);
1171 /* Here, altmod must be None */
1172 strncpy(buf, name, len);
1173 buf[len] = '\0';
1174 *p_buflen = len;
1175 result = import_submodule(altmod, buf, buf);
1176 }
1177 if (result == NULL)
1178 return NULL;
1179
1180 if (result == Py_None) {
1181 Py_DECREF(result);
1182 PyErr_Format(PyExc_ImportError,
1183 "No module named %.200s", name);
1184 return NULL;
1185 }
1186
1187 return result;
1188}
1189
1190static int
1191ensure_fromlist(mod, fromlist, buf, buflen)
1192 PyObject *mod;
1193 PyObject *fromlist;
1194 char *buf;
1195 int buflen;
1196{
1197 int i;
1198
1199 if (!PyObject_HasAttrString(mod, "__path__"))
1200 return 1;
1201
1202 for (i = 0; ; i++) {
1203 PyObject *item = PySequence_GetItem(fromlist, i);
1204 int hasit;
1205 if (item == NULL) {
1206 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1207 PyErr_Clear();
1208 return 1;
1209 }
1210 return 0;
1211 }
1212 if (!PyString_Check(item)) {
1213 PyErr_SetString(PyExc_TypeError,
1214 "Item in ``from list'' not a string");
1215 Py_DECREF(item);
1216 return 0;
1217 }
1218 if (PyString_AS_STRING(item)[0] == '*') {
1219 Py_DECREF(item);
1220 continue;
1221 }
1222 hasit = PyObject_HasAttr(mod, item);
1223 if (!hasit) {
1224 char *subname = PyString_AS_STRING(item);
1225 PyObject *submod;
1226 char *p;
1227 if (buflen + strlen(subname) >= MAXPATHLEN) {
1228 PyErr_SetString(PyExc_ValueError,
1229 "Module name too long");
1230 Py_DECREF(item);
1231 return 0;
1232 }
1233 p = buf + buflen;
1234 *p++ = '.';
1235 strcpy(p, subname);
1236 submod = import_submodule(mod, subname, buf);
1237 Py_XDECREF(submod);
1238 if (submod == NULL) {
1239 Py_DECREF(item);
1240 return 0;
1241 }
1242 }
1243 Py_DECREF(item);
1244 }
1245
1246 return 1;
1247}
1248
1249static PyObject *
1250import_submodule(mod, subname, fullname)
1251 PyObject *mod; /* May be None */
1252 char *subname;
1253 char *fullname;
1254{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001255 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001257
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001258 /* Require:
1259 if mod == None: subname == fullname
1260 else: mod.__name__ + "." + subname == fullname
1261 */
1262
1263 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001265 }
1266 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001267 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001268 char buf[MAXPATHLEN+1];
1269 struct filedescr *fdp;
1270 FILE *fp = NULL;
1271
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001272 path = PyObject_GetAttrString(mod, "__path__");
1273 if (path == NULL)
1274 PyErr_Clear();
1275
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001276 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001277 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001278 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001279 if (fdp == NULL) {
1280 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1281 return NULL;
1282 PyErr_Clear();
1283 Py_INCREF(Py_None);
1284 return Py_None;
1285 }
1286 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001287 if (fp)
1288 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001289 if (m != NULL && mod != Py_None) {
1290 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1291 Py_DECREF(m);
1292 m = NULL;
1293 }
1294 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001295 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
1297 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001298}
1299
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300
1301/* Re-import a module of any kind and return its module object, WITH
1302 INCREMENTED REFERENCE COUNT */
1303
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304PyObject *
1305PyImport_ReloadModule(m)
1306 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001308 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001310 char buf[MAXPATHLEN+1];
1311 struct filedescr *fdp;
1312 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 if (m == NULL || !PyModule_Check(m)) {
1315 PyErr_SetString(PyExc_TypeError,
1316 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317 return NULL;
1318 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 if (name == NULL)
1321 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001322 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001323 PyErr_Format(PyExc_ImportError,
1324 "reload(): module %.200s not in sys.modules",
1325 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326 return NULL;
1327 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001328 buf[0] = '\0';
1329 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
1330 if (fdp == NULL)
1331 return NULL;
1332 m = load_module(name, fp, buf, fdp->type);
1333 if (fp)
1334 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 return m;
1336}
1337
1338
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001339/* Higher-level import emulator which emulates the "import" statement
1340 more accurately -- it invokes the __import__() function from the
1341 builtins of the current globals. This means that the import is
1342 done using whatever import hooks are installed in the current
1343 environment, e.g. by "ni" or "rexec". */
1344
1345PyObject *
1346PyImport_Import(module_name)
1347 PyObject *module_name;
1348{
1349 static PyObject *silly_list = NULL;
1350 static PyObject *builtins_str = NULL;
1351 static PyObject *import_str = NULL;
1352 static PyObject *standard_builtins = NULL;
1353 PyObject *globals = NULL;
1354 PyObject *import = NULL;
1355 PyObject *builtins = NULL;
1356 PyObject *r = NULL;
1357
1358 /* Initialize constant string objects */
1359 if (silly_list == NULL) {
1360 import_str = PyString_InternFromString("__import__");
1361 if (import_str == NULL)
1362 return NULL;
1363 builtins_str = PyString_InternFromString("__builtins__");
1364 if (builtins_str == NULL)
1365 return NULL;
1366 silly_list = Py_BuildValue("[s]", "__doc__");
1367 if (silly_list == NULL)
1368 return NULL;
1369 }
1370
1371 /* Get the builtins from current globals */
1372 globals = PyEval_GetGlobals();
1373 if(globals != NULL) {
1374 builtins = PyObject_GetItem(globals, builtins_str);
1375 if (builtins == NULL)
1376 goto err;
1377 }
1378 else {
1379 /* No globals -- use standard builtins, and fake globals */
1380 PyErr_Clear();
1381
1382 if (standard_builtins == NULL) {
1383 standard_builtins =
1384 PyImport_ImportModule("__builtin__");
1385 if (standard_builtins == NULL)
1386 return NULL;
1387 }
1388
1389 builtins = standard_builtins;
1390 Py_INCREF(builtins);
1391 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1392 if (globals == NULL)
1393 goto err;
1394 }
1395
1396 /* Get the __import__ function from the builtins */
1397 if (PyDict_Check(builtins))
1398 import=PyObject_GetItem(builtins, import_str);
1399 else
1400 import=PyObject_GetAttr(builtins, import_str);
1401 if (import == NULL)
1402 goto err;
1403
1404 /* Call the _import__ function with the proper argument list */
1405 r = PyObject_CallFunction(import, "OOOO",
1406 module_name, globals, globals, silly_list);
1407
1408 err:
1409 Py_XDECREF(globals);
1410 Py_XDECREF(builtins);
1411 Py_XDECREF(import);
1412
1413 return r;
1414}
1415
1416
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417/* Module 'imp' provides Python access to the primitives used for
1418 importing modules.
1419*/
1420
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 PyObject *self;
1424 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001425{
1426 char buf[4];
1427
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001430 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1431 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1432 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1433 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001434
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436}
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001439imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 PyObject *self;
1441 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001444 struct filedescr *fdp;
1445
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001447 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001449 if (list == NULL)
1450 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1452 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453 fdp->suffix, fdp->mode, fdp->type);
1454 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001456 return NULL;
1457 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 if (PyList_Append(list, item) < 0) {
1459 Py_DECREF(list);
1460 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001461 return NULL;
1462 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001464 }
1465 return list;
1466}
1467
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001469call_find_module(name, path)
1470 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001471 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475 struct filedescr *fdp;
1476 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001477 FILE *fp = NULL;
1478
1479 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001480 if (path == Py_None)
1481 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1483 if (fdp == NULL)
1484 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001485 if (fp != NULL) {
1486 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1487 if (fob == NULL) {
1488 fclose(fp);
1489 return NULL;
1490 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001491 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001492 else {
1493 fob = Py_None;
1494 Py_INCREF(fob);
1495 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001497 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499 return ret;
1500}
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001503imp_find_module(self, args)
1504 PyObject *self;
1505 PyObject *args;
1506{
1507 char *name;
1508 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001509 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001510 return NULL;
1511 return call_find_module(name, path);
1512}
1513
1514static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 PyObject *self;
1517 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001518{
1519 char *name;
1520 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 PyObject *m;
1522 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 return NULL;
1524 ret = init_builtin(name);
1525 if (ret < 0)
1526 return NULL;
1527 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 Py_INCREF(Py_None);
1529 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 m = PyImport_AddModule(name);
1532 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 return m;
1534}
1535
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001537imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyObject *self;
1539 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001540{
1541 char *name;
1542 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 PyObject *m;
1544 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001545 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001547 if (ret < 0)
1548 return NULL;
1549 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 Py_INCREF(Py_None);
1551 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001552 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 m = PyImport_AddModule(name);
1554 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001555 return m;
1556}
1557
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001559imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 PyObject *self;
1561 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001562{
1563 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001564
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001566 return NULL;
1567 return get_frozen_object(name);
1568}
1569
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001571imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 PyObject *self;
1573 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001574{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001575 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001578 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001579}
1580
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001582imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 PyObject *self;
1584 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001585{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001586 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001588 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001589 return PyInt_FromLong(is_frozen(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001590}
1591
1592static FILE *
1593get_file(pathname, fob, mode)
1594 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001596 char *mode;
1597{
1598 FILE *fp;
1599 if (fob == NULL) {
1600 fp = fopen(pathname, mode);
1601 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001603 }
1604 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 PyErr_SetString(PyExc_ValueError,
1608 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 }
1610 return fp;
1611}
1612
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001614imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 PyObject *self;
1616 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617{
1618 char *name;
1619 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620 PyObject *fob = NULL;
1621 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001623 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001625 return NULL;
1626 fp = get_file(pathname, fob, "rb");
1627 if (fp == NULL)
1628 return NULL;
1629 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001630 if (fob == NULL)
1631 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001632 return m;
1633}
1634
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001636imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 PyObject *self;
1638 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001639{
1640 char *name;
1641 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 PyObject *fob = NULL;
1643 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001644 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1646 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001647 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001648 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001649 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001650 if (fp == NULL)
1651 return NULL;
1652 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001654 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001655}
1656
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001658imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 PyObject *self;
1660 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001661{
1662 char *name;
1663 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 PyObject *fob = NULL;
1665 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001667 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 return NULL;
1670 fp = get_file(pathname, fob, "r");
1671 if (fp == NULL)
1672 return NULL;
1673 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001674 if (fob == NULL)
1675 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676 return m;
1677}
1678
Jack Jansen9c96a921995-02-15 22:57:06 +00001679#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001681imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 PyObject *self;
1683 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001684{
1685 char *name;
1686 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001688
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001690 return NULL;
1691 m = PyMac_LoadResourceModule(name, pathname);
1692 return m;
1693}
1694#endif /* macintosh */
1695
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001697imp_load_module(self, args)
1698 PyObject *self;
1699 PyObject *args;
1700{
1701 char *name;
1702 PyObject *fob;
1703 char *pathname;
1704 char *suffix; /* Unused */
1705 char *mode;
1706 int type;
1707 FILE *fp;
1708
1709 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1710 &name, &fob, &pathname,
1711 &suffix, &mode, &type))
1712 return NULL;
1713 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1714 PyErr_Format(PyExc_ValueError,
1715 "invalid file open mode %.200s", mode);
1716 return NULL;
1717 }
1718 if (fob == Py_None)
1719 fp = NULL;
1720 else {
1721 if (!PyFile_Check(fob)) {
1722 PyErr_SetString(PyExc_ValueError,
1723 "load_module arg#2 should be a file or None");
1724 return NULL;
1725 }
1726 fp = get_file(pathname, fob, mode);
1727 if (fp == NULL)
1728 return NULL;
1729 }
1730 return load_module(name, fp, pathname, type);
1731}
1732
1733static PyObject *
1734imp_load_package(self, args)
1735 PyObject *self;
1736 PyObject *args;
1737{
1738 char *name;
1739 char *pathname;
1740 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1741 return NULL;
1742 return load_package(name, pathname);
1743}
1744
1745static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001746imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 PyObject *self;
1748 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001749{
1750 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001752 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754}
1755
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001756static PyObject *
1757imp_find_module_in_package(self, args)
1758 PyObject *self;
1759 PyObject *args;
1760{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001761 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001762 PyObject *packagename = NULL;
1763 PyObject *package;
1764 PyObject *modules;
1765 PyObject *path;
1766
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001767 if (!PyArg_ParseTuple(args, "s|S", &name, &packagename))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001768 return NULL;
1769 if (packagename == NULL || PyString_GET_SIZE(packagename) == 0) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001770 return call_find_module(name, (PyObject *)NULL);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001771 }
1772 modules = PyImport_GetModuleDict();
1773 package = PyDict_GetItem(modules, packagename);
1774 if (package == NULL) {
1775 PyErr_Format(PyExc_ImportError,
1776 "No package named %.200s",
1777 PyString_AS_STRING(packagename));
1778 return NULL;
1779 }
1780 path = PyObject_GetAttrString(package, "__path__");
1781 if (path == NULL) {
1782 PyErr_Format(PyExc_ImportError,
1783 "Package %.200s has no __path__ attribute",
1784 PyString_AS_STRING(packagename));
1785 return NULL;
1786 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001787 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001788}
1789
1790static PyObject *
1791imp_find_module_in_directory(self, args)
1792 PyObject *self;
1793 PyObject *args;
1794{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001795 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001796 PyObject *directory;
1797 PyObject *path;
1798
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001799 if (!PyArg_ParseTuple(args, "sS", &name, &directory))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001800 return NULL;
1801 path = Py_BuildValue("[O]", directory);
1802 if (path == NULL)
1803 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001804 return call_find_module(name, path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001805}
1806
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807static PyMethodDef imp_methods[] = {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001808 {"find_module", imp_find_module, 1},
1809 {"find_module_in_directory", imp_find_module_in_directory, 1},
1810 {"find_module_in_package", imp_find_module_in_package, 1},
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001811 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 {"get_magic", imp_get_magic, 1},
1813 {"get_suffixes", imp_get_suffixes, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 {"init_builtin", imp_init_builtin, 1},
1815 {"init_frozen", imp_init_frozen, 1},
1816 {"is_builtin", imp_is_builtin, 1},
1817 {"is_frozen", imp_is_frozen, 1},
1818 {"load_compiled", imp_load_compiled, 1},
1819 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001820 {"load_module", imp_load_module, 1},
1821 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001822#ifdef macintosh
1823 {"load_resource", imp_load_resource, 1},
1824#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001825 {"load_source", imp_load_source, 1},
1826 {"new_module", imp_new_module, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001827 {NULL, NULL} /* sentinel */
1828};
1829
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001830int
1831setint(d, name, value)
1832 PyObject *d;
1833 char *name;
1834 int value;
1835{
1836 PyObject *v;
1837 int err;
1838
1839 v = PyInt_FromLong((long)value);
1840 err = PyDict_SetItemString(d, name, v);
1841 Py_XDECREF(v);
1842 return err;
1843}
1844
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845void
1846initimp()
1847{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001848 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001849
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 m = Py_InitModule("imp", imp_methods);
1851 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001852
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001853 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1854 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1855 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1856 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1857 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1858 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1859 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1860 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001862 failure:
1863 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864}