blob: a8cfe5b5ea88976e6bf0de210674557b626d3fa3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum34679b71993-01-26 13:33:44 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The 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 Rossum3f5da241990-12-20 15:06:42 +000035#include "pythonrun.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000036#include "marshal.h"
37#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000039#include "osdefs.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000040
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +000041extern int verbose; /* Defined in pythonmain.c */
42
Guido van Rossum21d335e1993-10-15 13:01:11 +000043extern long getmtime(); /* Defined in posixmodule.c */
44
Guido van Rossume25c2561992-01-19 16:28:21 +000045#ifdef DEBUG
46#define D(x) x
47#else
48#define D(x)
49#endif
50
51#ifdef USE_DL
Guido van Rossum21d335e1993-10-15 13:01:11 +000052#ifdef SUN_SHLIB
53#include <dlfcn.h>
54typedef void (*dl_funcptr)();
55#else
Guido van Rossume25c2561992-01-19 16:28:21 +000056#include "dl.h"
Guido van Rossum21d335e1993-10-15 13:01:11 +000057#endif /* SUN_SHLIB */
Guido van Rossume25c2561992-01-19 16:28:21 +000058
Guido van Rossume0513de1992-01-26 18:15:22 +000059extern char *argv0;
Guido van Rossume25c2561992-01-19 16:28:21 +000060#endif
61
Guido van Rossumf56e3db1993-04-01 20:59:32 +000062/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum3ddee711991-12-16 13:06:34 +000063
Guido van Rossum89b33251993-10-22 14:26:06 +000064#define MAGIC 0x999902L /* Increment by one for each incompatible change */
Guido van Rossum3ddee711991-12-16 13:06:34 +000065
Guido van Rossum3f5da241990-12-20 15:06:42 +000066static object *modules;
67
Guido van Rossum66f1fa81991-04-03 19:03:52 +000068/* Forward */
69static int init_builtin PROTO((char *));
70
Guido van Rossum3f5da241990-12-20 15:06:42 +000071/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072
73void
74initimport()
75{
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 if ((modules = newdictobject()) == NULL)
77 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078}
79
80object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000081get_modules()
82{
83 return modules;
84}
85
86object *
87add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 char *name;
89{
90 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
92 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 m = newmoduleobject(name);
94 if (m == NULL)
95 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000096 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 DECREF(m);
98 return NULL;
99 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 return m;
102}
103
Guido van Rossumc45611d1993-11-17 22:58:56 +0000104enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
Guido van Rossume25c2561992-01-19 16:28:21 +0000105
Guido van Rossumc45611d1993-11-17 22:58:56 +0000106static struct filedescr {
107 char *suffix;
108 char *mode;
109 enum filetype type;
110} filetab[] = {
Guido van Rossume25c2561992-01-19 16:28:21 +0000111#ifdef USE_DL
Guido van Rossum21d335e1993-10-15 13:01:11 +0000112#ifdef SUN_SHLIB
Guido van Rossumc45611d1993-11-17 22:58:56 +0000113 {"module.so", "rb", C_EXTENSION},
Guido van Rossum21d335e1993-10-15 13:01:11 +0000114#else
Guido van Rossumc45611d1993-11-17 22:58:56 +0000115 {"module.o", "rb", C_EXTENSION},
Guido van Rossum21d335e1993-10-15 13:01:11 +0000116#endif /* SUN_SHLIB */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000117#endif /* USE_DL */
118 {".py", "r", PY_SOURCE},
119 {".pyc", "rb", PY_COMPILED},
120 {0, 0}
121};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122
123static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124get_module(m, name, m_ret)
125 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000129 int err, npath, i, len;
130 long magic;
131 long mtime, pyc_mtime;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000132 char namebuf[MAXPATHLEN+1];
Guido van Rossumc45611d1993-11-17 22:58:56 +0000133 struct filedescr *fdp;
134 FILE *fp = NULL, *fpc = NULL;
135 node *n = NULL;
136 object *path, *v, *d;
137 codeobject *co = NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000138
Guido van Rossumc45611d1993-11-17 22:58:56 +0000139 path = sysget("path");
140 if (path == NULL || !is_listobject(path)) {
141 err_setstr(ImportError,
142 "sys.path must be list of directory names");
143 return NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000144 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000145 npath = getlistsize(path);
146 for (i = 0; i < npath; i++) {
147 v = getlistitem(path, i);
148 if (!is_stringobject(v))
149 continue;
150 strcpy(namebuf, getstringvalue(v));
151 len = getstringsize(v);
152 if (len > 0 && namebuf[len-1] != SEP)
153 namebuf[len++] = SEP;
154 strcpy(namebuf+len, name);
155 len += strlen(name);
156 for (fdp = filetab; fdp->suffix != NULL; fdp++) {
157 strcpy(namebuf+len, fdp->suffix);
158 if (verbose > 1)
159 fprintf(stderr, "# trying %s\n", namebuf);
160 fp = fopen(namebuf, fdp->mode);
161 if (fp != NULL)
162 break;
163 }
164 if (fp != NULL)
165 break;
166 }
167 if (fp == NULL) {
168 sprintf(namebuf, "No module named %s", name);
169 err_setstr(ImportError, namebuf);
170 return NULL;
171 }
172
173 switch (fdp->type) {
174
175 case PY_SOURCE:
Guido van Rossum21d335e1993-10-15 13:01:11 +0000176 mtime = getmtime(namebuf);
Guido van Rossum590baa41993-11-30 13:40:46 +0000177 len = strlen(namebuf);
178 strcpy(namebuf + len, "c");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000179 fpc = fopen(namebuf, "rb");
180 if (fpc != NULL) {
181 magic = rd_long(fpc);
182 if (magic != MAGIC) {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000183 if (verbose)
184 fprintf(stderr,
Guido van Rossumc45611d1993-11-17 22:58:56 +0000185 "# %s.pyc has bad magic\n",
186 name);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000187 }
188 else {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000189 pyc_mtime = rd_long(fpc);
190 if (pyc_mtime != mtime) {
191 if (verbose)
192 fprintf(stderr,
193 "# %s.pyc has bad mtime\n",
194 name);
195 }
196 else {
197 fclose(fp);
198 fp = fpc;
199 if (verbose)
200 fprintf(stderr,
201 "# %s.pyc matches %s.py\n",
202 name, name);
203 goto use_compiled;
204 }
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000205 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000206 fclose(fpc);
207 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000208 namebuf[len] = '\0';
Guido van Rossumc45611d1993-11-17 22:58:56 +0000209 err = parse_file(fp, namebuf, file_input, &n);
210 if (err != E_DONE) {
211 err_input(err);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000212 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000213 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000214 co = compile(n, namebuf);
215 freetree(n);
216 if (co == NULL)
217 return NULL;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000218 if (verbose)
219 fprintf(stderr,
Guido van Rossum590baa41993-11-30 13:40:46 +0000220 "import %s # from %s\n", name, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000221 /* Now write the code object to the ".pyc" file */
Guido van Rossum590baa41993-11-30 13:40:46 +0000222 strcpy(namebuf + len, "c");
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000223 fpc = fopen(namebuf, "wb");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000224 if (fpc == NULL) {
225 if (verbose)
226 fprintf(stderr,
227 "# can't create %s\n", namebuf);
228 }
229 else {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000230 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000231 /* First write a 0 for mtime */
232 wr_long(0L, fpc);
233 wr_object((object *)co, fpc);
234 if (ferror(fpc)) {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000235 if (verbose)
236 fprintf(stderr,
237 "# can't write %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000238 /* Don't keep partial file */
239 fclose(fpc);
240 (void) unlink(namebuf);
241 }
242 else {
243 /* Now write the true mtime */
244 fseek(fpc, 4L, 0);
245 wr_long(mtime, fpc);
246 fflush(fpc);
247 fclose(fpc);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000248 if (verbose)
249 fprintf(stderr,
250 "# wrote %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000251 }
252 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000253 break;
254
255 case PY_COMPILED:
256 if (verbose)
257 fprintf(stderr, "# %s.pyc without %s.py\n",
258 name, name);
259 magic = rd_long(fp);
260 if (magic != MAGIC) {
261 err_setstr(ImportError,
262 "Bad magic number in .pyc file");
263 return NULL;
264 }
265 (void) rd_long(fp);
266 use_compiled:
267 v = rd_object(fp);
268 fclose(fp);
269 if (v == NULL || !is_codeobject(v)) {
270 XDECREF(v);
271 err_setstr(ImportError,
272 "Bad code object in .pyc file");
273 return NULL;
274 }
275 co = (codeobject *)v;
276 if (verbose)
277 fprintf(stderr,
278 "import %s # precompiled from %s\n",
279 name, namebuf);
280 break;
281
282#ifdef USE_DL
283 case C_EXTENSION:
284 {
285 char funcname[258];
286 dl_funcptr p;
287 fclose(fp);
288 sprintf(funcname, "init%s", name);
289#ifdef SUN_SHLIB
290 {
291 void *handle = dlopen (namebuf, 1);
292 p = (dl_funcptr) dlsym(handle, funcname);
293 }
294#else
295 p = dl_loadmod(argv0, namebuf, funcname);
296#endif /* SUN_SHLIB */
297 if (p == NULL) {
298 err_setstr(ImportError,
299 "dynamic module does not define init function");
300 return NULL;
301 } else {
302 (*p)();
303 *m_ret = m = dictlookup(modules, name);
304 if (m == NULL) {
305 err_setstr(SystemError,
306 "dynamic module not initialized properly");
307 return NULL;
308 } else {
309 if (verbose)
310 fprintf(stderr,
311 "import %s # dynamically loaded from %s\n",
312 name, namebuf);
313 INCREF(None);
314 return None;
315 }
316 }
317 break;
318 }
319#endif /* USE_DL */
320
321 default:
322 fclose(fp);
323 err_setstr(SystemError,
324 "search loop returned unexpected result");
325 return NULL;
326
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000327 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000328
329 /* We get here for either PY_SOURCE or PY_COMPILED */
330 if (m == NULL) {
331 m = add_module(name);
332 if (m == NULL) {
333 freetree(n);
334 return NULL;
335 }
336 *m_ret = m;
337 }
338 d = getmoduledict(m);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000339 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000340 DECREF(co);
341 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342}
343
344static object *
345load_module(name)
346 char *name;
347{
348 object *m, *v;
349 v = get_module((object *)NULL, name, &m);
350 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000351 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 DECREF(v);
353 return m;
354}
355
356object *
357import_module(name)
358 char *name;
359{
360 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000361 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000362 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000363 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
364 if (n < 0)
365 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000366 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000367 err_setstr(SystemError,
368 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000369 }
370 else {
371 m = load_module(name);
372 }
373 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 return m;
375}
376
377object *
378reload_module(m)
379 object *m;
380{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000381 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382 if (m == NULL || !is_moduleobject(m)) {
383 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000384 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000386 name = getmodulename(m);
387 if (name == NULL)
388 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 /* XXX Ought to check for builtin modules -- can't reload these... */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000390 return get_module(m, name, (object **)NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391}
392
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393void
394doneimport()
395{
396 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000397 int pos;
398 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 /* Explicitly erase all modules; this is the safest way
400 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000401 pos = 0;
402 while (mappinggetnext(modules, &pos, &modname, &module)) {
403 if (is_moduleobject(module)) {
404 object *dict;
405 dict = getmoduledict(module);
406 if (dict != NULL && is_dictobject(dict))
407 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408 }
409 }
Guido van Rossum25831651993-05-19 14:50:45 +0000410 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 }
412 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000413 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000414}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000415
416
417/* Initialize built-in modules when first imported */
418
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000419static int
420init_builtin(name)
421 char *name;
422{
423 int i;
424 for (i = 0; inittab[i].name != NULL; i++) {
425 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000426 if (verbose)
427 fprintf(stderr, "import %s # builtin\n",
428 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000429 (*inittab[i].initfunc)();
430 return 1;
431 }
432 }
433 return 0;
434}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000435
436extern struct frozen {
437 char *name;
438 char *code;
439 int size;
440} frozen_modules[];
441
442int
443init_frozen(name)
444 char *name;
445{
446 struct frozen *p;
447 codeobject *co;
448 object *m, *d, *v;
449 for (p = frozen_modules; ; p++) {
450 if (p->name == NULL)
451 return 0;
452 if (strcmp(p->name, name) == 0)
453 break;
454 }
455 if (verbose)
456 fprintf(stderr, "import %s # frozen\n", name);
457 co = (codeobject *) rds_object(p->code, p->size);
458 if (co == NULL)
459 return -1;
460 if ((m = add_module(name)) == NULL ||
461 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000462 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000463 DECREF(co);
464 return -1;
465 }
466 DECREF(co);
467 DECREF(v);
468 return 1;
469}