blob: 971e658c2c27d014b32d174ae6483e8039e99aba [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;
567 d = PyModule_GetDict(m);
568 file = PyString_FromString(pathname);
569 if (file == NULL)
570 return NULL;
571 path = Py_BuildValue("[O]", file);
572 if (path == NULL) {
573 Py_DECREF(file);
574 return NULL;
575 }
576 err = PyDict_SetItemString(d, "__file__", file);
577 if (err == 0)
578 err = PyDict_SetItemString(d, "__path__", path);
579 if (err != 0) {
580 m = NULL;
581 goto cleanup;
582 }
583 buf[0] = '\0';
584 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
585 if (fdp == NULL) {
586 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
587 PyErr_Clear();
588 }
589 else
590 m = NULL;
591 goto cleanup;
592 }
593 m = load_module(name, fp, buf, fdp->type);
594 if (fp != NULL)
595 fclose(fp);
596 cleanup:
597 Py_XINCREF(m);
598 Py_XDECREF(path);
599 Py_XDECREF(file);
600 return m;
601}
602
603
604/* Helper to test for built-in module */
605
606static int
607is_builtin(name)
608 char *name;
609{
610 int i;
611 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
612 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
613 if (_PyImport_Inittab[i].initfunc == NULL)
614 return -1;
615 else
616 return 1;
617 }
618 }
619 return 0;
620}
621
622/* Helper to test for frozen module */
623
624static int
625is_frozen(name)
626 char *name;
627{
628 struct _frozen *p;
629 for (p = PyImport_FrozenModules; ; p++) {
630 if (p->name == NULL)
631 break;
632 if (strcmp(p->name, name) == 0)
633 return 1;
634 }
635 return 0;
636}
637
638
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639/* Search the path (default sys.path) for a module. Return the
640 corresponding filedescr struct, and (via return arguments) the
641 pathname and an open file. Return NULL if the module is not found. */
642
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000643#ifdef MS_COREDLL
644extern FILE *PyWin_FindRegisteredModule();
645#endif
646
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647static struct filedescr *
648find_module(name, path, buf, buflen, p_fp)
649 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651 /* Output parameters: */
652 char *buf;
653 int buflen;
654 FILE **p_fp;
655{
656 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000657 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000658 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000659 struct stat statbuf;
660
661 if (path == NULL) {
662 if (is_builtin(name)) {
663 static struct filedescr fd = {"", "", C_BUILTIN};
664 return &fd;
665 }
666 if (is_frozen(name)) {
667 static struct filedescr fd = {"", "", PY_FROZEN};
668 return &fd;
669 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670
Guido van Rossumac279101996-08-22 23:10:58 +0000671#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000672 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
673 if (fp != NULL) {
674 *p_fp = fp;
675 return fdp;
676 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000677#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000678 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000679
680
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 path = PySys_GetObject("path");
683 if (path == NULL || !PyList_Check(path)) {
684 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000685 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 return NULL;
687 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689 namelen = strlen(name);
690 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 PyObject *v = PyList_GetItem(path, i);
692 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000695 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000698 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000700#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000701#ifdef INTERN_STRINGS
702 /*
703 ** Speedup: each sys.path item is interned, and
704 ** FindResourceModule remembers which items refer to
705 ** folders (so we don't have to bother trying to look
706 ** into them for resources).
707 */
708 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
709 v = PyList_GET_ITEM(path, i);
710#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000711 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 static struct filedescr resfiledescr =
713 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000714
715 return &resfiledescr;
716 }
717#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000718 if (len > 0 && buf[len-1] != SEP
719#ifdef ALTSEP
720 && buf[len-1] != ALTSEP
721#endif
722 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723 buf[len++] = SEP;
Guido van Rossum741689d1997-08-12 14:53:39 +0000724#ifdef macintosh
725 fdp = PyMac_FindModuleExtension(buf, &len, name);
726 if ( fdp )
727 fp = fopen(buf, fdp->mode);
728#else
Guido van Rossum40f470f1996-05-23 22:51:04 +0000729#ifdef IMPORT_8x3_NAMES
730 /* see if we are searching in directory dos_8x3 */
731 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
732 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000733 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000734 for (j = 0; (ch = name[j]) && j < 8; j++)
735 if (isupper(ch))
736 buf[len++] = tolower(ch);
737 else
738 buf[len++] = ch;
739 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000740 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000741#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000742 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000743 strcpy(buf+len, name);
744 len += namelen;
745 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000746#ifdef HAVE_STAT
747 if (stat(buf, &statbuf) == 0) {
748 static struct filedescr fd = {"", "", PKG_DIRECTORY};
749 if (S_ISDIR(statbuf.st_mode))
750 return &fd;
751 }
752#else
753 /* XXX How are you going to test for directories? */
754#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 fprintf(stderr, "# trying %s\n", buf);
759 fp = fopen(buf, fdp->mode);
760 if (fp != NULL)
761 break;
762 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000763#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764 if (fp != NULL)
765 break;
766 }
767 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000768 PyErr_Format(PyExc_ImportError,
769 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770 return NULL;
771 }
772
773 *p_fp = fp;
774 return fdp;
775}
776
777
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000778static int init_builtin Py_PROTO((char *)); /* Forward */
779
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000781 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000784load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000786 FILE *fp;
787 char *buf;
788 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000790 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000792 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000794 /* First check that there's an open file (if we need one) */
795 switch (type) {
796 case PY_SOURCE:
797 case PY_COMPILED:
798 if (fp == NULL) {
799 PyErr_Format(PyExc_ValueError,
800 "file object required for import (type code %d)",
801 type);
802 return NULL;
803 }
804 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
808 case PY_SOURCE:
809 m = load_source_module(name, buf, fp);
810 break;
811
812 case PY_COMPILED:
813 m = load_compiled_module(name, buf, fp);
814 break;
815
816 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818 break;
819
Jack Jansen9c96a921995-02-15 22:57:06 +0000820#ifdef macintosh
821 case PY_RESOURCE:
822 m = PyMac_LoadResourceModule(name, buf);
823 break;
824#endif
825
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000826 case PKG_DIRECTORY:
827 m = load_package(name, buf);
828 break;
829
830 case C_BUILTIN:
831 case PY_FROZEN:
832 if (type == C_BUILTIN)
833 err = init_builtin(name);
834 else
835 err = PyImport_ImportFrozenModule(name);
836 if (err < 0)
837 goto failure;
838 if (err == 0) {
839 PyErr_Format(PyExc_ImportError,
840 "Purported %s module %.200s not found",
841 type == C_BUILTIN ?
842 "builtin" : "frozen",
843 name);
844 goto failure;
845 }
846 modules = PyImport_GetModuleDict();
847 m = PyDict_GetItemString(modules, name);
848 if (m == NULL) {
849 PyErr_Format(
850 PyExc_ImportError,
851 "%s module %.200s not properly initialized",
852 type == C_BUILTIN ?
853 "builtin" : "frozen",
854 name);
855 goto failure;
856 }
857 Py_INCREF(m);
858 break;
859
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000860 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000861 failure:
862 PyErr_Format(PyExc_ImportError,
863 "Don't know how to import %.200s (type code %d)",
864 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000865 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
867 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000868
869 return m;
870}
871
872
873/* Initialize a built-in module.
874 Return 1 for succes, 0 if the module is not found, and -1 with
875 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000876
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000877static int
878init_builtin(name)
879 char *name;
880{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000881 struct _inittab *p;
882 PyObject *mod;
883
884 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
885 return 1;
886
887 for (p = _PyImport_Inittab; p->name != NULL; p++) {
888 if (strcmp(name, p->name) == 0) {
889 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000890 PyErr_Format(PyExc_ImportError,
891 "Cannot re-init internal module %.200s",
892 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000893 return -1;
894 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000896 fprintf(stderr, "import %s # builtin\n", name);
897 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000900 if (_PyImport_FixupExtension(name, name) == NULL)
901 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000902 return 1;
903 }
904 }
905 return 0;
906}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000907
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000909/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000911static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000912find_frozen(name)
913 char *name;
914{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000915 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000916
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000918 if (p->name == NULL)
919 return NULL;
920 if (strcmp(p->name, name) == 0)
921 break;
922 }
923 return p;
924}
925
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000927get_frozen_object(name)
928 char *name;
929{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000930 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000931
932 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000933 PyErr_Format(PyExc_ImportError,
934 "No such frozen object named %.200s",
935 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000936 return NULL;
937 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000939}
940
941/* Initialize a frozen module.
942 Return 1 for succes, 0 if the module is not found, and -1 with
943 an exception set if the initialization failed.
944 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000945
946int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000948 char *name;
949{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000950 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyObject *co;
952 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000953
954 if (p == NULL)
955 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000957 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000959 if (co == NULL)
960 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 if (!PyCode_Check(co)) {
962 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000963 PyErr_Format(PyExc_TypeError,
964 "frozen object %.200s is not a code object",
965 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000966 return -1;
967 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 m = PyImport_ExecCodeModule(name, co);
969 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000970 if (m == NULL)
971 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000973 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000974}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000975
976
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000978 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000979
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980PyObject *
981PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000983{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000984 return PyImport_ImportModuleEx(name, NULL, NULL, NULL);
985}
986
987PyObject *
988PyImport_ImportModuleEx(name, globals, locals, fromlist)
989 char *name;
990 PyObject *globals;
991 PyObject *locals;
992 PyObject *fromlist;
993{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000994 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000996
Guido van Rossum25ce5661997-08-02 03:10:38 +0000997 if ((m = PyDict_GetItemString(modules, name)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000999 }
1000 else {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001001 char buf[MAXPATHLEN+1];
1002 struct filedescr *fdp;
1003 FILE *fp = NULL;
1004
1005 buf[0] = '\0';
1006 fdp = find_module(name, (PyObject *)NULL,
1007 buf, MAXPATHLEN+1, &fp);
1008 if (fdp == NULL)
1009 return NULL;
1010 m = load_module(name, fp, buf, fdp->type);
1011 if (fp)
1012 fclose(fp);
Guido van Rossum74e6a111994-08-29 12:54:38 +00001013 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001014
1015 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001016}
1017
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018
1019/* Re-import a module of any kind and return its module object, WITH
1020 INCREMENTED REFERENCE COUNT */
1021
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022PyObject *
1023PyImport_ReloadModule(m)
1024 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001025{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001026 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001027 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001028 char buf[MAXPATHLEN+1];
1029 struct filedescr *fdp;
1030 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 if (m == NULL || !PyModule_Check(m)) {
1033 PyErr_SetString(PyExc_TypeError,
1034 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 return NULL;
1036 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 if (name == NULL)
1039 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001040 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001041 PyErr_Format(PyExc_ImportError,
1042 "reload(): module %.200s not in sys.modules",
1043 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044 return NULL;
1045 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001046 buf[0] = '\0';
1047 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
1048 if (fdp == NULL)
1049 return NULL;
1050 m = load_module(name, fp, buf, fdp->type);
1051 if (fp)
1052 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 return m;
1054}
1055
1056
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001057/* Higher-level import emulator which emulates the "import" statement
1058 more accurately -- it invokes the __import__() function from the
1059 builtins of the current globals. This means that the import is
1060 done using whatever import hooks are installed in the current
1061 environment, e.g. by "ni" or "rexec". */
1062
1063PyObject *
1064PyImport_Import(module_name)
1065 PyObject *module_name;
1066{
1067 static PyObject *silly_list = NULL;
1068 static PyObject *builtins_str = NULL;
1069 static PyObject *import_str = NULL;
1070 static PyObject *standard_builtins = NULL;
1071 PyObject *globals = NULL;
1072 PyObject *import = NULL;
1073 PyObject *builtins = NULL;
1074 PyObject *r = NULL;
1075
1076 /* Initialize constant string objects */
1077 if (silly_list == NULL) {
1078 import_str = PyString_InternFromString("__import__");
1079 if (import_str == NULL)
1080 return NULL;
1081 builtins_str = PyString_InternFromString("__builtins__");
1082 if (builtins_str == NULL)
1083 return NULL;
1084 silly_list = Py_BuildValue("[s]", "__doc__");
1085 if (silly_list == NULL)
1086 return NULL;
1087 }
1088
1089 /* Get the builtins from current globals */
1090 globals = PyEval_GetGlobals();
1091 if(globals != NULL) {
1092 builtins = PyObject_GetItem(globals, builtins_str);
1093 if (builtins == NULL)
1094 goto err;
1095 }
1096 else {
1097 /* No globals -- use standard builtins, and fake globals */
1098 PyErr_Clear();
1099
1100 if (standard_builtins == NULL) {
1101 standard_builtins =
1102 PyImport_ImportModule("__builtin__");
1103 if (standard_builtins == NULL)
1104 return NULL;
1105 }
1106
1107 builtins = standard_builtins;
1108 Py_INCREF(builtins);
1109 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1110 if (globals == NULL)
1111 goto err;
1112 }
1113
1114 /* Get the __import__ function from the builtins */
1115 if (PyDict_Check(builtins))
1116 import=PyObject_GetItem(builtins, import_str);
1117 else
1118 import=PyObject_GetAttr(builtins, import_str);
1119 if (import == NULL)
1120 goto err;
1121
1122 /* Call the _import__ function with the proper argument list */
1123 r = PyObject_CallFunction(import, "OOOO",
1124 module_name, globals, globals, silly_list);
1125
1126 err:
1127 Py_XDECREF(globals);
1128 Py_XDECREF(builtins);
1129 Py_XDECREF(import);
1130
1131 return r;
1132}
1133
1134
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135/* Module 'imp' provides Python access to the primitives used for
1136 importing modules.
1137*/
1138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 PyObject *self;
1142 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001143{
1144 char buf[4];
1145
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001148 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1149 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1150 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1151 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154}
1155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject *self;
1159 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162 struct filedescr *fdp;
1163
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001167 if (list == NULL)
1168 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1170 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171 fdp->suffix, fdp->mode, fdp->type);
1172 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174 return NULL;
1175 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 if (PyList_Append(list, item) < 0) {
1177 Py_DECREF(list);
1178 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179 return NULL;
1180 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182 }
1183 return list;
1184}
1185
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001187call_find_module(name, path)
1188 char *name;
1189 PyObject *path; /* list or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001193 struct filedescr *fdp;
1194 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001195 FILE *fp = NULL;
1196
1197 pathname[0] = '\0';
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1199 if (fdp == NULL)
1200 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001201 if (fp != NULL) {
1202 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1203 if (fob == NULL) {
1204 fclose(fp);
1205 return NULL;
1206 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001208 else {
1209 fob = Py_None;
1210 Py_INCREF(fob);
1211 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 return ret;
1216}
1217
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001219imp_find_module(self, args)
1220 PyObject *self;
1221 PyObject *args;
1222{
1223 char *name;
1224 PyObject *path = NULL;
1225 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
1226 return NULL;
1227 return call_find_module(name, path);
1228}
1229
1230static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 PyObject *self;
1233 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234{
1235 char *name;
1236 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 PyObject *m;
1238 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239 return NULL;
1240 ret = init_builtin(name);
1241 if (ret < 0)
1242 return NULL;
1243 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 Py_INCREF(Py_None);
1245 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 m = PyImport_AddModule(name);
1248 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 return m;
1250}
1251
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001254 PyObject *self;
1255 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256{
1257 char *name;
1258 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 PyObject *m;
1260 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001262 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001263 if (ret < 0)
1264 return NULL;
1265 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 Py_INCREF(Py_None);
1267 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 m = PyImport_AddModule(name);
1270 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 return m;
1272}
1273
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001275imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 PyObject *self;
1277 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001278{
1279 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001280
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001282 return NULL;
1283 return get_frozen_object(name);
1284}
1285
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288 PyObject *self;
1289 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001291 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001294 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295}
1296
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 PyObject *self;
1300 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001301{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001305 return PyInt_FromLong(is_frozen(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306}
1307
1308static FILE *
1309get_file(pathname, fob, mode)
1310 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 char *mode;
1313{
1314 FILE *fp;
1315 if (fob == NULL) {
1316 fp = fopen(pathname, mode);
1317 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319 }
1320 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 PyErr_SetString(PyExc_ValueError,
1324 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325 }
1326 return fp;
1327}
1328
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 PyObject *self;
1332 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333{
1334 char *name;
1335 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 PyObject *fob = NULL;
1337 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001338 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001341 return NULL;
1342 fp = get_file(pathname, fob, "rb");
1343 if (fp == NULL)
1344 return NULL;
1345 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001346 if (fob == NULL)
1347 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 return m;
1349}
1350
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001352imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353 PyObject *self;
1354 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001355{
1356 char *name;
1357 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyObject *fob = NULL;
1359 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001360 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1362 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001363 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001364 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001365 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001366 if (fp == NULL)
1367 return NULL;
1368 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001370 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371}
1372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 PyObject *self;
1376 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377{
1378 char *name;
1379 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *fob = NULL;
1381 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001383 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 return NULL;
1386 fp = get_file(pathname, fob, "r");
1387 if (fp == NULL)
1388 return NULL;
1389 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001390 if (fob == NULL)
1391 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001392 return m;
1393}
1394
Jack Jansen9c96a921995-02-15 22:57:06 +00001395#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001397imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 PyObject *self;
1399 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001400{
1401 char *name;
1402 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001404
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001406 return NULL;
1407 m = PyMac_LoadResourceModule(name, pathname);
1408 return m;
1409}
1410#endif /* macintosh */
1411
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001413imp_load_module(self, args)
1414 PyObject *self;
1415 PyObject *args;
1416{
1417 char *name;
1418 PyObject *fob;
1419 char *pathname;
1420 char *suffix; /* Unused */
1421 char *mode;
1422 int type;
1423 FILE *fp;
1424
1425 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1426 &name, &fob, &pathname,
1427 &suffix, &mode, &type))
1428 return NULL;
1429 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1430 PyErr_Format(PyExc_ValueError,
1431 "invalid file open mode %.200s", mode);
1432 return NULL;
1433 }
1434 if (fob == Py_None)
1435 fp = NULL;
1436 else {
1437 if (!PyFile_Check(fob)) {
1438 PyErr_SetString(PyExc_ValueError,
1439 "load_module arg#2 should be a file or None");
1440 return NULL;
1441 }
1442 fp = get_file(pathname, fob, mode);
1443 if (fp == NULL)
1444 return NULL;
1445 }
1446 return load_module(name, fp, pathname, type);
1447}
1448
1449static PyObject *
1450imp_load_package(self, args)
1451 PyObject *self;
1452 PyObject *args;
1453{
1454 char *name;
1455 char *pathname;
1456 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1457 return NULL;
1458 return load_package(name, pathname);
1459}
1460
1461static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 PyObject *self;
1464 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465{
1466 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001468 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001470}
1471
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001472static PyObject *
1473imp_find_module_in_package(self, args)
1474 PyObject *self;
1475 PyObject *args;
1476{
1477 PyObject *name;
1478 PyObject *packagename = NULL;
1479 PyObject *package;
1480 PyObject *modules;
1481 PyObject *path;
1482
1483 if (!PyArg_ParseTuple(args, "S|S", &name, &packagename))
1484 return NULL;
1485 if (packagename == NULL || PyString_GET_SIZE(packagename) == 0) {
1486 return call_find_module(
1487 PyString_AS_STRING(name),
1488 (PyObject *)NULL);
1489 }
1490 modules = PyImport_GetModuleDict();
1491 package = PyDict_GetItem(modules, packagename);
1492 if (package == NULL) {
1493 PyErr_Format(PyExc_ImportError,
1494 "No package named %.200s",
1495 PyString_AS_STRING(packagename));
1496 return NULL;
1497 }
1498 path = PyObject_GetAttrString(package, "__path__");
1499 if (path == NULL) {
1500 PyErr_Format(PyExc_ImportError,
1501 "Package %.200s has no __path__ attribute",
1502 PyString_AS_STRING(packagename));
1503 return NULL;
1504 }
1505 return call_find_module(PyString_AS_STRING(name), path);
1506}
1507
1508static PyObject *
1509imp_find_module_in_directory(self, args)
1510 PyObject *self;
1511 PyObject *args;
1512{
1513 PyObject *name;
1514 PyObject *directory;
1515 PyObject *path;
1516
1517 if (!PyArg_ParseTuple(args, "SS", &name, &directory))
1518 return NULL;
1519 path = Py_BuildValue("[O]", directory);
1520 if (path == NULL)
1521 return NULL;
1522 return call_find_module(PyString_AS_STRING(name), path);
1523}
1524
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525static PyMethodDef imp_methods[] = {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001526 {"find_module", imp_find_module, 1},
1527 {"find_module_in_directory", imp_find_module_in_directory, 1},
1528 {"find_module_in_package", imp_find_module_in_package, 1},
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001529 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530 {"get_magic", imp_get_magic, 1},
1531 {"get_suffixes", imp_get_suffixes, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001532 {"init_builtin", imp_init_builtin, 1},
1533 {"init_frozen", imp_init_frozen, 1},
1534 {"is_builtin", imp_is_builtin, 1},
1535 {"is_frozen", imp_is_frozen, 1},
1536 {"load_compiled", imp_load_compiled, 1},
1537 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001538 {"load_module", imp_load_module, 1},
1539 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001540#ifdef macintosh
1541 {"load_resource", imp_load_resource, 1},
1542#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001543 {"load_source", imp_load_source, 1},
1544 {"new_module", imp_new_module, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001545 {NULL, NULL} /* sentinel */
1546};
1547
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001548int
1549setint(d, name, value)
1550 PyObject *d;
1551 char *name;
1552 int value;
1553{
1554 PyObject *v;
1555 int err;
1556
1557 v = PyInt_FromLong((long)value);
1558 err = PyDict_SetItemString(d, name, v);
1559 Py_XDECREF(v);
1560 return err;
1561}
1562
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001563void
1564initimp()
1565{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001566 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001567
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 m = Py_InitModule("imp", imp_methods);
1569 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001570
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001571 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1572 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1573 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1574 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1575 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1576 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1577 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1578 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001579
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001580 failure:
1581 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001582}