blob: 2fc3995a01f6b6f6188d56a050f9296af11cf38c [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 Rossumc45611d1993-11-17 22:58:56 +0000177 strcat(namebuf, "c");
178 fpc = fopen(namebuf, "rb");
179 if (fpc != NULL) {
180 magic = rd_long(fpc);
181 if (magic != MAGIC) {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000182 if (verbose)
183 fprintf(stderr,
Guido van Rossumc45611d1993-11-17 22:58:56 +0000184 "# %s.pyc has bad magic\n",
185 name);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000186 }
187 else {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000188 pyc_mtime = rd_long(fpc);
189 if (pyc_mtime != mtime) {
190 if (verbose)
191 fprintf(stderr,
192 "# %s.pyc has bad mtime\n",
193 name);
194 }
195 else {
196 fclose(fp);
197 fp = fpc;
198 if (verbose)
199 fprintf(stderr,
200 "# %s.pyc matches %s.py\n",
201 name, name);
202 goto use_compiled;
203 }
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000204 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000205 fclose(fpc);
206 }
207 err = parse_file(fp, namebuf, file_input, &n);
208 if (err != E_DONE) {
209 err_input(err);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000210 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000211 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000212 co = compile(n, namebuf);
213 freetree(n);
214 if (co == NULL)
215 return NULL;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000216 if (verbose)
217 fprintf(stderr,
218 "import %s # from %.*s\n",
219 name, strlen(namebuf)-1, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000220 /* Now write the code object to the ".pyc" file */
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000221 fpc = fopen(namebuf, "wb");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000222 if (fpc == NULL) {
223 if (verbose)
224 fprintf(stderr,
225 "# can't create %s\n", namebuf);
226 }
227 else {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000228 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000229 /* First write a 0 for mtime */
230 wr_long(0L, fpc);
231 wr_object((object *)co, fpc);
232 if (ferror(fpc)) {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000233 if (verbose)
234 fprintf(stderr,
235 "# can't write %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000236 /* Don't keep partial file */
237 fclose(fpc);
238 (void) unlink(namebuf);
239 }
240 else {
241 /* Now write the true mtime */
242 fseek(fpc, 4L, 0);
243 wr_long(mtime, fpc);
244 fflush(fpc);
245 fclose(fpc);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000246 if (verbose)
247 fprintf(stderr,
248 "# wrote %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000249 }
250 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000251 break;
252
253 case PY_COMPILED:
254 if (verbose)
255 fprintf(stderr, "# %s.pyc without %s.py\n",
256 name, name);
257 magic = rd_long(fp);
258 if (magic != MAGIC) {
259 err_setstr(ImportError,
260 "Bad magic number in .pyc file");
261 return NULL;
262 }
263 (void) rd_long(fp);
264 use_compiled:
265 v = rd_object(fp);
266 fclose(fp);
267 if (v == NULL || !is_codeobject(v)) {
268 XDECREF(v);
269 err_setstr(ImportError,
270 "Bad code object in .pyc file");
271 return NULL;
272 }
273 co = (codeobject *)v;
274 if (verbose)
275 fprintf(stderr,
276 "import %s # precompiled from %s\n",
277 name, namebuf);
278 break;
279
280#ifdef USE_DL
281 case C_EXTENSION:
282 {
283 char funcname[258];
284 dl_funcptr p;
285 fclose(fp);
286 sprintf(funcname, "init%s", name);
287#ifdef SUN_SHLIB
288 {
289 void *handle = dlopen (namebuf, 1);
290 p = (dl_funcptr) dlsym(handle, funcname);
291 }
292#else
293 p = dl_loadmod(argv0, namebuf, funcname);
294#endif /* SUN_SHLIB */
295 if (p == NULL) {
296 err_setstr(ImportError,
297 "dynamic module does not define init function");
298 return NULL;
299 } else {
300 (*p)();
301 *m_ret = m = dictlookup(modules, name);
302 if (m == NULL) {
303 err_setstr(SystemError,
304 "dynamic module not initialized properly");
305 return NULL;
306 } else {
307 if (verbose)
308 fprintf(stderr,
309 "import %s # dynamically loaded from %s\n",
310 name, namebuf);
311 INCREF(None);
312 return None;
313 }
314 }
315 break;
316 }
317#endif /* USE_DL */
318
319 default:
320 fclose(fp);
321 err_setstr(SystemError,
322 "search loop returned unexpected result");
323 return NULL;
324
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000325 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000326
327 /* We get here for either PY_SOURCE or PY_COMPILED */
328 if (m == NULL) {
329 m = add_module(name);
330 if (m == NULL) {
331 freetree(n);
332 return NULL;
333 }
334 *m_ret = m;
335 }
336 d = getmoduledict(m);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000337 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000338 DECREF(co);
339 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340}
341
342static object *
343load_module(name)
344 char *name;
345{
346 object *m, *v;
347 v = get_module((object *)NULL, name, &m);
348 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000349 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000350 DECREF(v);
351 return m;
352}
353
354object *
355import_module(name)
356 char *name;
357{
358 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000359 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000360 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000361 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
362 if (n < 0)
363 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000364 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000365 err_setstr(SystemError,
366 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000367 }
368 else {
369 m = load_module(name);
370 }
371 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 return m;
373}
374
375object *
376reload_module(m)
377 object *m;
378{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000379 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380 if (m == NULL || !is_moduleobject(m)) {
381 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000382 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000384 name = getmodulename(m);
385 if (name == NULL)
386 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 /* XXX Ought to check for builtin modules -- can't reload these... */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000388 return get_module(m, name, (object **)NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389}
390
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391void
392doneimport()
393{
394 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000395 int pos;
396 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397 /* Explicitly erase all modules; this is the safest way
398 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000399 pos = 0;
400 while (mappinggetnext(modules, &pos, &modname, &module)) {
401 if (is_moduleobject(module)) {
402 object *dict;
403 dict = getmoduledict(module);
404 if (dict != NULL && is_dictobject(dict))
405 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406 }
407 }
Guido van Rossum25831651993-05-19 14:50:45 +0000408 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 }
410 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000411 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000412}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000413
414
415/* Initialize built-in modules when first imported */
416
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000417static int
418init_builtin(name)
419 char *name;
420{
421 int i;
422 for (i = 0; inittab[i].name != NULL; i++) {
423 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000424 if (verbose)
425 fprintf(stderr, "import %s # builtin\n",
426 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000427 (*inittab[i].initfunc)();
428 return 1;
429 }
430 }
431 return 0;
432}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000433
434extern struct frozen {
435 char *name;
436 char *code;
437 int size;
438} frozen_modules[];
439
440int
441init_frozen(name)
442 char *name;
443{
444 struct frozen *p;
445 codeobject *co;
446 object *m, *d, *v;
447 for (p = frozen_modules; ; p++) {
448 if (p->name == NULL)
449 return 0;
450 if (strcmp(p->name, name) == 0)
451 break;
452 }
453 if (verbose)
454 fprintf(stderr, "import %s # frozen\n", name);
455 co = (codeobject *) rds_object(p->code, p->size);
456 if (co == NULL)
457 return -1;
458 if ((m = add_module(name)) == NULL ||
459 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000460 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000461 DECREF(co);
462 return -1;
463 }
464 DECREF(co);
465 DECREF(v);
466 return 1;
467}