blob: 284d881f208630b3a33293839422d9b1a47c4e0f [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 Rossum25831651993-05-19 14:50:45 +000064#define MAGIC 0x999901L /* 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 Rossum21d335e1993-10-15 13:01:11 +0000104/* Suffixes used by find_module: */
Guido van Rossume25c2561992-01-19 16:28:21 +0000105
106#define PY_SUFFIX ".py"
Guido van Rossum21d335e1993-10-15 13:01:11 +0000107#define PYC_SUFFIX ".pyc"
Guido van Rossume25c2561992-01-19 16:28:21 +0000108#ifdef USE_DL
Guido van Rossum21d335e1993-10-15 13:01:11 +0000109#ifdef SUN_SHLIB
110#define O_SUFFIX "module.so"
111#else
Guido van Rossume25c2561992-01-19 16:28:21 +0000112#define O_SUFFIX "module.o"
Guido van Rossum21d335e1993-10-15 13:01:11 +0000113#endif /* SUN_SHLIB */
Guido van Rossume25c2561992-01-19 16:28:21 +0000114#endif
115
Guido van Rossum21d335e1993-10-15 13:01:11 +0000116/* This will search for a module named 'name' with the extension 'ext'
117 and return it in 'namebuf' and return the mtime of each in 'mtime'.
118 It returns a file pointer opened for 'mode' if successful, NULL if
119 unsuccessful.
120 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121static FILE *
Guido van Rossum21d335e1993-10-15 13:01:11 +0000122find_module(name, ext, mode, namebuf, mtime)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123 char *name;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000124 char *ext;
125 char *mode;
126 char *namebuf;
127 long *mtime;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128{
129 object *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 FILE *fp;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000131
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 path = sysget("path");
133 if (path == NULL || !is_listobject(path)) {
Guido van Rossume25c2561992-01-19 16:28:21 +0000134 /* No path -- at least try current directory */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 strcpy(namebuf, name);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000136 strcat(namebuf, ext);
137 if ((fp = fopen(namebuf, mode)) == NULL)
Guido van Rossume25c2561992-01-19 16:28:21 +0000138 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000139 *mtime = getmtime(namebuf);
140 return fp;
141 } else {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142 int npath = getlistsize(path);
143 int i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 for (i = 0; i < npath; i++) {
145 object *v = getlistitem(path, i);
146 int len;
147 if (!is_stringobject(v))
148 continue;
149 strcpy(namebuf, getstringvalue(v));
150 len = getstringsize(v);
151 if (len > 0 && namebuf[len-1] != SEP)
152 namebuf[len++] = SEP;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000153 strcpy(namebuf+len, name);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000154 strcat(namebuf, ext);
155 if ((fp = fopen(namebuf, mode)) == NULL)
156 continue;
157 *mtime = getmtime(namebuf);
158 return fp;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 }
160 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000161 namebuf[0] = '\0';
162 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163}
164
165static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166get_module(m, name, m_ret)
167 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000169 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170{
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000171 codeobject *co = NULL;
172 object *v, *d;
173 FILE *fp, *fpc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174 node *n;
175 int err;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000176 char namebuf[MAXPATHLEN+1];
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000177 int namelen;
178 long mtime;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000179
Guido van Rossume25c2561992-01-19 16:28:21 +0000180#ifdef USE_DL
Guido van Rossum21d335e1993-10-15 13:01:11 +0000181 if ((fpc = find_module(name, O_SUFFIX, "rb",
182 namebuf, &mtime)) != NULL) {
183 char funcname[258];
184 dl_funcptr p;
185 D(fprintf(stderr, "Found %s\n", namebuf));
186 fclose(fpc);
187 sprintf(funcname, "init%s", name);
188#ifdef SUN_SHLIB
189 {
190 void *handle = dlopen (namebuf, 1);
191 p = (dl_funcptr) dlsym(handle, funcname);
192 }
193#else
194 p = dl_loadmod(argv0, namebuf, funcname);
195#endif /* SUN_SHLIB */
196 if (p == NULL) {
197 D(fprintf(stderr, "dl_loadmod failed\n"));
198 } else {
199 if (verbose)
200 fprintf(stderr,
201 "import %s # dynamically loaded from \"%s\"\n",
202 name, namebuf);
203 (*p)();
204 *m_ret = m = dictlookup(modules, name);
205 if (m == NULL) {
206 err_setstr(SystemError,
207 "dynamic module missing");
208 return NULL;
209 } else {
210 D(fprintf(stderr,
211 "module %s loaded!\n", name));
212 INCREF(None);
213 return None;
Guido van Rossume25c2561992-01-19 16:28:21 +0000214 }
215 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000216 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000217 else
218#endif
219 if ((fpc = find_module(name, PYC_SUFFIX, "rb",
220 namebuf, &mtime)) != NULL) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000221 long pyc_mtime;
Guido van Rossum3ddee711991-12-16 13:06:34 +0000222 long magic;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000223 namebuf[(strlen(namebuf)-1)] = '\0';
224 mtime = getmtime(namebuf);
Guido van Rossum3ddee711991-12-16 13:06:34 +0000225 magic = rd_long(fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000226 pyc_mtime = rd_long(fpc);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000227 if (mtime != -1 && mtime > pyc_mtime) {
228 fclose(fpc);
229 fp = fopen(namebuf, "rb");
230 goto read_py;
231 }
232 if (magic == MAGIC) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000233 v = rd_object(fpc);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000234 if (v == NULL || err_occurred() ||
235 !is_codeobject(v)) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000236 err_clear();
237 XDECREF(v);
238 }
239 else
240 co = (codeobject *)v;
241 }
242 fclose(fpc);
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000243 if (verbose) {
244 if (co != NULL)
245 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000246 "import %s # precompiled from \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000247 name, namebuf);
248 else
249 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000250 "# invalid precompiled file \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000251 namebuf);
252 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000253 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000254 else if ((fp = find_module(name, PY_SUFFIX, "r",
255 namebuf, &mtime)) != NULL) {
256read_py:
257 namelen = strlen(namebuf);
258 if (co == NULL) {
259 if (verbose)
260 fprintf(stderr,
261 "import %s # from \"%s\"\n",
262 name, namebuf);
263 err = parse_file(fp, namebuf, file_input, &n);
264 } else
265 err = E_DONE;
266 fclose(fp);
267 if (err != E_DONE) {
268 err_input(err);
269 return NULL;
270 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000271 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000272 else {
273 if (m == NULL) {
274 sprintf(namebuf, "no module named %.200s", name);
275 err_setstr(ImportError, namebuf);
276 }
277 else {
278 sprintf(namebuf, "no source for module %.200s", name);
279 err_setstr(ImportError, namebuf);
280 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000281 return NULL;
282 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 if (m == NULL) {
284 m = add_module(name);
285 if (m == NULL) {
286 freetree(n);
287 return NULL;
288 }
289 *m_ret = m;
290 }
291 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000292 if (co == NULL) {
293 co = compile(n, namebuf);
294 freetree(n);
295 if (co == NULL)
296 return NULL;
297 /* Now write the code object to the ".pyc" file */
298 namebuf[namelen] = 'c';
299 namebuf[namelen+1] = '\0';
300 fpc = fopen(namebuf, "wb");
301 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000302 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000303 /* First write a 0 for mtime */
304 wr_long(0L, fpc);
305 wr_object((object *)co, fpc);
306 if (ferror(fpc)) {
307 /* Don't keep partial file */
308 fclose(fpc);
309 (void) unlink(namebuf);
310 }
311 else {
312 /* Now write the true mtime */
313 fseek(fpc, 4L, 0);
314 wr_long(mtime, fpc);
315 fflush(fpc);
316 fclose(fpc);
317 }
318 }
319 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000320 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000321 DECREF(co);
322 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000323}
324
325static object *
326load_module(name)
327 char *name;
328{
329 object *m, *v;
330 v = get_module((object *)NULL, name, &m);
331 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000332 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333 DECREF(v);
334 return m;
335}
336
337object *
338import_module(name)
339 char *name;
340{
341 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000342 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000343 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000344 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
345 if (n < 0)
346 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000347 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000348 err_setstr(SystemError,
349 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000350 }
351 else {
352 m = load_module(name);
353 }
354 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 return m;
356}
357
358object *
359reload_module(m)
360 object *m;
361{
362 if (m == NULL || !is_moduleobject(m)) {
363 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000364 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000365 }
366 /* XXX Ought to check for builtin modules -- can't reload these... */
367 return get_module(m, getmodulename(m), (object **)NULL);
368}
369
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370void
371doneimport()
372{
373 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000374 int pos;
375 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376 /* Explicitly erase all modules; this is the safest way
377 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000378 pos = 0;
379 while (mappinggetnext(modules, &pos, &modname, &module)) {
380 if (is_moduleobject(module)) {
381 object *dict;
382 dict = getmoduledict(module);
383 if (dict != NULL && is_dictobject(dict))
384 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 }
386 }
Guido van Rossum25831651993-05-19 14:50:45 +0000387 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388 }
389 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000390 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000391}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000392
393
394/* Initialize built-in modules when first imported */
395
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000396static int
397init_builtin(name)
398 char *name;
399{
400 int i;
401 for (i = 0; inittab[i].name != NULL; i++) {
402 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000403 if (verbose)
404 fprintf(stderr, "import %s # builtin\n",
405 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000406 (*inittab[i].initfunc)();
407 return 1;
408 }
409 }
410 return 0;
411}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000412
413extern struct frozen {
414 char *name;
415 char *code;
416 int size;
417} frozen_modules[];
418
419int
420init_frozen(name)
421 char *name;
422{
423 struct frozen *p;
424 codeobject *co;
425 object *m, *d, *v;
426 for (p = frozen_modules; ; p++) {
427 if (p->name == NULL)
428 return 0;
429 if (strcmp(p->name, name) == 0)
430 break;
431 }
432 if (verbose)
433 fprintf(stderr, "import %s # frozen\n", name);
434 co = (codeobject *) rds_object(p->code, p->size);
435 if (co == NULL)
436 return -1;
437 if ((m = add_module(name)) == NULL ||
438 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000439 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000440 DECREF(co);
441 return -1;
442 }
443 DECREF(co);
444 DECREF(v);
445 return 1;
446}