blob: e258fd13dfc19941bcb914816de388309320f6c2 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Module definition and import implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030#include "token.h"
31#include "graminit.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032#include "import.h"
33#include "errcode.h"
34#include "sysmodule.h"
Guido van Rossum6135a871995-01-09 17:53:26 +000035#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "pythonrun.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000037#include "marshal.h"
38#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000039#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000040#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041#include "importdl.h"
Jack Jansen9c96a921995-02-15 22:57:06 +000042#ifdef macintosh
Jack Jansen614cf811995-07-28 11:28:14 +000043/* 'argument' is a grammar symbol, but also used in some mac header files */
44#undef argument
Jack Jansen9c96a921995-02-15 22:57:06 +000045#include "macglue.h"
46#endif
Guido van Rossumc405b7b1991-06-04 19:39:42 +000047
Guido van Rossum74e6a111994-08-29 12:54:38 +000048extern int verbose; /* Defined in pythonrun.c */
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +000049
Guido van Rossum74e6a111994-08-29 12:54:38 +000050extern long getmtime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000051
Guido van Rossum6c849691994-09-26 15:47:17 +000052/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum7faeab31995-07-07 22:50:36 +000053/* Change for each incompatible change */
54/* The value of CR and LF is incorporated so if you ever read or write
55 a .pyc file in text mode the magic number will be wrong; also, the
56 Apple MPW compiler swaps their values, botching string constants */
57/* XXX Perhaps the magic number should be frozen and a version field
58 added to the .pyc file header? */
Guido van Rossum681d79a1995-07-18 14:51:37 +000059#define MAGIC (11913 | ((long)'\r'<<16) | ((long)'\n'<<24))
Guido van Rossum3ddee711991-12-16 13:06:34 +000060
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061object *import_modules; /* This becomes sys.modules */
Guido van Rossum3f5da241990-12-20 15:06:42 +000062
Guido van Rossum66f1fa81991-04-03 19:03:52 +000063
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065
66void
67initimport()
68{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000069 if (import_modules != NULL)
70 fatal("duplicate initimport() call");
71 if ((import_modules = newdictobject()) == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073}
74
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
Guido van Rossum1ae940a1995-01-02 19:04:15 +000076/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +000077
Guido van Rossum3f5da241990-12-20 15:06:42 +000078void
79doneimport()
80{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000081 if (import_modules != NULL) {
Guido van Rossum0de81bf1995-01-26 00:41:28 +000082 object *tmp = import_modules;
83 import_modules = NULL;
84 /* This deletes all modules from sys.modules.
85 When a module is deallocated, it in turn clears its dictionary,
86 thus hopefully breaking any circular references between modules
87 and between a module's dictionary and its functions.
88 Note that "import" will fail while we are cleaning up.
89 */
90 mappingclear(tmp);
91 DECREF(tmp);
Guido van Rossum3f5da241990-12-20 15:06:42 +000092 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +000093}
Guido van Rossum7f133ed1991-02-19 12:23:57 +000094
95
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096/* Helper for pythonrun.c -- return magic number */
97
98long
99get_pyc_magic()
100{
101 return MAGIC;
102}
103
104
105/* Helper for sysmodule.c -- return modules dictionary */
106
107object *
108get_modules()
109{
110 return import_modules;
111}
112
113
114/* Get the module object corresponding to a module name.
115 First check the modules dictionary if there's one there,
116 if not, create a new one and insert in in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000117 Because the former action is most common, THIS DOES NOT RETURN A
118 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119
120object *
121add_module(name)
122 char *name;
123{
124 object *m;
125
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000126 if (import_modules == NULL) {
127 err_setstr(SystemError, "sys.modules has been deleted");
128 return NULL;
129 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000130 if ((m = dictlookup(import_modules, name)) != NULL &&
131 is_moduleobject(m))
132 return m;
133 m = newmoduleobject(name);
134 if (m == NULL)
135 return NULL;
136 if (dictinsert(import_modules, name, m) != 0) {
137 DECREF(m);
138 return NULL;
139 }
140 DECREF(m); /* Yes, it still exists, in modules! */
141
142 return m;
143}
144
145
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000146/* Execute a code object in a module and return the module object
147 WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000148
Jack Jansen9c96a921995-02-15 22:57:06 +0000149object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150exec_code_module(name, co)
151 char *name;
Jack Jansen9c96a921995-02-15 22:57:06 +0000152 object *co;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000153{
154 object *m, *d, *v;
155
156 m = add_module(name);
157 if (m == NULL)
158 return NULL;
159 d = getmoduledict(m);
Guido van Rossum6135a871995-01-09 17:53:26 +0000160 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000161 if (dictinsert(d, "__builtins__", getbuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000162 return NULL;
163 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000164 v = eval_code((codeobject *)co, d, d); /* XXX owner? */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000165 if (v == NULL)
166 return NULL;
167 DECREF(v);
168 INCREF(m);
169
170 return m;
171}
172
173
174/* Given a pathname for a Python source file, fill a buffer with the
175 pathname for the corresponding compiled file. Return the pathname
176 for the compiled file, or NULL if there's no space in the buffer.
177 Doesn't set an exception. */
178
179static char *
180make_compiled_pathname(pathname, buf, buflen)
181 char *pathname;
182 char *buf;
183 int buflen;
184{
185 int len;
186
187 len = strlen(pathname);
188 if (len+2 > buflen)
189 return NULL;
190 strcpy(buf, pathname);
191 strcpy(buf+len, "c");
192
193 return buf;
194}
195
196
197/* Given a pathname for a Python source file, its time of last
198 modification, and a pathname for a compiled file, check whether the
199 compiled file represents the same version of the source. If so,
200 return a FILE pointer for the compiled file, positioned just after
201 the header; if not, return NULL.
202 Doesn't set an exception. */
203
204static FILE *
205check_compiled_module(pathname, mtime, cpathname)
206 char *pathname;
207 long mtime;
208 char *cpathname;
209{
210 FILE *fp;
211 long magic;
212 long pyc_mtime;
213
214 fp = fopen(cpathname, "rb");
215 if (fp == NULL)
216 return NULL;
217 magic = rd_long(fp);
218 if (magic != MAGIC) {
219 if (verbose)
220 fprintf(stderr, "# %s has bad magic\n", cpathname);
221 fclose(fp);
222 return NULL;
223 }
224 pyc_mtime = rd_long(fp);
225 if (pyc_mtime != mtime) {
226 if (verbose)
227 fprintf(stderr, "# %s has bad mtime\n", cpathname);
228 fclose(fp);
229 return NULL;
230 }
231 if (verbose)
232 fprintf(stderr, "# %s matches %s\n", cpathname, pathname);
233 return fp;
234}
235
236
237/* Read a code object from a file and check it for validity */
238
239static codeobject *
240read_compiled_module(fp)
241 FILE *fp;
242{
243 object *co;
244
245 co = rd_object(fp);
246 /* Ugly: rd_object() may return NULL with or without error */
247 if (co == NULL || !is_codeobject(co)) {
248 if (!err_occurred())
249 err_setstr(ImportError,
250 "Non-code object in .pyc file");
251 XDECREF(co);
252 return NULL;
253 }
254 return (codeobject *)co;
255}
256
257
258/* Load a module from a compiled file, execute it, and return its
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000259 module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000260
261static object *
262load_compiled_module(name, cpathname, fp)
263 char *name;
264 char *cpathname;
265 FILE *fp;
266{
267 long magic;
268 codeobject *co;
269 object *m;
270
271 magic = rd_long(fp);
272 if (magic != MAGIC) {
273 err_setstr(ImportError, "Bad magic number in .pyc file");
274 return NULL;
275 }
276 (void) rd_long(fp);
277 co = read_compiled_module(fp);
278 if (co == NULL)
279 return NULL;
280 if (verbose)
281 fprintf(stderr, "import %s # precompiled from %s\n",
282 name, cpathname);
Jack Jansen9c96a921995-02-15 22:57:06 +0000283 m = exec_code_module(name, (object *)co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284 DECREF(co);
285
286 return m;
287}
288
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000289/* Parse a source file and return the corresponding code object */
290
291static codeobject *
292parse_source_module(pathname, fp)
293 char *pathname;
294 FILE *fp;
295{
296 codeobject *co;
297 node *n;
298
299 n = parse_file(fp, pathname, file_input);
300 if (n == NULL)
301 return NULL;
302 co = compile(n, pathname);
303 freetree(n);
304
305 return co;
306}
307
308
309/* Write a compiled module to a file, placing the time of last
310 modification of its source into the header.
311 Errors are ignored, if a write error occurs an attempt is made to
312 remove the file. */
313
314static void
315write_compiled_module(co, cpathname, mtime)
316 codeobject *co;
317 char *cpathname;
318 long mtime;
319{
320 FILE *fp;
321
322 fp = fopen(cpathname, "wb");
323 if (fp == NULL) {
324 if (verbose)
325 fprintf(stderr,
326 "# can't create %s\n", cpathname);
327 return;
328 }
329 wr_long(MAGIC, fp);
330 /* First write a 0 for mtime */
331 wr_long(0L, fp);
332 wr_object((object *)co, fp);
333 if (ferror(fp)) {
334 if (verbose)
335 fprintf(stderr, "# can't write %s\n", cpathname);
336 /* Don't keep partial file */
337 fclose(fp);
338 (void) unlink(cpathname);
339 return;
340 }
341 /* Now write the true mtime */
342 fseek(fp, 4L, 0);
343 wr_long(mtime, fp);
344 fflush(fp);
345 fclose(fp);
346 if (verbose)
347 fprintf(stderr, "# wrote %s\n", cpathname);
348#ifdef macintosh
349 setfiletype(cpathname, 'PYTH', 'PYC ');
350#endif
351}
352
353
354/* Load a source module from a given file and return its module
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000355 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
356 byte-compiled file, use that instead. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357
358static object *
359load_source_module(name, pathname, fp)
360 char *name;
361 char *pathname;
362 FILE *fp;
363{
364 long mtime;
365 FILE *fpc;
366 char buf[MAXPATHLEN+1];
367 char *cpathname;
368 codeobject *co;
369 object *m;
370
371 mtime = getmtime(pathname);
372 cpathname = make_compiled_pathname(pathname, buf, MAXPATHLEN+1);
373 if (cpathname != NULL &&
374 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
375 co = read_compiled_module(fpc);
376 fclose(fpc);
377 if (co == NULL)
378 return NULL;
379 if (verbose)
380 fprintf(stderr, "import %s # precompiled from %s\n",
381 name, cpathname);
382 }
383 else {
384 co = parse_source_module(pathname, fp);
385 if (co == NULL)
386 return NULL;
387 if (verbose)
388 fprintf(stderr, "import %s # from %s\n",
389 name, pathname);
390 write_compiled_module(co, cpathname, mtime);
391 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000392 m = exec_code_module(name, (object *)co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 DECREF(co);
394
395 return m;
396}
397
398
399/* Search the path (default sys.path) for a module. Return the
400 corresponding filedescr struct, and (via return arguments) the
401 pathname and an open file. Return NULL if the module is not found. */
402
403static struct filedescr *
404find_module(name, path, buf, buflen, p_fp)
405 char *name;
406 object *path;
407 /* Output parameters: */
408 char *buf;
409 int buflen;
410 FILE **p_fp;
411{
412 int i, npath, len, namelen;
413 struct filedescr *fdp;
414 FILE *fp;
415
416 if (path == NULL)
417 path = sysget("path");
418 if (path == NULL || !is_listobject(path)) {
419 err_setstr(ImportError,
420 "module search path must be list of directory names");
421 return NULL;
422 }
423 npath = getlistsize(path);
424 namelen = strlen(name);
425 for (i = 0; i < npath; i++) {
426 object *v = getlistitem(path, i);
427 if (!is_stringobject(v))
428 continue;
429 len = getstringsize(v);
430 if (len + 2 + namelen + import_maxsuffixsize >= buflen)
431 continue; /* Too long */
432 strcpy(buf, getstringvalue(v));
433 if (strlen(buf) != len)
434 continue; /* v contains '\0' */
Jack Jansen9c96a921995-02-15 22:57:06 +0000435#ifdef macintosh
436 if ( PyMac_FindResourceModule(name, buf) ) {
437 static struct filedescr resfiledescr = { "", "", PY_RESOURCE};
438
439 return &resfiledescr;
440 }
441#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 if (len > 0 && buf[len-1] != SEP)
443 buf[len++] = SEP;
444 strcpy(buf+len, name);
445 len += namelen;
446 for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
447 strcpy(buf+len, fdp->suffix);
448 if (verbose > 1)
449 fprintf(stderr, "# trying %s\n", buf);
450 fp = fopen(buf, fdp->mode);
451 if (fp != NULL)
452 break;
453 }
454 if (fp != NULL)
455 break;
456 }
457 if (fp == NULL) {
458 char buf[256];
459 sprintf(buf, "No module named %.200s", name);
460 err_setstr(ImportError, buf);
461 return NULL;
462 }
463
464 *p_fp = fp;
465 return fdp;
466}
467
468
469/* Load an external module using the default search path and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000470 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
472static object *
473load_module(name)
474 char *name;
475{
476 char buf[MAXPATHLEN+1];
477 struct filedescr *fdp;
478 FILE *fp = NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000479 object *m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480
481 fdp = find_module(name, (object *)NULL, buf, MAXPATHLEN+1, &fp);
482 if (fdp == NULL)
483 return NULL;
484
485 switch (fdp->type) {
486
487 case PY_SOURCE:
488 m = load_source_module(name, buf, fp);
489 break;
490
491 case PY_COMPILED:
492 m = load_compiled_module(name, buf, fp);
493 break;
494
495 case C_EXTENSION:
Sjoerd Mullenderfbe6d331995-06-12 15:51:34 +0000496 m = load_dynamic_module(name, buf, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 break;
498
Jack Jansen9c96a921995-02-15 22:57:06 +0000499#ifdef macintosh
500 case PY_RESOURCE:
501 m = PyMac_LoadResourceModule(name, buf);
502 break;
503#endif
504
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 default:
506 err_setstr(SystemError,
507 "find_module returned unexpected result");
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000508 m = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
510 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000511 if ( fp )
512 fclose(fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513
514 return m;
515}
516
517
518/* Initialize a built-in module.
519 Return 1 for succes, 0 if the module is not found, and -1 with
520 an exception set if the initialization failed. */
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000521
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000522static int
523init_builtin(name)
524 char *name;
525{
526 int i;
527 for (i = 0; inittab[i].name != NULL; i++) {
528 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000529 if (inittab[i].initfunc == NULL) {
530 err_setstr(ImportError,
531 "cannot re-init internal module");
532 return -1;
533 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000534 if (verbose)
535 fprintf(stderr, "import %s # builtin\n",
536 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000537 (*inittab[i].initfunc)();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 if (err_occurred())
539 return -1;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000540 return 1;
541 }
542 }
543 return 0;
544}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000545
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546
547/* Initialize a frozen module.
548 Return 1 for succes, 0 if the module is not found, and -1 with
549 an exception set if the initialization failed. */
550
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000551extern struct frozen {
552 char *name;
553 char *code;
554 int size;
555} frozen_modules[];
556
Guido van Rossum0b344901995-02-07 15:35:27 +0000557/* This function is also used from frozenmain.c */
558
559int
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000560init_frozen(name)
561 char *name;
562{
563 struct frozen *p;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 object *co;
565 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000566 for (p = frozen_modules; ; p++) {
567 if (p->name == NULL)
568 return 0;
569 if (strcmp(p->name, name) == 0)
570 break;
571 }
572 if (verbose)
573 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574 co = rds_object(p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000575 if (co == NULL)
576 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000577 if (!is_codeobject(co)) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000578 DECREF(co);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 err_setstr(SystemError, "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000580 return -1;
581 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000582 m = exec_code_module(name, co);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000583 DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000584 if (m == NULL)
585 return -1;
586 DECREF(m);
587 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000588}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000589
590
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000592 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000593
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594object *
595import_module(name)
596 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000597{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000598 object *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000599
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000600 if (import_modules == NULL) {
601 err_setstr(SystemError, "sys.modules has been deleted");
602 return NULL;
603 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000604 if ((m = dictlookup(import_modules, name)) != NULL) {
605 INCREF(m);
606 }
607 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 int i;
609 if ((i = init_builtin(name)) || (i = init_frozen(name))) {
610 if (i < 0)
611 return NULL;
612 if ((m = dictlookup(import_modules, name)) == NULL) {
613 if (err_occurred() == NULL)
614 err_setstr(SystemError,
615 "built-in module not initialized properly");
616 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000617 else
618 INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000619 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620 else
621 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000622 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623
624 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000625}
626
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627
628/* Re-import a module of any kind and return its module object, WITH
629 INCREMENTED REFERENCE COUNT */
630
631object *
632reload_module(m)
633 object *m;
634{
635 char *name;
636 int i;
637
638 if (m == NULL || !is_moduleobject(m)) {
639 err_setstr(TypeError, "reload() argument must be module");
640 return NULL;
641 }
642 name = getmodulename(m);
643 if (name == NULL)
644 return NULL;
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000645 if (import_modules == NULL) {
646 err_setstr(SystemError, "sys.modules has been deleted");
647 return NULL;
648 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000649 if (m != dictlookup(import_modules, name)) {
650 err_setstr(ImportError, "reload() module not in sys.modules");
651 return NULL;
652 }
653 /* Check for built-in and frozen modules */
654 if ((i = init_builtin(name)) || (i = init_frozen(name))) {
655 if (i < 0)
656 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000657 INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000658 }
659 else
660 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000661 return m;
662}
663
664
665/* Module 'imp' provides Python access to the primitives used for
666 importing modules.
667*/
668
669static object *
670imp_get_magic(self, args)
671 object *self;
672 object *args;
673{
674 char buf[4];
675
676 if (!newgetargs(args, ""))
677 return NULL;
678 buf[0] = (MAGIC >> 0) & 0xff;
679 buf[1] = (MAGIC >> 8) & 0xff;
Guido van Rossum90f0e071995-01-30 12:53:06 +0000680 buf[2] = (MAGIC >> 16) & 0xff;
681 buf[3] = (MAGIC >> 24) & 0xff;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682
683 return newsizedstringobject(buf, 4);
684}
685
686static object *
687imp_get_suffixes(self, args)
688 object *self;
689 object *args;
690{
691 object *list;
692 struct filedescr *fdp;
693
694 if (!newgetargs(args, ""))
695 return NULL;
696 list = newlistobject(0);
697 if (list == NULL)
698 return NULL;
699 for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
700 object *item = mkvalue("ssi",
701 fdp->suffix, fdp->mode, fdp->type);
702 if (item == NULL) {
703 DECREF(list);
704 return NULL;
705 }
706 if (addlistitem(list, item) < 0) {
707 DECREF(list);
708 DECREF(item);
709 return NULL;
710 }
711 DECREF(item);
712 }
713 return list;
714}
715
716static object *
717imp_find_module(self, args)
718 object *self;
719 object *args;
720{
721 extern int fclose PROTO((FILE *));
722 char *name;
723 object *path = NULL;
724 object *fob, *ret;
725 struct filedescr *fdp;
726 char pathname[MAXPATHLEN+1];
727 FILE *fp;
728 if (!newgetargs(args, "s|O!", &name, &Listtype, &path))
729 return NULL;
730 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
731 if (fdp == NULL)
732 return NULL;
733 fob = newopenfileobject(fp, pathname, fdp->mode, fclose);
734 if (fob == NULL) {
735 fclose(fp);
736 return NULL;
737 }
738 ret = mkvalue("Os(ssi)",
739 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
740 DECREF(fob);
741 return ret;
742}
743
744static object *
745imp_init_builtin(self, args)
746 object *self;
747 object *args;
748{
749 char *name;
750 int ret;
751 object *m;
752 if (!newgetargs(args, "s", &name))
753 return NULL;
754 ret = init_builtin(name);
755 if (ret < 0)
756 return NULL;
757 if (ret == 0) {
758 INCREF(None);
759 return None;
760 }
761 m = add_module(name);
762 XINCREF(m);
763 return m;
764}
765
766static object *
767imp_init_frozen(self, args)
768 object *self;
769 object *args;
770{
771 char *name;
772 int ret;
773 object *m;
774 if (!newgetargs(args, "s", &name))
775 return NULL;
776 ret = init_frozen(name);
777 if (ret < 0)
778 return NULL;
779 if (ret == 0) {
780 INCREF(None);
781 return None;
782 }
783 m = add_module(name);
784 XINCREF(m);
785 return m;
786}
787
788static object *
789imp_is_builtin(self, args)
790 object *self;
791 object *args;
792{
793 int i;
794 char *name;
795 if (!newgetargs(args, "s", &name))
796 return NULL;
797 for (i = 0; inittab[i].name != NULL; i++) {
798 if (strcmp(name, inittab[i].name) == 0) {
799 if (inittab[i].initfunc == NULL)
800 return newintobject(-1);
801 else
802 return newintobject(1);
803 }
804 }
805 return newintobject(0);
806}
807
808static object *
809imp_is_frozen(self, args)
810 object *self;
811 object *args;
812{
813 struct frozen *p;
814 char *name;
815 if (!newgetargs(args, "s", &name))
816 return NULL;
817 for (p = frozen_modules; ; p++) {
818 if (p->name == NULL)
819 break;
820 if (strcmp(p->name, name) == 0)
821 return newintobject(1);
822 }
823 return newintobject(0);
824}
825
826static FILE *
827get_file(pathname, fob, mode)
828 char *pathname;
829 object *fob;
830 char *mode;
831{
832 FILE *fp;
833 if (fob == NULL) {
834 fp = fopen(pathname, mode);
835 if (fp == NULL)
836 err_errno(IOError);
837 }
838 else {
839 fp = getfilefile(fob);
840 if (fp == NULL)
841 err_setstr(ValueError, "bad/closed file object");
842 }
843 return fp;
844}
845
846static object *
847imp_load_compiled(self, args)
848 object *self;
849 object *args;
850{
851 char *name;
852 char *pathname;
853 object *fob = NULL;
854 object *m;
855 FILE *fp;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000856 if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857 return NULL;
858 fp = get_file(pathname, fob, "rb");
859 if (fp == NULL)
860 return NULL;
861 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862 return m;
863}
864
865static object *
866imp_load_dynamic(self, args)
867 object *self;
868 object *args;
869{
870 char *name;
871 char *pathname;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000872 object *fob = NULL;
873 object *m;
874 FILE *fp = NULL;
875 if (!newgetargs(args, "ss|O!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000877 if (fob)
878 fp = get_file(pathname, fob, "r");
879 m = load_dynamic_module(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +0000880 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881}
882
883static object *
884imp_load_source(self, args)
885 object *self;
886 object *args;
887{
888 char *name;
889 char *pathname;
890 object *fob = NULL;
891 object *m;
892 FILE *fp;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000893 if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894 return NULL;
895 fp = get_file(pathname, fob, "r");
896 if (fp == NULL)
897 return NULL;
898 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899 return m;
900}
901
Jack Jansen9c96a921995-02-15 22:57:06 +0000902#ifdef macintosh
903static object *
904imp_load_resource(self, args)
905 object *self;
906 object *args;
907{
908 char *name;
909 char *pathname;
910 object *m;
911
912 if (!newgetargs(args, "ss", &name, &pathname))
913 return NULL;
914 m = PyMac_LoadResourceModule(name, pathname);
915 return m;
916}
917#endif /* macintosh */
918
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919static object *
920imp_new_module(self, args)
921 object *self;
922 object *args;
923{
924 char *name;
925 if (!newgetargs(args, "s", &name))
926 return NULL;
927 return newmoduleobject(name);
928}
929
930static struct methodlist imp_methods[] = {
931 {"get_magic", imp_get_magic, 1},
932 {"get_suffixes", imp_get_suffixes, 1},
933 {"find_module", imp_find_module, 1},
934 {"init_builtin", imp_init_builtin, 1},
935 {"init_frozen", imp_init_frozen, 1},
936 {"is_builtin", imp_is_builtin, 1},
937 {"is_frozen", imp_is_frozen, 1},
938 {"load_compiled", imp_load_compiled, 1},
939 {"load_dynamic", imp_load_dynamic, 1},
940 {"load_source", imp_load_source, 1},
941 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +0000942#ifdef macintosh
943 {"load_resource", imp_load_resource, 1},
944#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000945 {NULL, NULL} /* sentinel */
946};
947
948void
949initimp()
950{
951 object *m, *d, *v;
952
953 m = initmodule("imp", imp_methods);
954 d = getmoduledict(m);
955
956 v = newintobject(SEARCH_ERROR);
957 dictinsert(d, "SEARCH_ERROR", v);
958 XDECREF(v);
959
960 v = newintobject(PY_SOURCE);
961 dictinsert(d, "PY_SOURCE", v);
962 XDECREF(v);
963
964 v = newintobject(PY_COMPILED);
965 dictinsert(d, "PY_COMPILED", v);
966 XDECREF(v);
967
968 v = newintobject(C_EXTENSION);
969 dictinsert(d, "C_EXTENSION", v);
970 XDECREF(v);
971
Jack Jansenae12e191995-06-18 20:06:44 +0000972#ifdef macintosh
973 v = newintobject(PY_RESOURCE);
974 dictinsert(d, "PY_RESOURCE", v);
975 XDECREF(v);
976#endif
977
978
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 if (err_occurred())
980 fatal("imp module initialization failed");
981}