blob: ea6440a2c90a101089065ff5e19423a7d85980cc [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"
38#include "graminit.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000040#include "marshal.h"
41#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000042#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000043#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000045#ifdef macintosh
Jack Jansen614cf811995-07-28 11:28:14 +000046/* 'argument' is a grammar symbol, but also used in some mac header files */
47#undef argument
Jack Jansen9c96a921995-02-15 22:57:06 +000048#include "macglue.h"
49#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000050
Guido van Rossum80bb9651996-12-05 23:27:02 +000051#ifdef HAVE_UNISTD_H
52#include <unistd.h>
53#endif
54
Guido van Rossum79f25d91997-04-29 20:08:16 +000055extern long PyOS_GetLastModificationTime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000056
Guido van Rossum6c849691994-09-26 15:47:17 +000057/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000058/* Change for each incompatible change */
59/* The value of CR and LF is incorporated so if you ever read or write
60 a .pyc file in text mode the magic number will be wrong; also, the
61 Apple MPW compiler swaps their values, botching string constants */
62/* XXX Perhaps the magic number should be frozen and a version field
63 added to the .pyc file header? */
Guido van Rossumdd5db431997-01-17 21:06:11 +000064/* New way to come up with the magic number: (YEAR-1995), MONTH, DAY */
Guido van Rossum99d18251997-01-24 03:44:53 +000065#define MAGIC (20121 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000066
Guido van Rossum79f25d91997-04-29 20:08:16 +000067PyObject *import_modules; /* This becomes sys.modules */
Guido van Rossum3f5da241990-12-20 15:06:42 +000068
Guido van Rossum66f1fa81991-04-03 19:03:52 +000069
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071
72void
Guido van Rossum79f25d91997-04-29 20:08:16 +000073PyImport_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000075 if (import_modules != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 Py_FatalError("duplicate initimport() call");
77 if ((import_modules = PyDict_New()) == NULL)
78 Py_FatalError("no mem for dictionary of modules");
Guido van Rossum0824f631997-03-11 18:37:35 +000079 if (Py_OptimizeFlag) {
80 /* Replace ".pyc" with ".pyo" in import_filetab */
81 struct filedescr *p;
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 for (p = _PyImport_Filetab; p->suffix != NULL; p++) {
Guido van Rossum0824f631997-03-11 18:37:35 +000083 if (strcmp(p->suffix, ".pyc") == 0)
84 p->suffix = ".pyo";
85 }
86 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087}
88
Guido van Rossum3f5da241990-12-20 15:06:42 +000089
Guido van Rossum1ae940a1995-01-02 19:04:15 +000090/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +000091
Guido van Rossum3f5da241990-12-20 15:06:42 +000092void
Guido van Rossum79f25d91997-04-29 20:08:16 +000093PyImport_Cleanup()
Guido van Rossum3f5da241990-12-20 15:06:42 +000094{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 if (import_modules != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000096 PyObject *tmp = import_modules;
Guido van Rossum0de81bf1995-01-26 00:41:28 +000097 import_modules = NULL;
98 /* This deletes all modules from sys.modules.
Guido van Rossum79f25d91997-04-29 20:08:16 +000099 When a module is deallocated, it in turn clears its
100 dictionary, thus hopefully breaking any circular
101 references between modules and between a module's
102 dictionary and its functions. Note that "import"
103 will fail while we are cleaning up. */
104 PyDict_Clear(tmp);
105 Py_DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000106 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000107}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000108
109
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000110/* Helper for pythonrun.c -- return magic number */
111
112long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113PyImport_GetMagicNumber()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000114{
115 return MAGIC;
116}
117
118
119/* Helper for sysmodule.c -- return modules dictionary */
120
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121PyObject *
122PyImport_GetModuleDict()
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000123{
124 return import_modules;
125}
126
127
128/* Get the module object corresponding to a module name.
129 First check the modules dictionary if there's one there,
130 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000131 Because the former action is most common, THIS DOES NOT RETURN A
132 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134PyObject *
135PyImport_AddModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000136 char *name;
137{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000139
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000140 if (import_modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000141 PyErr_SetString(PyExc_SystemError,
142 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000143 return NULL;
144 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 if ((m = PyDict_GetItemString(import_modules, name)) != NULL &&
146 PyModule_Check(m))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147 return m;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 m = PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149 if (m == NULL)
150 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 if (PyDict_SetItemString(import_modules, name, m) != 0) {
152 Py_DECREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153 return NULL;
154 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000155 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000156
157 return m;
158}
159
160
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000161/* Execute a code object in a module and return the module object
162 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000163
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164PyObject *
165PyImport_ExecCodeModule(name, co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000166 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000168{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 m = PyImport_AddModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000172 if (m == NULL)
173 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 d = PyModule_GetDict(m);
175 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
176 if (PyDict_SetItemString(d, "__builtins__",
177 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000178 return NULL;
179 }
Guido van Rossum9c9a07c1996-05-16 20:43:40 +0000180 /* Remember the filename as the __file__ attribute */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 if (PyDict_SetItemString(d, "__file__",
182 ((PyCodeObject *)co)->co_filename) != 0)
183 PyErr_Clear(); /* Not important enough to report */
184 v = PyEval_EvalCode((PyCodeObject *)co, d, d); /* XXX owner? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000185 if (v == NULL)
186 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000187 Py_DECREF(v);
188 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189
190 return m;
191}
192
193
194/* Given a pathname for a Python source file, fill a buffer with the
195 pathname for the corresponding compiled file. Return the pathname
196 for the compiled file, or NULL if there's no space in the buffer.
197 Doesn't set an exception. */
198
199static char *
200make_compiled_pathname(pathname, buf, buflen)
201 char *pathname;
202 char *buf;
203 int buflen;
204{
205 int len;
206
207 len = strlen(pathname);
208 if (len+2 > buflen)
209 return NULL;
210 strcpy(buf, pathname);
Guido van Rossum0824f631997-03-11 18:37:35 +0000211 strcpy(buf+len, Py_OptimizeFlag ? "o" : "c");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000212
213 return buf;
214}
215
216
217/* Given a pathname for a Python source file, its time of last
218 modification, and a pathname for a compiled file, check whether the
219 compiled file represents the same version of the source. If so,
220 return a FILE pointer for the compiled file, positioned just after
221 the header; if not, return NULL.
222 Doesn't set an exception. */
223
224static FILE *
225check_compiled_module(pathname, mtime, cpathname)
226 char *pathname;
227 long mtime;
228 char *cpathname;
229{
230 FILE *fp;
231 long magic;
232 long pyc_mtime;
233
234 fp = fopen(cpathname, "rb");
235 if (fp == NULL)
236 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000238 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000240 fprintf(stderr, "# %s has bad magic\n", cpathname);
241 fclose(fp);
242 return NULL;
243 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000245 if (pyc_mtime != mtime) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000247 fprintf(stderr, "# %s has bad mtime\n", cpathname);
248 fclose(fp);
249 return NULL;
250 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
253 return fp;
254}
255
256
257/* Read a code object from a file and check it for validity */
258
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000260read_compiled_module(fp)
261 FILE *fp;
262{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 PyObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000264
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 co = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000266 /* Ugly: rd_object() may return NULL with or without error */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 if (co == NULL || !PyCode_Check(co)) {
268 if (!PyErr_Occurred())
269 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270 "Non-code object in .pyc file");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 Py_XDECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272 return NULL;
273 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 return (PyCodeObject *)co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000275}
276
277
278/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000279 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282load_compiled_module(name, cpathname, fp)
283 char *name;
284 char *cpathname;
285 FILE *fp;
286{
287 long magic;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 PyCodeObject *co;
289 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 magic = PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000292 if (magic != MAGIC) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 PyErr_SetString(PyExc_ImportError,
294 "Bad magic number in .pyc file");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295 return NULL;
296 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 (void) PyMarshal_ReadLongFromFile(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000298 co = read_compiled_module(fp);
299 if (co == NULL)
300 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302 fprintf(stderr, "import %s # precompiled from %s\n",
303 name, cpathname);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 m = PyImport_ExecCodeModule(name, (PyObject *)co);
305 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306
307 return m;
308}
309
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310/* Parse a source file and return the corresponding code object */
311
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312static PyCodeObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000313parse_source_module(pathname, fp)
314 char *pathname;
315 FILE *fp;
316{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318 node *n;
319
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 n = PyParser_SimpleParseFile(fp, pathname, file_input);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000321 if (n == NULL)
322 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 co = PyNode_Compile(n, pathname);
324 PyNode_Free(n);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000325
326 return co;
327}
328
329
330/* Write a compiled module to a file, placing the time of last
331 modification of its source into the header.
332 Errors are ignored, if a write error occurs an attempt is made to
333 remove the file. */
334
335static void
336write_compiled_module(co, cpathname, mtime)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyCodeObject *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000338 char *cpathname;
339 long mtime;
340{
341 FILE *fp;
342
343 fp = fopen(cpathname, "wb");
344 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000346 fprintf(stderr,
347 "# can't create %s\n", cpathname);
348 return;
349 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 PyMarshal_WriteLongToFile(MAGIC, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351 /* First write a 0 for mtime */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyMarshal_WriteLongToFile(0L, fp);
353 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000354 if (ferror(fp)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356 fprintf(stderr, "# can't write %s\n", cpathname);
357 /* Don't keep partial file */
358 fclose(fp);
359 (void) unlink(cpathname);
360 return;
361 }
362 /* Now write the true mtime */
363 fseek(fp, 4L, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 PyMarshal_WriteLongToFile(mtime, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000365 fflush(fp);
366 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368 fprintf(stderr, "# wrote %s\n", cpathname);
369#ifdef macintosh
Guido van Rossumbe1a6e21996-02-21 15:29:20 +0000370 setfiletype(cpathname, 'Pyth', 'PYC ');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371#endif
372}
373
374
375/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000376 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
377 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380load_source_module(name, pathname, fp)
381 char *name;
382 char *pathname;
383 FILE *fp;
384{
385 long mtime;
386 FILE *fpc;
387 char buf[MAXPATHLEN+1];
388 char *cpathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyCodeObject *co;
390 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 mtime = PyOS_GetLastModificationTime(pathname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
394 if (cpathname != NULL &&
395 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
396 co = read_compiled_module(fpc);
397 fclose(fpc);
398 if (co == NULL)
399 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 fprintf(stderr, "import %s # precompiled from %s\n",
402 name, cpathname);
403 }
404 else {
405 co = parse_source_module(pathname, fp);
406 if (co == NULL)
407 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000408 if (Py_VerboseFlag)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 fprintf(stderr, "import %s # from %s\n",
410 name, pathname);
411 write_compiled_module(co, cpathname, mtime);
412 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 m = PyImport_ExecCodeModule(name, (PyObject *)co);
414 Py_DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415
416 return m;
417}
418
419
420/* Search the path (default sys.path) for a module. Return the
421 corresponding filedescr struct, and (via return arguments) the
422 pathname and an open file. Return NULL if the module is not found. */
423
424static struct filedescr *
425find_module(name, path, buf, buflen, p_fp)
426 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyObject *path;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 /* Output parameters: */
429 char *buf;
430 int buflen;
431 FILE **p_fp;
432{
433 int i, npath, len, namelen;
Guido van Rossum80bb9651996-12-05 23:27:02 +0000434 struct filedescr *fdp = NULL;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000435 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436
Guido van Rossumac279101996-08-22 23:10:58 +0000437#ifdef MS_COREDLL
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000438 extern FILE *PyWin_FindRegisteredModule();
Guido van Rossuma5a3db71996-04-09 02:39:59 +0000439 if ((fp=PyWin_FindRegisteredModule(name, &fdp, buf, buflen))!=NULL) {
440 *p_fp = fp;
441 return fdp;
442 }
443#endif
444
445
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 if (path == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 path = PySys_GetObject("path");
448 if (path == NULL || !PyList_Check(path)) {
449 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000450 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451 return NULL;
452 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 npath = PyList_Size(path);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 namelen = strlen(name);
455 for (i = 0; i < npath; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *v = PyList_GetItem(path, i);
457 if (!PyString_Check(v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 continue;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 len = PyString_Size(v);
460 if (len + 2 + namelen + _PyImport_MaxSuffixSize >= buflen)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 continue; /* Too long */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 strcpy(buf, PyString_AsString(v));
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000463 if ((int)strlen(buf) != len)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000465#ifdef macintosh
466 if ( PyMac_FindResourceModule(name, buf) ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 static struct filedescr resfiledescr =
468 {"", "", PY_RESOURCE};
Jack Jansen9c96a921995-02-15 22:57:06 +0000469
470 return &resfiledescr;
471 }
472#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 if (len > 0 && buf[len-1] != SEP)
474 buf[len++] = SEP;
Guido van Rossum40f470f1996-05-23 22:51:04 +0000475#ifdef IMPORT_8x3_NAMES
476 /* see if we are searching in directory dos_8x3 */
477 if (len > 7 && !strncmp(buf + len - 8, "dos_8x3", 7)){
478 int j;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 char ch; /* limit name to 8 lower-case characters */
Guido van Rossum40f470f1996-05-23 22:51:04 +0000480 for (j = 0; (ch = name[j]) && j < 8; j++)
481 if (isupper(ch))
482 buf[len++] = tolower(ch);
483 else
484 buf[len++] = ch;
485 }
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000486 else /* Not in dos_8x3, use the full name */
Guido van Rossum6f489d91996-06-28 20:15:15 +0000487#endif
Guido van Rossum0e41c8c1996-06-20 14:18:34 +0000488 {
Guido van Rossum40f470f1996-05-23 22:51:04 +0000489 strcpy(buf+len, name);
490 len += namelen;
491 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 strcpy(buf+len, fdp->suffix);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 if (Py_VerboseFlag > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 fprintf(stderr, "# trying %s\n", buf);
496 fp = fopen(buf, fdp->mode);
497 if (fp != NULL)
498 break;
499 }
500 if (fp != NULL)
501 break;
502 }
503 if (fp == NULL) {
504 char buf[256];
505 sprintf(buf, "No module named %.200s", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 return NULL;
508 }
509
510 *p_fp = fp;
511 return fdp;
512}
513
514
515/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000516 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
Guido van Rossum79f25d91997-04-29 20:08:16 +0000518static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519load_module(name)
520 char *name;
521{
522 char buf[MAXPATHLEN+1];
523 struct filedescr *fdp;
524 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000525 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528 if (fdp == NULL)
529 return NULL;
530
531 switch (fdp->type) {
532
533 case PY_SOURCE:
534 m = load_source_module(name, buf, fp);
535 break;
536
537 case PY_COMPILED:
538 m = load_compiled_module(name, buf, fp);
539 break;
540
541 case C_EXTENSION:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 m = _PyImport_LoadDynamicModule(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 break;
544
Jack Jansen9c96a921995-02-15 22:57:06 +0000545#ifdef macintosh
546 case PY_RESOURCE:
547 m = PyMac_LoadResourceModule(name, buf);
548 break;
549#endif
550
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000554 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555
556 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000557 if ( fp )
558 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559
560 return m;
561}
562
563
564/* Initialize a built-in module.
565 Return 1 for succes, 0 if the module is not found, and -1 with
566 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000567
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000568static int
569init_builtin(name)
570 char *name;
571{
572 int i;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000573 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
574 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
575 if (_PyImport_Inittab[i].initfunc == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyErr_SetString(PyExc_ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000577 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000578 return -1;
579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 if (Py_VerboseFlag)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000581 fprintf(stderr, "import %s # builtin\n",
582 name);
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000583 (*_PyImport_Inittab[i].initfunc)();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if (PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000586 return 1;
587 }
588 }
589 return 0;
590}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000591
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000593/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000595static struct _frozen *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000596find_frozen(name)
597 char *name;
598{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000599 struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000600
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000602 if (p->name == NULL)
603 return NULL;
604 if (strcmp(p->name, name) == 0)
605 break;
606 }
607 return p;
608}
609
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000611get_frozen_object(name)
612 char *name;
613{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000614 struct _frozen *p = find_frozen(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000615
616 if (p == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 PyErr_SetString(PyExc_ImportError, "No such frozen object");
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000618 return NULL;
619 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 return PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000621}
622
623/* Initialize a frozen module.
624 Return 1 for succes, 0 if the module is not found, and -1 with
625 an exception set if the initialization failed.
626 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000627
628int
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629PyImport_ImportFrozenModule(name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000630 char *name;
631{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000632 struct _frozen *p = find_frozen(name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyObject *co;
634 PyObject *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000635
636 if (p == NULL)
637 return 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 if (Py_VerboseFlag)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000639 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 co = PyMarshal_ReadObjectFromString((char *)p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000641 if (co == NULL)
642 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 if (!PyCode_Check(co)) {
644 Py_DECREF(co);
645 PyErr_SetString(PyExc_TypeError,
646 "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000647 return -1;
648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 m = PyImport_ExecCodeModule(name, co);
650 Py_DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000651 if (m == NULL)
652 return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 Py_DECREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000654 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000655}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000656
657
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000658/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000659 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000660
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661PyObject *
662PyImport_ImportModule(name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000664{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyObject *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000666
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000667 if (import_modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyErr_SetString(PyExc_SystemError,
669 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000670 return NULL;
671 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if ((m = PyDict_GetItemString(import_modules, name)) != NULL) {
673 Py_INCREF(m);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000674 }
675 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 if ((i = init_builtin(name)) ||
678 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679 if (i < 0)
680 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 if ((m = PyDict_GetItemString(import_modules,
682 name)) == NULL) {
683 if (PyErr_Occurred() == NULL)
684 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 "built-in module not initialized properly");
686 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000687 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 Py_INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000689 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690 else
691 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000692 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693
694 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000695}
696
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697
698/* Re-import a module of any kind and return its module object, WITH
699 INCREMENTED REFERENCE COUNT */
700
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701PyObject *
702PyImport_ReloadModule(m)
703 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704{
705 char *name;
706 int i;
707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708 if (m == NULL || !PyModule_Check(m)) {
709 PyErr_SetString(PyExc_TypeError,
710 "reload() argument must be module");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711 return NULL;
712 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 name = PyModule_GetName(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714 if (name == NULL)
715 return NULL;
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000716 if (import_modules == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 PyErr_SetString(PyExc_SystemError,
718 "sys.modules has been deleted");
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000719 return NULL;
720 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 if (m != PyDict_GetItemString(import_modules, name)) {
722 PyErr_SetString(PyExc_ImportError,
723 "reload() module not in sys.modules");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724 return NULL;
725 }
726 /* Check for built-in and frozen modules */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 if ((i = init_builtin(name)) ||
728 (i = PyImport_ImportFrozenModule(name))) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 if (i < 0)
730 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 Py_INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 }
733 else
734 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 return m;
736}
737
738
739/* Module 'imp' provides Python access to the primitives used for
740 importing modules.
741*/
742
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744imp_get_magic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 PyObject *self;
746 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747{
748 char buf[4];
749
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 return NULL;
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000752 buf[0] = (char) ((MAGIC >> 0) & 0xff);
753 buf[1] = (char) ((MAGIC >> 8) & 0xff);
754 buf[2] = (char) ((MAGIC >> 16) & 0xff);
755 buf[3] = (char) ((MAGIC >> 24) & 0xff);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 return PyString_FromStringAndSize(buf, 4);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758}
759
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761imp_get_suffixes(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 PyObject *self;
763 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766 struct filedescr *fdp;
767
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000769 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 list = PyList_New(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771 if (list == NULL)
772 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
774 PyObject *item = Py_BuildValue("ssi",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 fdp->suffix, fdp->mode, fdp->type);
776 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 Py_DECREF(list);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778 return NULL;
779 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 if (PyList_Append(list, item) < 0) {
781 Py_DECREF(list);
782 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 return NULL;
784 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 Py_DECREF(item);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786 }
787 return list;
788}
789
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791imp_find_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 PyObject *self;
793 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 extern int fclose Py_PROTO((FILE *));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 PyObject *path = NULL;
798 PyObject *fob, *ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000799 struct filedescr *fdp;
800 char pathname[MAXPATHLEN+1];
801 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 if (!PyArg_ParseTuple(args, "s|O!", &name, &PyList_Type, &path))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 return NULL;
804 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
805 if (fdp == NULL)
806 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808 if (fob == NULL) {
809 fclose(fp);
810 return NULL;
811 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 ret = Py_BuildValue("Os(ssi)",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 Py_DECREF(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 return ret;
816}
817
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819imp_init_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 PyObject *self;
821 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822{
823 char *name;
824 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *m;
826 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827 return NULL;
828 ret = init_builtin(name);
829 if (ret < 0)
830 return NULL;
831 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 Py_INCREF(Py_None);
833 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 m = PyImport_AddModule(name);
836 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837 return m;
838}
839
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841imp_init_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 PyObject *self;
843 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844{
845 char *name;
846 int ret;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 PyObject *m;
848 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 ret = PyImport_ImportFrozenModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851 if (ret < 0)
852 return NULL;
853 if (ret == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 Py_INCREF(Py_None);
855 return Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 m = PyImport_AddModule(name);
858 Py_XINCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859 return m;
860}
861
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862static PyObject *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000863imp_get_frozen_object(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyObject *self;
865 PyObject *args;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000866{
867 char *name;
Jack Jansen95ffa231995-10-03 14:38:41 +0000868
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000870 return NULL;
871 return get_frozen_object(name);
872}
873
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875imp_is_builtin(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 PyObject *self;
877 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878{
879 int i;
880 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882 return NULL;
Guido van Rossum0bac33b1997-04-29 20:24:10 +0000883 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
884 if (strcmp(name, _PyImport_Inittab[i].name) == 0) {
885 if (_PyImport_Inittab[i].initfunc == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 return PyInt_FromLong(-1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 }
890 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892}
893
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895imp_is_frozen(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000896 PyObject *self;
897 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898{
Guido van Rossumcfd0a221996-06-17 17:06:34 +0000899 struct _frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 for (p = PyImport_FrozenModules; ; p++) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 if (p->name == NULL)
905 break;
906 if (strcmp(p->name, name) == 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 return PyInt_FromLong(1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 return PyInt_FromLong(0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910}
911
912static FILE *
913get_file(pathname, fob, mode)
914 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 PyObject *fob;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 char *mode;
917{
918 FILE *fp;
919 if (fob == NULL) {
920 fp = fopen(pathname, mode);
921 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 }
924 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 fp = PyFile_AsFile(fob);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 if (fp == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 PyErr_SetString(PyExc_ValueError,
928 "bad/closed file object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 }
930 return fp;
931}
932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934imp_load_compiled(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyObject *self;
936 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000937{
938 char *name;
939 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 PyObject *fob = NULL;
941 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
944 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945 return NULL;
946 fp = get_file(pathname, fob, "rb");
947 if (fp == NULL)
948 return NULL;
949 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000950 return m;
951}
952
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954imp_load_dynamic(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 PyObject *self;
956 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000957{
958 char *name;
959 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *fob = NULL;
961 PyObject *m;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000962 FILE *fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 if (!PyArg_ParseTuple(args, "ss|O!", &name, &pathname,
964 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000966 if (fob)
967 fp = get_file(pathname, fob, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 m = _PyImport_LoadDynamicModule(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +0000969 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970}
971
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000973imp_load_source(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 PyObject *self;
975 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976{
977 char *name;
978 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 PyObject *fob = NULL;
980 PyObject *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981 FILE *fp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 if (!PyArg_ParseTuple(args, "ssO!", &name, &pathname,
983 &PyFile_Type, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984 return NULL;
985 fp = get_file(pathname, fob, "r");
986 if (fp == NULL)
987 return NULL;
988 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 return m;
990}
991
Jack Jansen9c96a921995-02-15 22:57:06 +0000992#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993static PyObject *
Jack Jansen9c96a921995-02-15 22:57:06 +0000994imp_load_resource(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 PyObject *self;
996 PyObject *args;
Jack Jansen9c96a921995-02-15 22:57:06 +0000997{
998 char *name;
999 char *pathname;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 PyObject *m;
Jack Jansen9c96a921995-02-15 22:57:06 +00001001
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 if (!PyArg_ParseTuple(args, "ss", &name, &pathname))
Jack Jansen9c96a921995-02-15 22:57:06 +00001003 return NULL;
1004 m = PyMac_LoadResourceModule(name, pathname);
1005 return m;
1006}
1007#endif /* macintosh */
1008
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010imp_new_module(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 PyObject *self;
1012 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013{
1014 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 if (!PyArg_ParseTuple(args, "s", &name))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 return PyModule_New(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018}
1019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020static PyMethodDef imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001021 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022 {"get_magic", imp_get_magic, 1},
1023 {"get_suffixes", imp_get_suffixes, 1},
1024 {"find_module", imp_find_module, 1},
1025 {"init_builtin", imp_init_builtin, 1},
1026 {"init_frozen", imp_init_frozen, 1},
1027 {"is_builtin", imp_is_builtin, 1},
1028 {"is_frozen", imp_is_frozen, 1},
1029 {"load_compiled", imp_load_compiled, 1},
1030 {"load_dynamic", imp_load_dynamic, 1},
1031 {"load_source", imp_load_source, 1},
1032 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +00001033#ifdef macintosh
1034 {"load_resource", imp_load_resource, 1},
1035#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036 {NULL, NULL} /* sentinel */
1037};
1038
1039void
1040initimp()
1041{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001042 PyObject *m, *d, *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 m = Py_InitModule("imp", imp_methods);
1045 d = PyModule_GetDict(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001046
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047 v = PyInt_FromLong(SEARCH_ERROR);
1048 PyDict_SetItemString(d, "SEARCH_ERROR", v);
1049 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001050
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 v = PyInt_FromLong(PY_SOURCE);
1052 PyDict_SetItemString(d, "PY_SOURCE", v);
1053 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001054
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 v = PyInt_FromLong(PY_COMPILED);
1056 PyDict_SetItemString(d, "PY_COMPILED", v);
1057 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 v = PyInt_FromLong(C_EXTENSION);
1060 PyDict_SetItemString(d, "C_EXTENSION", v);
1061 Py_XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062
Jack Jansenae12e191995-06-18 20:06:44 +00001063#ifdef macintosh
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 v = PyInt_FromLong(PY_RESOURCE);
1065 PyDict_SetItemString(d, "PY_RESOURCE", v);
1066 Py_XDECREF(v);
Jack Jansenae12e191995-06-18 20:06:44 +00001067#endif
1068
1069
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 if (PyErr_Occurred())
1071 Py_FatalError("imp module initialization failed");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072}