blob: b0f46b0e87748a4ad23bf5f762dcc0f5704a8d0d [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;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000414 FILE *fp = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415
416 if (path == NULL)
417 path = sysget("path");
418 if (path == NULL || !is_listobject(path)) {
419 err_setstr(ImportError,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000420 "sys.path must be a list of directory names");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 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,
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000531 "Cannot re-init internal module");
Guido van Rossum74e6a111994-08-29 12:54:38 +0000532 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
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000547/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000549extern struct frozen {
550 char *name;
551 char *code;
552 int size;
553} frozen_modules[];
554
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000555static struct frozen *
556find_frozen(name)
557 char *name;
558{
559 struct frozen *p;
560 object *co;
561
562 for (p = frozen_modules; ; p++) {
563 if (p->name == NULL)
564 return NULL;
565 if (strcmp(p->name, name) == 0)
566 break;
567 }
568 return p;
569}
570
571static object *
572get_frozen_object(name)
573 char *name;
574{
575 struct frozen *p = find_frozen(name);
576
577 if (p == NULL) {
578 err_setstr(ImportError, "No such frozen object");
579 return NULL;
580 }
581 return rds_object(p->code, p->size);
582}
583
584/* Initialize a frozen module.
585 Return 1 for succes, 0 if the module is not found, and -1 with
586 an exception set if the initialization failed.
587 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +0000588
589int
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000590init_frozen(name)
591 char *name;
592{
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000593 struct frozen *p = find_frozen(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594 object *co;
595 object *m;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000596
597 if (p == NULL)
598 return 0;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000599 if (verbose)
600 fprintf(stderr, "import %s # frozen\n", name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601 co = rds_object(p->code, p->size);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000602 if (co == NULL)
603 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000604 if (!is_codeobject(co)) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000605 DECREF(co);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000606 err_setstr(TypeError, "frozen object is not a code object");
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000607 return -1;
608 }
Jack Jansen9c96a921995-02-15 22:57:06 +0000609 m = exec_code_module(name, co);
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000610 DECREF(co);
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000611 if (m == NULL)
612 return -1;
613 DECREF(m);
614 return 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000615}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000616
617
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000619 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +0000620
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000621object *
622import_module(name)
623 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000624{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000625 object *m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000626
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000627 if (import_modules == NULL) {
628 err_setstr(SystemError, "sys.modules has been deleted");
629 return NULL;
630 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000631 if ((m = dictlookup(import_modules, name)) != NULL) {
632 INCREF(m);
633 }
634 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 int i;
636 if ((i = init_builtin(name)) || (i = init_frozen(name))) {
637 if (i < 0)
638 return NULL;
639 if ((m = dictlookup(import_modules, name)) == NULL) {
640 if (err_occurred() == NULL)
641 err_setstr(SystemError,
642 "built-in module not initialized properly");
643 }
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000644 else
645 INCREF(m);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000646 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647 else
648 m = load_module(name);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000649 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650
651 return m;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000652}
653
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654
655/* Re-import a module of any kind and return its module object, WITH
656 INCREMENTED REFERENCE COUNT */
657
658object *
659reload_module(m)
660 object *m;
661{
662 char *name;
663 int i;
664
665 if (m == NULL || !is_moduleobject(m)) {
666 err_setstr(TypeError, "reload() argument must be module");
667 return NULL;
668 }
669 name = getmodulename(m);
670 if (name == NULL)
671 return NULL;
Guido van Rossum0de81bf1995-01-26 00:41:28 +0000672 if (import_modules == NULL) {
673 err_setstr(SystemError, "sys.modules has been deleted");
674 return NULL;
675 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 if (m != dictlookup(import_modules, name)) {
677 err_setstr(ImportError, "reload() module not in sys.modules");
678 return NULL;
679 }
680 /* Check for built-in and frozen modules */
681 if ((i = init_builtin(name)) || (i = init_frozen(name))) {
682 if (i < 0)
683 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000684 INCREF(m);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 }
686 else
687 m = load_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 return m;
689}
690
691
692/* Module 'imp' provides Python access to the primitives used for
693 importing modules.
694*/
695
696static object *
697imp_get_magic(self, args)
698 object *self;
699 object *args;
700{
701 char buf[4];
702
703 if (!newgetargs(args, ""))
704 return NULL;
705 buf[0] = (MAGIC >> 0) & 0xff;
706 buf[1] = (MAGIC >> 8) & 0xff;
Guido van Rossum90f0e071995-01-30 12:53:06 +0000707 buf[2] = (MAGIC >> 16) & 0xff;
708 buf[3] = (MAGIC >> 24) & 0xff;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709
710 return newsizedstringobject(buf, 4);
711}
712
713static object *
714imp_get_suffixes(self, args)
715 object *self;
716 object *args;
717{
718 object *list;
719 struct filedescr *fdp;
720
721 if (!newgetargs(args, ""))
722 return NULL;
723 list = newlistobject(0);
724 if (list == NULL)
725 return NULL;
726 for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
727 object *item = mkvalue("ssi",
728 fdp->suffix, fdp->mode, fdp->type);
729 if (item == NULL) {
730 DECREF(list);
731 return NULL;
732 }
733 if (addlistitem(list, item) < 0) {
734 DECREF(list);
735 DECREF(item);
736 return NULL;
737 }
738 DECREF(item);
739 }
740 return list;
741}
742
743static object *
744imp_find_module(self, args)
745 object *self;
746 object *args;
747{
748 extern int fclose PROTO((FILE *));
749 char *name;
750 object *path = NULL;
751 object *fob, *ret;
752 struct filedescr *fdp;
753 char pathname[MAXPATHLEN+1];
754 FILE *fp;
755 if (!newgetargs(args, "s|O!", &name, &Listtype, &path))
756 return NULL;
757 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
758 if (fdp == NULL)
759 return NULL;
760 fob = newopenfileobject(fp, pathname, fdp->mode, fclose);
761 if (fob == NULL) {
762 fclose(fp);
763 return NULL;
764 }
765 ret = mkvalue("Os(ssi)",
766 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
767 DECREF(fob);
768 return ret;
769}
770
771static object *
772imp_init_builtin(self, args)
773 object *self;
774 object *args;
775{
776 char *name;
777 int ret;
778 object *m;
779 if (!newgetargs(args, "s", &name))
780 return NULL;
781 ret = init_builtin(name);
782 if (ret < 0)
783 return NULL;
784 if (ret == 0) {
785 INCREF(None);
786 return None;
787 }
788 m = add_module(name);
789 XINCREF(m);
790 return m;
791}
792
793static object *
794imp_init_frozen(self, args)
795 object *self;
796 object *args;
797{
798 char *name;
799 int ret;
800 object *m;
801 if (!newgetargs(args, "s", &name))
802 return NULL;
803 ret = init_frozen(name);
804 if (ret < 0)
805 return NULL;
806 if (ret == 0) {
807 INCREF(None);
808 return None;
809 }
810 m = add_module(name);
811 XINCREF(m);
812 return m;
813}
814
815static object *
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000816imp_get_frozen_object(self, args)
817 object *self;
818 object *args;
819{
820 char *name;
821 int ret;
822 object *m;
823 if (!newgetargs(args, "s", &name))
824 return NULL;
825 return get_frozen_object(name);
826}
827
828static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829imp_is_builtin(self, args)
830 object *self;
831 object *args;
832{
833 int i;
834 char *name;
835 if (!newgetargs(args, "s", &name))
836 return NULL;
837 for (i = 0; inittab[i].name != NULL; i++) {
838 if (strcmp(name, inittab[i].name) == 0) {
839 if (inittab[i].initfunc == NULL)
840 return newintobject(-1);
841 else
842 return newintobject(1);
843 }
844 }
845 return newintobject(0);
846}
847
848static object *
849imp_is_frozen(self, args)
850 object *self;
851 object *args;
852{
853 struct frozen *p;
854 char *name;
855 if (!newgetargs(args, "s", &name))
856 return NULL;
857 for (p = frozen_modules; ; p++) {
858 if (p->name == NULL)
859 break;
860 if (strcmp(p->name, name) == 0)
861 return newintobject(1);
862 }
863 return newintobject(0);
864}
865
866static FILE *
867get_file(pathname, fob, mode)
868 char *pathname;
869 object *fob;
870 char *mode;
871{
872 FILE *fp;
873 if (fob == NULL) {
874 fp = fopen(pathname, mode);
875 if (fp == NULL)
876 err_errno(IOError);
877 }
878 else {
879 fp = getfilefile(fob);
880 if (fp == NULL)
881 err_setstr(ValueError, "bad/closed file object");
882 }
883 return fp;
884}
885
886static object *
887imp_load_compiled(self, args)
888 object *self;
889 object *args;
890{
891 char *name;
892 char *pathname;
893 object *fob = NULL;
894 object *m;
895 FILE *fp;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000896 if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 return NULL;
898 fp = get_file(pathname, fob, "rb");
899 if (fp == NULL)
900 return NULL;
901 m = load_compiled_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 return m;
903}
904
905static object *
906imp_load_dynamic(self, args)
907 object *self;
908 object *args;
909{
910 char *name;
911 char *pathname;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000912 object *fob = NULL;
913 object *m;
914 FILE *fp = NULL;
915 if (!newgetargs(args, "ss|O!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 return NULL;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000917 if (fob)
918 fp = get_file(pathname, fob, "r");
919 m = load_dynamic_module(name, pathname, fp);
Guido van Rossum7faeab31995-07-07 22:50:36 +0000920 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921}
922
923static object *
924imp_load_source(self, args)
925 object *self;
926 object *args;
927{
928 char *name;
929 char *pathname;
930 object *fob = NULL;
931 object *m;
932 FILE *fp;
Guido van Rossum7faeab31995-07-07 22:50:36 +0000933 if (!newgetargs(args, "ssO!", &name, &pathname, &Filetype, &fob))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 return NULL;
935 fp = get_file(pathname, fob, "r");
936 if (fp == NULL)
937 return NULL;
938 m = load_source_module(name, pathname, fp);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 return m;
940}
941
Jack Jansen9c96a921995-02-15 22:57:06 +0000942#ifdef macintosh
943static object *
944imp_load_resource(self, args)
945 object *self;
946 object *args;
947{
948 char *name;
949 char *pathname;
950 object *m;
951
952 if (!newgetargs(args, "ss", &name, &pathname))
953 return NULL;
954 m = PyMac_LoadResourceModule(name, pathname);
955 return m;
956}
957#endif /* macintosh */
958
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959static object *
960imp_new_module(self, args)
961 object *self;
962 object *args;
963{
964 char *name;
965 if (!newgetargs(args, "s", &name))
966 return NULL;
967 return newmoduleobject(name);
968}
969
970static struct methodlist imp_methods[] = {
Guido van Rossum6ec1efb1995-08-04 04:08:57 +0000971 {"get_frozen_object", imp_get_frozen_object, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000972 {"get_magic", imp_get_magic, 1},
973 {"get_suffixes", imp_get_suffixes, 1},
974 {"find_module", imp_find_module, 1},
975 {"init_builtin", imp_init_builtin, 1},
976 {"init_frozen", imp_init_frozen, 1},
977 {"is_builtin", imp_is_builtin, 1},
978 {"is_frozen", imp_is_frozen, 1},
979 {"load_compiled", imp_load_compiled, 1},
980 {"load_dynamic", imp_load_dynamic, 1},
981 {"load_source", imp_load_source, 1},
982 {"new_module", imp_new_module, 1},
Jack Jansen9c96a921995-02-15 22:57:06 +0000983#ifdef macintosh
984 {"load_resource", imp_load_resource, 1},
985#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 {NULL, NULL} /* sentinel */
987};
988
989void
990initimp()
991{
992 object *m, *d, *v;
993
994 m = initmodule("imp", imp_methods);
995 d = getmoduledict(m);
996
997 v = newintobject(SEARCH_ERROR);
998 dictinsert(d, "SEARCH_ERROR", v);
999 XDECREF(v);
1000
1001 v = newintobject(PY_SOURCE);
1002 dictinsert(d, "PY_SOURCE", v);
1003 XDECREF(v);
1004
1005 v = newintobject(PY_COMPILED);
1006 dictinsert(d, "PY_COMPILED", v);
1007 XDECREF(v);
1008
1009 v = newintobject(C_EXTENSION);
1010 dictinsert(d, "C_EXTENSION", v);
1011 XDECREF(v);
1012
Jack Jansenae12e191995-06-18 20:06:44 +00001013#ifdef macintosh
1014 v = newintobject(PY_RESOURCE);
1015 dictinsert(d, "PY_RESOURCE", v);
1016 XDECREF(v);
1017#endif
1018
1019
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 if (err_occurred())
1021 fatal("imp module initialization failed");
1022}