blob: f0d4828ea0177e6ed36cfd1a192763c05c283353 [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 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
Guido van Rossumcacd9571993-10-18 11:44:47 +0000194 if (verbose)
195 fprintf(stderr,
196 "import %s # dynamically loaded from \"%s\"\n",
197 name, namebuf);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000198 p = dl_loadmod(argv0, namebuf, funcname);
199#endif /* SUN_SHLIB */
200 if (p == NULL) {
Guido van Rossumcacd9571993-10-18 11:44:47 +0000201 err_setstr(SystemError,
202 "dynamic module does not define init function");
203 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000204 } else {
Guido van Rossum21d335e1993-10-15 13:01:11 +0000205 (*p)();
206 *m_ret = m = dictlookup(modules, name);
207 if (m == NULL) {
208 err_setstr(SystemError,
Guido van Rossumcacd9571993-10-18 11:44:47 +0000209 "dynamic module not initialized properly");
Guido van Rossum21d335e1993-10-15 13:01:11 +0000210 return NULL;
211 } else {
212 D(fprintf(stderr,
213 "module %s loaded!\n", name));
214 INCREF(None);
215 return None;
Guido van Rossume25c2561992-01-19 16:28:21 +0000216 }
217 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000218 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000219 else
220#endif
221 if ((fpc = find_module(name, PYC_SUFFIX, "rb",
222 namebuf, &mtime)) != NULL) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000223 long pyc_mtime;
Guido van Rossum3ddee711991-12-16 13:06:34 +0000224 long magic;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000225 namebuf[(strlen(namebuf)-1)] = '\0';
226 mtime = getmtime(namebuf);
Guido van Rossum3ddee711991-12-16 13:06:34 +0000227 magic = rd_long(fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000228 pyc_mtime = rd_long(fpc);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000229 if (mtime != -1 && mtime > pyc_mtime) {
230 fclose(fpc);
231 fp = fopen(namebuf, "rb");
232 goto read_py;
233 }
234 if (magic == MAGIC) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000235 v = rd_object(fpc);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000236 if (v == NULL || err_occurred() ||
237 !is_codeobject(v)) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000238 err_clear();
239 XDECREF(v);
240 }
241 else
242 co = (codeobject *)v;
243 }
244 fclose(fpc);
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000245 if (verbose) {
246 if (co != NULL)
247 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000248 "import %s # precompiled from \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000249 name, namebuf);
250 else
251 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000252 "# invalid precompiled file \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000253 namebuf);
254 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000255 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000256 else if ((fp = find_module(name, PY_SUFFIX, "r",
257 namebuf, &mtime)) != NULL) {
258read_py:
259 namelen = strlen(namebuf);
260 if (co == NULL) {
261 if (verbose)
262 fprintf(stderr,
263 "import %s # from \"%s\"\n",
264 name, namebuf);
265 err = parse_file(fp, namebuf, file_input, &n);
266 } else
267 err = E_DONE;
268 fclose(fp);
269 if (err != E_DONE) {
270 err_input(err);
271 return NULL;
272 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000273 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000274 else {
275 if (m == NULL) {
276 sprintf(namebuf, "no module named %.200s", name);
277 err_setstr(ImportError, namebuf);
278 }
279 else {
280 sprintf(namebuf, "no source for module %.200s", name);
281 err_setstr(ImportError, namebuf);
282 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000283 return NULL;
284 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 if (m == NULL) {
286 m = add_module(name);
287 if (m == NULL) {
288 freetree(n);
289 return NULL;
290 }
291 *m_ret = m;
292 }
293 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000294 if (co == NULL) {
295 co = compile(n, namebuf);
296 freetree(n);
297 if (co == NULL)
298 return NULL;
299 /* Now write the code object to the ".pyc" file */
300 namebuf[namelen] = 'c';
301 namebuf[namelen+1] = '\0';
302 fpc = fopen(namebuf, "wb");
303 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000304 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000305 /* First write a 0 for mtime */
306 wr_long(0L, fpc);
307 wr_object((object *)co, fpc);
308 if (ferror(fpc)) {
309 /* Don't keep partial file */
310 fclose(fpc);
311 (void) unlink(namebuf);
312 }
313 else {
314 /* Now write the true mtime */
315 fseek(fpc, 4L, 0);
316 wr_long(mtime, fpc);
317 fflush(fpc);
318 fclose(fpc);
319 }
320 }
321 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000322 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000323 DECREF(co);
324 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325}
326
327static object *
328load_module(name)
329 char *name;
330{
331 object *m, *v;
332 v = get_module((object *)NULL, name, &m);
333 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000334 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 DECREF(v);
336 return m;
337}
338
339object *
340import_module(name)
341 char *name;
342{
343 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000344 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000345 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000346 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
347 if (n < 0)
348 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000349 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000350 err_setstr(SystemError,
351 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000352 }
353 else {
354 m = load_module(name);
355 }
356 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 return m;
358}
359
360object *
361reload_module(m)
362 object *m;
363{
364 if (m == NULL || !is_moduleobject(m)) {
365 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000366 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000367 }
368 /* XXX Ought to check for builtin modules -- can't reload these... */
369 return get_module(m, getmodulename(m), (object **)NULL);
370}
371
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372void
373doneimport()
374{
375 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000376 int pos;
377 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378 /* Explicitly erase all modules; this is the safest way
379 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000380 pos = 0;
381 while (mappinggetnext(modules, &pos, &modname, &module)) {
382 if (is_moduleobject(module)) {
383 object *dict;
384 dict = getmoduledict(module);
385 if (dict != NULL && is_dictobject(dict))
386 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 }
388 }
Guido van Rossum25831651993-05-19 14:50:45 +0000389 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000390 }
391 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000392 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000393}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000394
395
396/* Initialize built-in modules when first imported */
397
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000398static int
399init_builtin(name)
400 char *name;
401{
402 int i;
403 for (i = 0; inittab[i].name != NULL; i++) {
404 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000405 if (verbose)
406 fprintf(stderr, "import %s # builtin\n",
407 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000408 (*inittab[i].initfunc)();
409 return 1;
410 }
411 }
412 return 0;
413}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000414
415extern struct frozen {
416 char *name;
417 char *code;
418 int size;
419} frozen_modules[];
420
421int
422init_frozen(name)
423 char *name;
424{
425 struct frozen *p;
426 codeobject *co;
427 object *m, *d, *v;
428 for (p = frozen_modules; ; p++) {
429 if (p->name == NULL)
430 return 0;
431 if (strcmp(p->name, name) == 0)
432 break;
433 }
434 if (verbose)
435 fprintf(stderr, "import %s # frozen\n", name);
436 co = (codeobject *) rds_object(p->code, p->size);
437 if (co == NULL)
438 return -1;
439 if ((m = add_module(name)) == NULL ||
440 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000441 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000442 DECREF(co);
443 return -1;
444 }
445 DECREF(co);
446 DECREF(v);
447 return 1;
448}