blob: aef73537c55dbd92217ae317681d844a437fb552 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module definition and import implementation */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "token.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000039#include "marshal.h"
40#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000042#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000044#ifdef macintosh
45#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum80bb9651996-12-05 23:27:02 +000048#ifdef HAVE_UNISTD_H
49#include <unistd.h>
50#endif
51
Guido van Rossumaee0bad1997-09-05 07:33:22 +000052/* We expect that stat exists on most systems.
53 It's confirmed on Unix, Mac and Windows.
54 If you don't have it, add #define DONT_HAVE_STAT to your config.h. */
55#ifndef DONT_HAVE_STAT
56#define HAVE_STAT
57
58#include <sys/types.h>
59#include <sys/stat.h>
60
61#ifndef S_ISDIR
62#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
63#endif
64
65#endif
66
67
Guido van Rossum79f25d91997-04-29 20:08:16 +000068extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000069
Guido van Rossum6c849691994-09-26 15:47:17 +000070/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000071/* Change for each incompatible change */
72/* The value of CR and LF is incorporated so if you ever read or write
73 a .pyc file in text mode the magic number will be wrong; also, the
74 Apple MPW compiler swaps their values, botching string constants */
75/* XXX Perhaps the magic number should be frozen and a version field
76 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000077/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000078#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000079
Guido van Rossum25ce5661997-08-02 03:10:38 +000080/* See _PyImport_FixupExtension() below */
81static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000082
Guido van Rossum771c6c81997-10-31 18:37:24 +000083/* This table is defined in config.c: */
84extern struct _inittab _PyImport_Inittab[];
85
86struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000087
Guido van Rossum1ae940a1995-01-02 19:04:15 +000088/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089
90void
Guido van Rossum25ce5661997-08-02 03:10:38 +000091_PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092{
Guido van Rossum0824f631997-03-11 18:37:35 +000093 if (Py_OptimizeFlag) {
94 /* Replace ".pyc" with ".pyo" in import_filetab */
95 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000096 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000097 if (strcmp(p->suffix, ".pyc") == 0)
98 p->suffix = ".pyo";
99 }
100 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101}
102
Guido van Rossum25ce5661997-08-02 03:10:38 +0000103void
104_PyImport_Fini()
105{
106 Py_XDECREF(extensions);
107 extensions = NULL;
108}
109
110
111/* Helper for sys */
112
113PyObject *
114PyImport_GetModuleDict()
115{
116 PyInterpreterState *interp = PyThreadState_Get()->interp;
117 if (interp->modules == NULL)
118 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
119 return interp->modules;
120}
121
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122
Guido van Rossum085d2691997-08-05 02:20:51 +0000123/* Helper for PyImport_Cleanup */
124
125static void
126clear_carefully(d)
127 PyObject *d;
128{
129 /* To make the execution order of destructors for global
130 objects a bit more predictable, we first zap all objects
131 whose name starts with a single underscore, before we clear
132 the entire dictionary. We zap them by replacing them with
133 None, rather than deleting them from the dictionary, to
134 avoid rehashing the dictionary (to some extent). */
135
136 int pos;
137 PyObject *key, *value;
138
139 pos = 0;
140 while (PyDict_Next(d, &pos, &key, &value)) {
141 if (value != Py_None && PyString_Check(key)) {
142 char *s = PyString_AsString(key);
143 if (s[0] == '_' && s[1] != '_')
144 PyDict_SetItem(d, key, Py_None);
145 }
146 }
147
148 PyDict_Clear(d);
149}
150
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152
Guido van Rossum3f5da241990-12-20 15:06:42 +0000153void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156 PyInterpreterState *interp = PyThreadState_Get()->interp;
157 PyObject *tmp = interp->modules;
158 if (tmp != NULL) {
159 int pos;
160 PyObject *key, *value;
161 interp->modules = NULL;
162 pos = 0;
163 while (PyDict_Next(tmp, &pos, &key, &value)) {
164 if (PyModule_Check(value)) {
165 PyObject *d = PyModule_GetDict(value);
Guido van Rossum085d2691997-08-05 02:20:51 +0000166 clear_carefully(d);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167 }
168 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 PyDict_Clear(tmp);
170 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000172}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000173
174
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000175/* Helper for pythonrun.c -- return magic number */
176
177long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000179{
180 return MAGIC;
181}
182
183
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184/* Magic for extension modules (built-in as well as dynamically
185 loaded). To prevent initializing an extension module more than
186 once, we keep a static dictionary 'extensions' keyed by module name
187 (for built-in modules) or by filename (for dynamically loaded
188 modules), containing these modules. A copy od the module's
189 dictionary is stored by calling _PyImport_FixupExtension()
190 immediately after the module initialization function succeeds. A
191 copy can be retrieved from there by calling
192 _PyImport_FindExtension(). */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000193
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195_PyImport_FixupExtension(name, filename)
196 char *name;
197 char *filename;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000198{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 PyObject *modules, *mod, *dict, *copy;
200 if (extensions == NULL) {
201 extensions = PyDict_New();
202 if (extensions == NULL)
203 return NULL;
204 }
205 modules = PyImport_GetModuleDict();
206 mod = PyDict_GetItemString(modules, name);
207 if (mod == NULL || !PyModule_Check(mod)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000208 PyErr_Format(PyExc_SystemError,
209 "_PyImport_FixupExtension: module %.200s not loaded", name);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000210 return NULL;
211 }
212 dict = PyModule_GetDict(mod);
213 if (dict == NULL)
214 return NULL;
215 copy = PyObject_CallMethod(dict, "copy", "");
216 if (copy == NULL)
217 return NULL;
218 PyDict_SetItemString(extensions, filename, copy);
219 Py_DECREF(copy);
220 return copy;
221}
222
223PyObject *
224_PyImport_FindExtension(name, filename)
225 char *name;
226 char *filename;
227{
228 PyObject *dict, *mod, *mdict, *result;
229 if (extensions == NULL)
230 return NULL;
231 dict = PyDict_GetItemString(extensions, filename);
232 if (dict == NULL)
233 return NULL;
234 mod = PyImport_AddModule(name);
235 if (mod == NULL)
236 return NULL;
237 mdict = PyModule_GetDict(mod);
238 if (mdict == NULL)
239 return NULL;
240 result = PyObject_CallMethod(mdict, "update", "O", dict);
241 if (result == NULL)
242 return NULL;
243 Py_DECREF(result);
244 if (Py_VerboseFlag)
245 fprintf(stderr, "import %s # previously loaded (%s)\n",
246 name, filename);
247 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248}
249
250
251/* Get the module object corresponding to a module name.
252 First check the modules dictionary if there's one there,
253 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000254 Because the former action is most common, THIS DOES NOT RETURN A
255 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000256
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257PyObject *
258PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000259 char *name;
260{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000266 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268 if (m == NULL)
269 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270 if (PyDict_SetItemString(modules, name, m) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272 return NULL;
273 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000275
276 return m;
277}
278
279
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000280/* Execute a code object in a module and return the module object
281 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283PyObject *
284PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000288 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000292 if (m == NULL)
293 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 d = PyModule_GetDict(m);
295 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
296 if (PyDict_SetItemString(d, "__builtins__",
297 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000298 return NULL;
299 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000300 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 if (PyDict_SetItemString(d, "__file__",
302 ((PyCodeObject *)co)->co_filename) != 0)
303 PyErr_Clear(); /* Not important enough to report */
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000304 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 if (v == NULL)
306 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 Py_DECREF(v);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000308
Guido van Rossum25ce5661997-08-02 03:10:38 +0000309 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000310 PyErr_Format(PyExc_ImportError,
311 "Loaded module %.200s not found in sys.modules",
312 name);
Guido van Rossumb65e85c1997-07-10 18:00:45 +0000313 return NULL;
314 }
315
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317
318 return m;
319}
320
321
322/* Given a pathname for a Python source file, fill a buffer with the
323 pathname for the corresponding compiled file. Return the pathname
324 for the compiled file, or NULL if there's no space in the buffer.
325 Doesn't set an exception. */
326
327static char *
328make_compiled_pathname(pathname, buf, buflen)
329 char *pathname;
330 char *buf;
331 int buflen;
332{
333 int len;
334
335 len = strlen(pathname);
336 if (len+2 > buflen)
337 return NULL;
338 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000339 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
341 return buf;
342}
343
344
345/* Given a pathname for a Python source file, its time of last
346 modification, and a pathname for a compiled file, check whether the
347 compiled file represents the same version of the source. If so,
348 return a FILE pointer for the compiled file, positioned just after
349 the header; if not, return NULL.
350 Doesn't set an exception. */
351
352static FILE *
353check_compiled_module(pathname, mtime, cpathname)
354 char *pathname;
355 long mtime;
356 char *cpathname;
357{
358 FILE *fp;
359 long magic;
360 long pyc_mtime;
361
362 fp = fopen(cpathname, "rb");
363 if (fp == NULL)
364 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000366 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368 fprintf(stderr, "# %s has bad magic\n", cpathname);
369 fclose(fp);
370 return NULL;
371 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375 fprintf(stderr, "# %s has bad mtime\n", cpathname);
376 fclose(fp);
377 return NULL;
378 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
381 return fp;
382}
383
384
385/* Read a code object from a file and check it for validity */
386
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387static PyCodeObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000388read_compiled_module(cpathname, fp)
389 char *cpathname;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 FILE *fp;
391{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 if (co == NULL || !PyCode_Check(co)) {
397 if (!PyErr_Occurred())
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000398 PyErr_Format(PyExc_ImportError,
399 "Non-code object in %.200s", cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 return NULL;
402 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000404}
405
406
407/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000408 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409
Guido van Rossum79f25d91997-04-29 20:08:16 +0000410static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000411load_compiled_module(name, cpathname, fp)
412 char *name;
413 char *cpathname;
414 FILE *fp;
415{
416 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 PyCodeObject *co;
418 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 if (magic != MAGIC) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000422 PyErr_Format(PyExc_ImportError,
423 "Bad magic number in %.200s", cpathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 return NULL;
425 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000427 co = read_compiled_module(cpathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 if (co == NULL)
429 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431 fprintf(stderr, "import %s # precompiled from %s\n",
432 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 m = PyImport_ExecCodeModule(name, (PyObject *)co);
434 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435
436 return m;
437}
438
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439/* Parse a source file and return the corresponding code object */
440
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442parse_source_module(pathname, fp)
443 char *pathname;
444 FILE *fp;
445{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 node *n;
448
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000449 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 if (n == NULL)
451 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 co = PyNode_Compile(n, pathname);
453 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454
455 return co;
456}
457
458
459/* Write a compiled module to a file, placing the time of last
460 modification of its source into the header.
461 Errors are ignored, if a write error occurs an attempt is made to
462 remove the file. */
463
464static void
465write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 char *cpathname;
468 long mtime;
469{
470 FILE *fp;
471
472 fp = fopen(cpathname, "wb");
473 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000475 fprintf(stderr,
476 "# can't create %s\n", cpathname);
477 return;
478 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyMarshal_WriteLongToFile(0L, fp);
482 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000485 fprintf(stderr, "# can't write %s\n", cpathname);
486 /* Don't keep partial file */
487 fclose(fp);
488 (void) unlink(cpathname);
489 return;
490 }
491 /* Now write the true mtime */
492 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494 fflush(fp);
495 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 fprintf(stderr, "# wrote %s\n", cpathname);
498#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000499 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500#endif
501}
502
503
504/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000505 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
506 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509load_source_module(name, pathname, fp)
510 char *name;
511 char *pathname;
512 FILE *fp;
513{
514 long mtime;
515 FILE *fpc;
516 char buf[MAXPATHLEN+1];
517 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518 PyCodeObject *co;
519 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000520
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000521 mtime = PyOS_GetLastModificationTime(pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
523 if (cpathname != NULL &&
524 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000525 co = read_compiled_module(cpathname, fpc);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526 fclose(fpc);
527 if (co == NULL)
528 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000530 fprintf(stderr, "import %s # precompiled from %s\n",
531 name, cpathname);
532 }
533 else {
534 co = parse_source_module(pathname, fp);
535 if (co == NULL)
536 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 fprintf(stderr, "import %s # from %s\n",
539 name, pathname);
540 write_compiled_module(co, cpathname, mtime);
541 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 m = PyImport_ExecCodeModule(name, (PyObject *)co);
543 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000544
545 return m;
546}
547
548
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000549/* Forward */
550static PyObject *load_module Py_PROTO((char *, FILE *, char *, int));
551static struct filedescr *find_module Py_PROTO((char *, PyObject *,
552 char *, int, FILE **));
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000553static struct _frozen *find_frozen Py_PROTO((char *name));
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000554
555/* Load a package and return its module object WITH INCREMENTED
556 REFERENCE COUNT */
557
558static PyObject *
559load_package(name, pathname)
560 char *name;
561 char *pathname;
562{
563 PyObject *m, *d, *file, *path;
564 int err;
565 char buf[MAXPATHLEN+1];
566 FILE *fp = NULL;
567 struct filedescr *fdp;
568
569 m = PyImport_AddModule(name);
570 if (m == NULL)
571 return NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +0000572 if (Py_VerboseFlag)
573 fprintf(stderr, "import %s # directory %s\n",
574 name, pathname);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000575 d = PyModule_GetDict(m);
576 file = PyString_FromString(pathname);
577 if (file == NULL)
578 return NULL;
579 path = Py_BuildValue("[O]", file);
580 if (path == NULL) {
581 Py_DECREF(file);
582 return NULL;
583 }
584 err = PyDict_SetItemString(d, "__file__", file);
585 if (err == 0)
586 err = PyDict_SetItemString(d, "__path__", path);
587 if (err != 0) {
588 m = NULL;
589 goto cleanup;
590 }
591 buf[0] = '\0';
592 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
593 if (fdp == NULL) {
594 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
595 PyErr_Clear();
596 }
597 else
598 m = NULL;
599 goto cleanup;
600 }
601 m = load_module(name, fp, buf, fdp->type);
602 if (fp != NULL)
603 fclose(fp);
604 cleanup:
605 Py_XINCREF(m);
606 Py_XDECREF(path);
607 Py_XDECREF(file);
608 return m;
609}
610
611
612/* Helper to test for built-in module */
613
614static int
615is_builtin(name)
616 char *name;
617{
618 int i;
Guido van Rossum771c6c81997-10-31 18:37:24 +0000619 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
620 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
621 if (PyImport_Inittab[i].initfunc == NULL)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000622 return -1;
623 else
624 return 1;
625 }
626 }
627 return 0;
628}
629
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000630
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000631/* Search the path (default sys.path) for a module. Return the
632 corresponding filedescr struct, and (via return arguments) the
633 pathname and an open file. Return NULL if the module is not found. */
634
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000635#ifdef MS_COREDLL
636extern FILE *PyWin_FindRegisteredModule();
637#endif
638
Guido van Rossum197346f1997-10-31 18:38:52 +0000639static int find_init_module Py_PROTO((char *)); /* Forward */
640
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641static struct filedescr *
642find_module(name, path, buf, buflen, p_fp)
643 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 /* Output parameters: */
646 char *buf;
647 int buflen;
648 FILE **p_fp;
649{
650 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000651 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000652 FILE *fp = NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000653 struct stat statbuf;
654
655 if (path == NULL) {
656 if (is_builtin(name)) {
657 static struct filedescr fd = {"", "", C_BUILTIN};
658 return &fd;
659 }
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000660 if (find_frozen(name) != NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000661 static struct filedescr fd = {"", "", PY_FROZEN};
662 return &fd;
663 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000664
Guido van Rossumac279101996-08-22 23:10:58 +0000665#ifdef MS_COREDLL
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000666 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
667 if (fp != NULL) {
668 *p_fp = fp;
669 return fdp;
670 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000671#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000672 }
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000673
674
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 path = PySys_GetObject("path");
677 if (path == NULL || !PyList_Check(path)) {
678 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000679 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680 return NULL;
681 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 namelen = strlen(name);
684 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 PyObject *v = PyList_GetItem(path, i);
686 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 len = PyString_Size(v);
Guido van Rossumef3d02e1997-07-21 14:54:36 +0000689 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000692 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000694#ifdef macintosh
Guido van Rossum741689d1997-08-12 14:53:39 +0000695#ifdef INTERN_STRINGS
696 /*
697 ** Speedup: each sys.path item is interned, and
698 ** FindResourceModule remembers which items refer to
699 ** folders (so we don't have to bother trying to look
700 ** into them for resources).
701 */
702 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
703 v = PyList_GET_ITEM(path, i);
704#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000705 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 static struct filedescr resfiledescr =
707 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000708
709 return &resfiledescr;
710 }
711#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000712 if (len > 0 && buf[len-1] != SEP
713#ifdef ALTSEP
714 && buf[len-1] != ALTSEP
715#endif
716 )
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000718#ifdef IMPORT_8x3_NAMES
719 /* see if we are searching in directory dos_8x3 */
720 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
721 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000723 for (j = 0; (ch = name[j]) && j < 8; j++)
724 if (isupper(ch))
725 buf[len++] = tolower(ch);
726 else
727 buf[len++] = ch;
728 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000729 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000730#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000731 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000732 strcpy(buf+len, name);
733 len += namelen;
734 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000735#ifdef HAVE_STAT
736 if (stat(buf, &statbuf) == 0) {
737 static struct filedescr fd = {"", "", PKG_DIRECTORY};
Guido van Rossum197346f1997-10-31 18:38:52 +0000738 if (S_ISDIR(statbuf.st_mode)) {
739 if (find_init_module(buf))
740 return &fd;
741 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000742 }
743#else
744 /* XXX How are you going to test for directories? */
745#endif
Guido van Rossum9a61dc91997-10-08 15:25:08 +0000746#ifdef macintosh
747 fdp = PyMac_FindModuleExtension(buf, &len, name);
748 if (fdp)
749 fp = fopen(buf, fdp->mode);
750#else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 fprintf(stderr, "# trying %s\n", buf);
755 fp = fopen(buf, fdp->mode);
756 if (fp != NULL)
757 break;
758 }
Guido van Rossum741689d1997-08-12 14:53:39 +0000759#endif /* !macintosh */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 if (fp != NULL)
761 break;
762 }
763 if (fp == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000764 PyErr_Format(PyExc_ImportError,
765 "No module named %.200s", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766 return NULL;
767 }
768
769 *p_fp = fp;
770 return fdp;
771}
772
Guido van Rossum197346f1997-10-31 18:38:52 +0000773#ifdef HAVE_STAT
774/* Helper to look for __init__.py or __init__.py[co] in potential package */
775static int
776find_init_module(buf)
777 char *buf;
778{
779 int save_len = strlen(buf);
780 int i = save_len;
781 struct stat statbuf;
782
783 if (save_len + 13 >= MAXPATHLEN)
784 return 0;
785 buf[i++] = SEP;
786 strcpy(buf+i, "__init__.py");
787 if (stat(buf, &statbuf) == 0) {
788 buf[save_len] = '\0';
789 return 1;
790 }
791 i += strlen(buf+i);
792 if (Py_OptimizeFlag)
793 strcpy(buf+i, "o");
794 else
795 strcpy(buf+i, "c");
796 if (stat(buf, &statbuf) == 0) {
797 buf[save_len] = '\0';
798 return 1;
799 }
800 buf[save_len] = '\0';
801 return 0;
802}
803#endif /* HAVE_STAT */
804
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000806static int init_builtin Py_PROTO((char *)); /* Forward */
807
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000809 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000812load_module(name, fp, buf, type)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 char *name;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000814 FILE *fp;
815 char *buf;
816 int type;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817{
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000818 PyObject *modules;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 PyObject *m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000820 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000822 /* First check that there's an open file (if we need one) */
823 switch (type) {
824 case PY_SOURCE:
825 case PY_COMPILED:
826 if (fp == NULL) {
827 PyErr_Format(PyExc_ValueError,
828 "file object required for import (type code %d)",
829 type);
830 return NULL;
831 }
832 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000834 switch (type) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835
836 case PY_SOURCE:
837 m = load_source_module(name, buf, fp);
838 break;
839
840 case PY_COMPILED:
841 m = load_compiled_module(name, buf, fp);
842 break;
843
844 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846 break;
847
Jack Jansen9c96a921995-02-15 22:57:06 +0000848#ifdef macintosh
849 case PY_RESOURCE:
850 m = PyMac_LoadResourceModule(name, buf);
851 break;
852#endif
853
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000854 case PKG_DIRECTORY:
855 m = load_package(name, buf);
856 break;
857
858 case C_BUILTIN:
859 case PY_FROZEN:
860 if (type == C_BUILTIN)
861 err = init_builtin(name);
862 else
863 err = PyImport_ImportFrozenModule(name);
864 if (err < 0)
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000865 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000866 if (err == 0) {
867 PyErr_Format(PyExc_ImportError,
868 "Purported %s module %.200s not found",
869 type == C_BUILTIN ?
870 "builtin" : "frozen",
871 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000872 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000873 }
874 modules = PyImport_GetModuleDict();
875 m = PyDict_GetItemString(modules, name);
876 if (m == NULL) {
877 PyErr_Format(
878 PyExc_ImportError,
879 "%s module %.200s not properly initialized",
880 type == C_BUILTIN ?
881 "builtin" : "frozen",
882 name);
Guido van Rossuma86f77d1997-09-09 18:53:47 +0000883 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000884 }
885 Py_INCREF(m);
886 break;
887
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888 default:
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000889 PyErr_Format(PyExc_ImportError,
890 "Don't know how to import %.200s (type code %d)",
891 name, type);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000892 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893
894 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895
896 return m;
897}
898
899
900/* Initialize a built-in module.
901 Return 1 for succes, 0 if the module is not found, and -1 with
902 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000903
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000904static int
905init_builtin(name)
906 char *name;
907{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000908 struct _inittab *p;
909 PyObject *mod;
910
911 if ((mod = _PyImport_FindExtension(name, name)) != NULL)
912 return 1;
913
Guido van Rossum771c6c81997-10-31 18:37:24 +0000914 for (p = PyImport_Inittab; p->name != NULL; p++) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000915 if (strcmp(name, p->name) == 0) {
916 if (p->initfunc == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000917 PyErr_Format(PyExc_ImportError,
918 "Cannot re-init internal module %.200s",
919 name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000920 return -1;
921 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 if (Py_VerboseFlag)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000923 fprintf(stderr, "import %s # builtin\n", name);
924 (*p->initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 return -1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000927 if (_PyImport_FixupExtension(name, name) == NULL)
928 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000929 return 1;
930 }
931 }
932 return 0;
933}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000934
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000935
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000936/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000938static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000939find_frozen(name)
940 char *name;
941{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000942 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000943
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000945 if (p->name == NULL)
946 return NULL;
947 if (strcmp(p->name, name) == 0)
948 break;
949 }
950 return p;
951}
952
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000954get_frozen_object(name)
955 char *name;
956{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000957 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000958
959 if (p == NULL) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000960 PyErr_Format(PyExc_ImportError,
961 "No such frozen object named %.200s",
962 name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000963 return NULL;
964 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000966}
967
968/* Initialize a frozen module.
969 Return 1 for succes, 0 if the module is not found, and -1 with
970 an exception set if the initialization failed.
971 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000972
973int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000975 char *name;
976{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000977 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *co;
979 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000980
981 if (p == NULL)
982 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000984 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000986 if (co == NULL)
987 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 if (!PyCode_Check(co)) {
989 Py_DECREF(co);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000990 PyErr_Format(PyExc_TypeError,
991 "frozen object %.200s is not a code object",
992 name);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000993 return -1;
994 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 m = PyImport_ExecCodeModule(name, co);
996 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000997 if (m == NULL)
998 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001000 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001001}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001002
1003
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001005 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001006
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007PyObject *
1008PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001010{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001011 static PyObject *fromlist = NULL;
1012 if (fromlist == NULL && strchr(name, '.') != NULL) {
1013 fromlist = Py_BuildValue("[s]", "*");
1014 if (fromlist == NULL)
1015 return NULL;
1016 }
1017 return PyImport_ImportModuleEx(name, NULL, NULL, fromlist);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001018}
1019
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001020/* Forward declarations for helper routines */
1021static PyObject *get_parent Py_PROTO((PyObject *globals,
1022 char *buf, int *p_buflen));
1023static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
1024 char **p_name, char *buf, int *p_buflen));
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001025static int mark_miss Py_PROTO((char *name));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001026static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
Guido van Rossum9905ef91997-09-08 16:07:11 +00001027 char *buf, int buflen, int recursive));
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001028static PyObject * import_submodule Py_PROTO((PyObject *mod,
1029 char *name, char *fullname));
1030
1031/* The Magnum Opus of dotted-name import :-) */
1032
1033/* XXX TO DO:
1034 - Remember misses in package directories so package submodules
1035 that all import the same toplevel module don't keep hitting on the
1036 package directory first
1037*/
1038
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001039PyObject *
1040PyImport_ImportModuleEx(name, globals, locals, fromlist)
1041 char *name;
1042 PyObject *globals;
1043 PyObject *locals;
1044 PyObject *fromlist;
1045{
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001046 char buf[MAXPATHLEN+1];
1047 int buflen = 0;
1048 PyObject *parent, *head, *next, *tail;
1049
1050 parent = get_parent(globals, buf, &buflen);
1051 if (parent == NULL)
1052 return NULL;
1053
1054 head = load_next(parent, Py_None, &name, buf, &buflen);
1055 if (head == NULL)
1056 return NULL;
1057
1058 tail = head;
1059 Py_INCREF(tail);
1060 while (name) {
1061 next = load_next(tail, tail, &name, buf, &buflen);
1062 Py_DECREF(tail);
1063 if (next == NULL) {
1064 Py_DECREF(head);
1065 return NULL;
1066 }
1067 tail = next;
1068 }
1069
1070 if (fromlist != NULL) {
1071 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
1072 fromlist = NULL;
1073 }
1074
1075 if (fromlist == NULL) {
1076 Py_DECREF(tail);
1077 return head;
1078 }
1079
1080 Py_DECREF(head);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001081 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001082 Py_DECREF(tail);
1083 return NULL;
1084 }
1085
1086 return tail;
1087}
1088
1089static PyObject *
1090get_parent(globals, buf, p_buflen)
1091 PyObject *globals;
1092 char *buf;
1093 int *p_buflen;
1094{
1095 static PyObject *namestr = NULL;
1096 static PyObject *pathstr = NULL;
1097 PyObject *modname, *modpath, *modules, *parent;
1098
1099 if (globals == NULL || !PyDict_Check(globals))
1100 return Py_None;
1101
1102 if (namestr == NULL) {
1103 namestr = PyString_InternFromString("__name__");
1104 if (namestr == NULL)
1105 return NULL;
1106 }
1107 if (pathstr == NULL) {
1108 pathstr = PyString_InternFromString("__path__");
1109 if (pathstr == NULL)
1110 return NULL;
1111 }
1112
1113 *buf = '\0';
1114 *p_buflen = 0;
1115 modname = PyDict_GetItem(globals, namestr);
1116 if (modname == NULL || !PyString_Check(modname))
1117 return Py_None;
1118
1119 modpath = PyDict_GetItem(globals, pathstr);
1120 if (modpath != NULL) {
1121 int len = PyString_GET_SIZE(modname);
1122 if (len > MAXPATHLEN) {
1123 PyErr_SetString(PyExc_ValueError,
1124 "Module name too long");
1125 return NULL;
1126 }
1127 strcpy(buf, PyString_AS_STRING(modname));
1128 *p_buflen = len;
1129 }
1130 else {
1131 char *start = PyString_AS_STRING(modname);
1132 char *lastdot = strrchr(start, '.');
1133 int len;
1134 if (lastdot == NULL)
1135 return Py_None;
1136 len = lastdot - start;
1137 if (len >= MAXPATHLEN) {
1138 PyErr_SetString(PyExc_ValueError,
1139 "Module name too long");
1140 return NULL;
1141 }
1142 strncpy(buf, start, len);
1143 buf[len] = '\0';
1144 *p_buflen = len;
1145 }
1146
1147 modules = PyImport_GetModuleDict();
1148 parent = PyDict_GetItemString(modules, buf);
1149 if (parent == NULL)
1150 parent = Py_None;
1151 return parent;
1152 /* We expect, but can't guarantee, if parent != None, that:
1153 - parent.__name__ == buf
1154 - parent.__dict__ is globals
1155 If this is violated... Who cares? */
1156}
1157
1158static PyObject *
1159load_next(mod, altmod, p_name, buf, p_buflen)
1160 PyObject *mod;
1161 PyObject *altmod; /* Either None or same as mod */
1162 char **p_name;
1163 char *buf;
1164 int *p_buflen;
1165{
1166 char *name = *p_name;
1167 char *dot = strchr(name, '.');
1168 int len;
1169 char *p;
1170 PyObject *result;
1171
1172 if (dot == NULL) {
1173 *p_name = NULL;
1174 len = strlen(name);
1175 }
1176 else {
1177 *p_name = dot+1;
1178 len = dot-name;
1179 }
1180
1181 p = buf + *p_buflen;
1182 if (p != buf)
1183 *p++ = '.';
1184 if (p+len-buf >= MAXPATHLEN) {
1185 PyErr_SetString(PyExc_ValueError,
1186 "Module name too long");
1187 return NULL;
1188 }
1189 strncpy(p, name, len);
1190 p[len] = '\0';
1191 *p_buflen = p+len-buf;
1192
1193 result = import_submodule(mod, p, buf);
1194 if (result == Py_None && altmod != mod) {
1195 Py_DECREF(result);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001196 /* Here, altmod must be None and mod must not be None */
Guido van Rossum0c819451997-09-07 06:16:57 +00001197 result = import_submodule(altmod, p, p);
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001198 if (result != NULL && result != Py_None) {
1199 if (mark_miss(buf) != 0) {
1200 Py_DECREF(result);
1201 return NULL;
1202 }
1203 strncpy(buf, name, len);
1204 buf[len] = '\0';
1205 *p_buflen = len;
1206 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001207 }
1208 if (result == NULL)
1209 return NULL;
1210
1211 if (result == Py_None) {
1212 Py_DECREF(result);
1213 PyErr_Format(PyExc_ImportError,
1214 "No module named %.200s", name);
1215 return NULL;
1216 }
1217
1218 return result;
1219}
1220
1221static int
Guido van Rossumf5f5fdb1997-09-06 20:29:52 +00001222mark_miss(name)
1223 char *name;
1224{
1225 PyObject *modules = PyImport_GetModuleDict();
1226 return PyDict_SetItemString(modules, name, Py_None);
1227}
1228
1229static int
Guido van Rossum9905ef91997-09-08 16:07:11 +00001230ensure_fromlist(mod, fromlist, buf, buflen, recursive)
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001231 PyObject *mod;
1232 PyObject *fromlist;
1233 char *buf;
1234 int buflen;
Guido van Rossum9905ef91997-09-08 16:07:11 +00001235 int recursive;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001236{
1237 int i;
1238
1239 if (!PyObject_HasAttrString(mod, "__path__"))
1240 return 1;
1241
1242 for (i = 0; ; i++) {
1243 PyObject *item = PySequence_GetItem(fromlist, i);
1244 int hasit;
1245 if (item == NULL) {
1246 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
1247 PyErr_Clear();
1248 return 1;
1249 }
1250 return 0;
1251 }
1252 if (!PyString_Check(item)) {
1253 PyErr_SetString(PyExc_TypeError,
1254 "Item in ``from list'' not a string");
1255 Py_DECREF(item);
1256 return 0;
1257 }
1258 if (PyString_AS_STRING(item)[0] == '*') {
Guido van Rossum9905ef91997-09-08 16:07:11 +00001259 PyObject *all;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001260 Py_DECREF(item);
Guido van Rossum9905ef91997-09-08 16:07:11 +00001261 /* See if the package defines __all__ */
1262 if (recursive)
1263 continue; /* Avoid endless recursion */
1264 all = PyObject_GetAttrString(mod, "__all__");
1265 if (all == NULL)
1266 PyErr_Clear();
1267 else {
1268 if (!ensure_fromlist(mod, all, buf, buflen, 1))
1269 return 0;
1270 Py_DECREF(all);
1271 }
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001272 continue;
1273 }
1274 hasit = PyObject_HasAttr(mod, item);
1275 if (!hasit) {
1276 char *subname = PyString_AS_STRING(item);
1277 PyObject *submod;
1278 char *p;
1279 if (buflen + strlen(subname) >= MAXPATHLEN) {
1280 PyErr_SetString(PyExc_ValueError,
1281 "Module name too long");
1282 Py_DECREF(item);
1283 return 0;
1284 }
1285 p = buf + buflen;
1286 *p++ = '.';
1287 strcpy(p, subname);
1288 submod = import_submodule(mod, subname, buf);
1289 Py_XDECREF(submod);
1290 if (submod == NULL) {
1291 Py_DECREF(item);
1292 return 0;
1293 }
1294 }
1295 Py_DECREF(item);
1296 }
1297
Guido van Rossuma7f2e811997-10-03 15:33:32 +00001298 /* NOTREACHED */
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001299}
1300
1301static PyObject *
1302import_submodule(mod, subname, fullname)
1303 PyObject *mod; /* May be None */
1304 char *subname;
1305 char *fullname;
1306{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001307 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001309
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001310 /* Require:
1311 if mod == None: subname == fullname
1312 else: mod.__name__ + "." + subname == fullname
1313 */
1314
1315 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001317 }
1318 else {
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001319 PyObject *path;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001320 char buf[MAXPATHLEN+1];
1321 struct filedescr *fdp;
1322 FILE *fp = NULL;
1323
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001324 path = PyObject_GetAttrString(mod, "__path__");
1325 if (path == NULL)
1326 PyErr_Clear();
1327
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001328 buf[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001329 fdp = find_module(subname, path,
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001330 buf, MAXPATHLEN+1, &fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001331 if (fdp == NULL) {
1332 if (!PyErr_ExceptionMatches(PyExc_ImportError))
1333 return NULL;
1334 PyErr_Clear();
1335 Py_INCREF(Py_None);
1336 return Py_None;
1337 }
1338 m = load_module(fullname, fp, buf, fdp->type);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001339 if (fp)
1340 fclose(fp);
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001341 if (m != NULL && mod != Py_None) {
1342 if (PyObject_SetAttrString(mod, subname, m) < 0) {
1343 Py_DECREF(m);
1344 m = NULL;
1345 }
1346 }
Guido van Rossum74e6a111994-08-29 12:54:38 +00001347 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348
1349 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +00001350}
1351
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001352
1353/* Re-import a module of any kind and return its module object, WITH
1354 INCREMENTED REFERENCE COUNT */
1355
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356PyObject *
1357PyImport_ReloadModule(m)
1358 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001359{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001360 PyObject *modules = PyImport_GetModuleDict();
Guido van Rossum222ef561997-09-06 19:41:09 +00001361 PyObject *path = NULL;
1362 char *name, *subname;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001363 char buf[MAXPATHLEN+1];
1364 struct filedescr *fdp;
1365 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367 if (m == NULL || !PyModule_Check(m)) {
1368 PyErr_SetString(PyExc_TypeError,
1369 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 return NULL;
1371 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001373 if (name == NULL)
1374 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001375 if (m != PyDict_GetItemString(modules, name)) {
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001376 PyErr_Format(PyExc_ImportError,
1377 "reload(): module %.200s not in sys.modules",
1378 name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379 return NULL;
1380 }
Guido van Rossum222ef561997-09-06 19:41:09 +00001381 subname = strrchr(name, '.');
1382 if (subname == NULL)
1383 subname = name;
1384 else {
1385 PyObject *parentname, *parent;
1386 parentname = PyString_FromStringAndSize(name, (subname-name));
1387 if (parentname == NULL)
1388 return NULL;
1389 parent = PyDict_GetItem(modules, parentname);
1390 if (parent == NULL) {
1391 PyErr_Format(PyExc_ImportError,
1392 "reload(): parent %.200s not in sys.modules",
1393 name);
1394 return NULL;
1395 }
1396 subname++;
1397 path = PyObject_GetAttrString(parent, "__path__");
1398 if (path == NULL)
1399 PyErr_Clear();
1400 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001401 buf[0] = '\0';
Guido van Rossum222ef561997-09-06 19:41:09 +00001402 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
1403 Py_XDECREF(path);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001404 if (fdp == NULL)
1405 return NULL;
1406 m = load_module(name, fp, buf, fdp->type);
1407 if (fp)
1408 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 return m;
1410}
1411
1412
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001413/* Higher-level import emulator which emulates the "import" statement
1414 more accurately -- it invokes the __import__() function from the
1415 builtins of the current globals. This means that the import is
1416 done using whatever import hooks are installed in the current
1417 environment, e.g. by "ni" or "rexec". */
1418
1419PyObject *
1420PyImport_Import(module_name)
1421 PyObject *module_name;
1422{
1423 static PyObject *silly_list = NULL;
1424 static PyObject *builtins_str = NULL;
1425 static PyObject *import_str = NULL;
1426 static PyObject *standard_builtins = NULL;
1427 PyObject *globals = NULL;
1428 PyObject *import = NULL;
1429 PyObject *builtins = NULL;
1430 PyObject *r = NULL;
1431
1432 /* Initialize constant string objects */
1433 if (silly_list == NULL) {
1434 import_str = PyString_InternFromString("__import__");
1435 if (import_str == NULL)
1436 return NULL;
1437 builtins_str = PyString_InternFromString("__builtins__");
1438 if (builtins_str == NULL)
1439 return NULL;
1440 silly_list = Py_BuildValue("[s]", "__doc__");
1441 if (silly_list == NULL)
1442 return NULL;
1443 }
1444
1445 /* Get the builtins from current globals */
1446 globals = PyEval_GetGlobals();
1447 if(globals != NULL) {
1448 builtins = PyObject_GetItem(globals, builtins_str);
1449 if (builtins == NULL)
1450 goto err;
1451 }
1452 else {
1453 /* No globals -- use standard builtins, and fake globals */
1454 PyErr_Clear();
1455
1456 if (standard_builtins == NULL) {
1457 standard_builtins =
1458 PyImport_ImportModule("__builtin__");
1459 if (standard_builtins == NULL)
1460 return NULL;
1461 }
1462
1463 builtins = standard_builtins;
1464 Py_INCREF(builtins);
1465 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1466 if (globals == NULL)
1467 goto err;
1468 }
1469
1470 /* Get the __import__ function from the builtins */
1471 if (PyDict_Check(builtins))
1472 import=PyObject_GetItem(builtins, import_str);
1473 else
1474 import=PyObject_GetAttr(builtins, import_str);
1475 if (import == NULL)
1476 goto err;
1477
1478 /* Call the _import__ function with the proper argument list */
1479 r = PyObject_CallFunction(import, "OOOO",
1480 module_name, globals, globals, silly_list);
1481
1482 err:
1483 Py_XDECREF(globals);
1484 Py_XDECREF(builtins);
1485 Py_XDECREF(import);
1486
1487 return r;
1488}
1489
1490
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001491/* Module 'imp' provides Python access to the primitives used for
1492 importing modules.
1493*/
1494
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001496imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001497 PyObject *self;
1498 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499{
1500 char buf[4];
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +00001504 buf[0] = (char) ((MAGIC >> 0) & 0xff);
1505 buf[1] = (char) ((MAGIC >> 8) & 0xff);
1506 buf[2] = (char) ((MAGIC >> 16) & 0xff);
1507 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510}
1511
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001513imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 PyObject *self;
1515 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001516{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001517 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001518 struct filedescr *fdp;
1519
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 if (list == NULL)
1524 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
1526 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001527 fdp->suffix, fdp->mode, fdp->type);
1528 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530 return NULL;
1531 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001532 if (PyList_Append(list, item) < 0) {
1533 Py_DECREF(list);
1534 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001535 return NULL;
1536 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001538 }
1539 return list;
1540}
1541
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001543call_find_module(name, path)
1544 char *name;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001545 PyObject *path; /* list or None or NULL */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001546{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 extern int fclose Py_PROTO((FILE *));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001549 struct filedescr *fdp;
1550 char pathname[MAXPATHLEN+1];
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001551 FILE *fp = NULL;
1552
1553 pathname[0] = '\0';
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001554 if (path == Py_None)
1555 path = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001556 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
1557 if (fdp == NULL)
1558 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001559 if (fp != NULL) {
1560 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
1561 if (fob == NULL) {
1562 fclose(fp);
1563 return NULL;
1564 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001565 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001566 else {
1567 fob = Py_None;
1568 Py_INCREF(fob);
1569 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001571 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001573 return ret;
1574}
1575
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001577imp_find_module(self, args)
1578 PyObject *self;
1579 PyObject *args;
1580{
1581 char *name;
1582 PyObject *path = NULL;
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001583 if (!PyArg_ParseTuple(args, "s|O", &name, &path))
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001584 return NULL;
1585 return call_find_module(name, path);
1586}
1587
1588static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001589imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 PyObject *self;
1591 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001592{
1593 char *name;
1594 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 PyObject *m;
1596 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001597 return NULL;
1598 ret = init_builtin(name);
1599 if (ret < 0)
1600 return NULL;
1601 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 Py_INCREF(Py_None);
1603 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001604 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605 m = PyImport_AddModule(name);
1606 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001607 return m;
1608}
1609
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612 PyObject *self;
1613 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001614{
1615 char *name;
1616 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 PyObject *m;
1618 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001621 if (ret < 0)
1622 return NULL;
1623 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 Py_INCREF(Py_None);
1625 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001626 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627 m = PyImport_AddModule(name);
1628 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001629 return m;
1630}
1631
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001633imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 PyObject *self;
1635 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001636{
1637 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +00001638
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001640 return NULL;
1641 return get_frozen_object(name);
1642}
1643
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001645imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 PyObject *self;
1647 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001649 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001652 return PyInt_FromLong(is_builtin(name));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001653}
1654
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 PyObject *self;
1658 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001659{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001660 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001662 return NULL;
Guido van Rossuma86f77d1997-09-09 18:53:47 +00001663 return PyInt_FromLong(find_frozen(name) != NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001664}
1665
1666static FILE *
1667get_file(pathname, fob, mode)
1668 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 char *mode;
1671{
1672 FILE *fp;
1673 if (fob == NULL) {
1674 fp = fopen(pathname, mode);
1675 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001677 }
1678 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001680 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001681 PyErr_SetString(PyExc_ValueError,
1682 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001683 }
1684 return fp;
1685}
1686
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001688imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 PyObject *self;
1690 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001691{
1692 char *name;
1693 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 PyObject *fob = NULL;
1695 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001696 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001697 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001699 return NULL;
1700 fp = get_file(pathname, fob, "rb");
1701 if (fp == NULL)
1702 return NULL;
1703 m = load_compiled_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001704 if (fob == NULL)
1705 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001706 return m;
1707}
1708
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001710imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001711 PyObject *self;
1712 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001713{
1714 char *name;
1715 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *fob = NULL;
1717 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +00001718 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
1720 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001722 if (fob) {
Guido van Rossum7faeab31995-07-07 22:50:36 +00001723 fp = get_file(pathname, fob, "r");
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001724 if (fp == NULL)
1725 return NULL;
1726 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +00001728 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729}
1730
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733 PyObject *self;
1734 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001735{
1736 char *name;
1737 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 PyObject *fob = NULL;
1739 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001740 FILE *fp;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001741 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743 return NULL;
1744 fp = get_file(pathname, fob, "r");
1745 if (fp == NULL)
1746 return NULL;
1747 m = load_source_module(name, pathname, fp);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001748 if (fob == NULL)
1749 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001750 return m;
1751}
1752
Jack Jansen9c96a921995-02-15 22:57:06 +00001753#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +00001755imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 PyObject *self;
1757 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +00001758{
1759 char *name;
1760 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001762
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001764 return NULL;
1765 m = PyMac_LoadResourceModule(name, pathname);
1766 return m;
1767}
1768#endif /* macintosh */
1769
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770static PyObject *
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001771imp_load_module(self, args)
1772 PyObject *self;
1773 PyObject *args;
1774{
1775 char *name;
1776 PyObject *fob;
1777 char *pathname;
1778 char *suffix; /* Unused */
1779 char *mode;
1780 int type;
1781 FILE *fp;
1782
1783 if (!PyArg_ParseTuple(args, "sOs(ssi)",
1784 &name, &fob, &pathname,
1785 &suffix, &mode, &type))
1786 return NULL;
1787 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
1788 PyErr_Format(PyExc_ValueError,
1789 "invalid file open mode %.200s", mode);
1790 return NULL;
1791 }
1792 if (fob == Py_None)
1793 fp = NULL;
1794 else {
1795 if (!PyFile_Check(fob)) {
1796 PyErr_SetString(PyExc_ValueError,
1797 "load_module arg#2 should be a file or None");
1798 return NULL;
1799 }
1800 fp = get_file(pathname, fob, mode);
1801 if (fp == NULL)
1802 return NULL;
1803 }
1804 return load_module(name, fp, pathname, type);
1805}
1806
1807static PyObject *
1808imp_load_package(self, args)
1809 PyObject *self;
1810 PyObject *args;
1811{
1812 char *name;
1813 char *pathname;
1814 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
1815 return NULL;
1816 return load_package(name, pathname);
1817}
1818
1819static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyObject *self;
1822 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823{
1824 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001826 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001828}
1829
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001830/* Doc strings */
1831
1832static char doc_imp[] = "\
1833This module provides the components needed to build your own\n\
1834__import__ function. Undocumented functions are obsolete.\n\
1835";
1836
1837static char doc_find_module[] = "\
1838find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
1839Search for a module. If path is omitted or None, search for a\n\
1840built-in, frozen or special module and continue search in sys.path.\n\
1841The module name cannot contain '.'; to search for a submodule of a\n\
1842package, pass the submodule name and the package's __path__.\
1843";
1844
1845static char doc_load_module[] = "\
1846load_module(name, file, filename, (suffix, mode, type)) -> module\n\
1847Load a module, given information returned by find_module().\n\
1848The module name must include the full package name, if any.\
1849";
1850
1851static char doc_get_magic[] = "\
1852get_magic() -> string\n\
1853Return the magic number for .pyc or .pyo files.\
1854";
1855
1856static char doc_get_suffixes[] = "\
1857get_suffixes() -> [(suffix, mode, type), ...]\n\
1858Return a list of (suffix, mode, type) tuples describing the files\n\
1859that find_module() looks for.\
1860";
1861
1862static char doc_new_module[] = "\
1863new_module(name) -> module\n\
1864Create a new module. Do not enter it in sys.modules.\n\
1865The module name must include the full package name, if any.\
1866";
1867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868static PyMethodDef imp_methods[] = {
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001869 {"find_module", imp_find_module, 1, doc_find_module},
1870 {"get_magic", imp_get_magic, 1, doc_get_magic},
1871 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
1872 {"load_module", imp_load_module, 1, doc_load_module},
1873 {"new_module", imp_new_module, 1, doc_new_module},
1874 /* The rest are obsolete */
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001875 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876 {"init_builtin", imp_init_builtin, 1},
1877 {"init_frozen", imp_init_frozen, 1},
1878 {"is_builtin", imp_is_builtin, 1},
1879 {"is_frozen", imp_is_frozen, 1},
1880 {"load_compiled", imp_load_compiled, 1},
1881 {"load_dynamic", imp_load_dynamic, 1},
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001882 {"load_package", imp_load_package, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001883#ifdef macintosh
1884 {"load_resource", imp_load_resource, 1},
1885#endif
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001886 {"load_source", imp_load_source, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887 {NULL, NULL} /* sentinel */
1888};
1889
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001890int
1891setint(d, name, value)
1892 PyObject *d;
1893 char *name;
1894 int value;
1895{
1896 PyObject *v;
1897 int err;
1898
1899 v = PyInt_FromLong((long)value);
1900 err = PyDict_SetItemString(d, name, v);
1901 Py_XDECREF(v);
1902 return err;
1903}
1904
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001905void
1906initimp()
1907{
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001908 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001909
Guido van Rossum0207e6d1997-09-09 22:04:42 +00001910 m = Py_InitModule4("imp", imp_methods, doc_imp,
1911 NULL, PYTHON_API_VERSION);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001914 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
1915 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
1916 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
1917 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
1918 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
1919 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
1920 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
1921 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001922
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001923 failure:
1924 ;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925}