blob: b81a41e463bfaf5afd8f8c16721735fc7c1062b9 [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);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000231 goto read_py;
232 }
233 if (magic == MAGIC) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000234 v = rd_object(fpc);
Guido van Rossum21d335e1993-10-15 13:01:11 +0000235 if (v == NULL || err_occurred() ||
236 !is_codeobject(v)) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000237 err_clear();
238 XDECREF(v);
239 }
240 else
241 co = (codeobject *)v;
242 }
243 fclose(fpc);
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000244 if (verbose) {
245 if (co != NULL)
246 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000247 "import %s # precompiled from \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000248 name, namebuf);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000249 else {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000250 fprintf(stderr,
Guido van Rossum21d335e1993-10-15 13:01:11 +0000251 "# invalid precompiled file \"%s\"\n",
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000252 namebuf);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000253 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000254 }
Guido van Rossum5a2a6831993-10-25 09:59:04 +0000255 if (co == NULL)
256 goto read_py;
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000257 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000258 else {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000259read_py:
260 if ((fp = find_module(name, PY_SUFFIX, "r",
261 namebuf, &mtime)) != NULL) {
262 namelen = strlen(namebuf);
263 if (co == NULL) {
264 if (verbose)
265 fprintf(stderr,
266 "import %s # from \"%s\"\n",
267 name, namebuf);
268 err = parse_file(fp, namebuf, file_input, &n);
269 } else
270 err = E_DONE;
271 fclose(fp);
272 if (err != E_DONE) {
273 err_input(err);
274 return NULL;
275 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000276 }
277 else {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000278 if (m == NULL) {
279 sprintf(namebuf, "no module named %.200s",
280 name);
281 err_setstr(ImportError, namebuf);
282 }
283 else {
284 sprintf(namebuf, "no source for module %.200s",
285 name);
286 err_setstr(ImportError, namebuf);
287 }
288 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000289 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000290 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 if (m == NULL) {
292 m = add_module(name);
293 if (m == NULL) {
294 freetree(n);
295 return NULL;
296 }
297 *m_ret = m;
298 }
299 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000300 if (co == NULL) {
301 co = compile(n, namebuf);
302 freetree(n);
303 if (co == NULL)
304 return NULL;
305 /* Now write the code object to the ".pyc" file */
306 namebuf[namelen] = 'c';
307 namebuf[namelen+1] = '\0';
308 fpc = fopen(namebuf, "wb");
309 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000310 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000311 /* First write a 0 for mtime */
312 wr_long(0L, fpc);
313 wr_object((object *)co, fpc);
314 if (ferror(fpc)) {
315 /* Don't keep partial file */
316 fclose(fpc);
317 (void) unlink(namebuf);
318 }
319 else {
320 /* Now write the true mtime */
321 fseek(fpc, 4L, 0);
322 wr_long(mtime, fpc);
323 fflush(fpc);
324 fclose(fpc);
325 }
326 }
327 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000328 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000329 DECREF(co);
330 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000331}
332
333static object *
334load_module(name)
335 char *name;
336{
337 object *m, *v;
338 v = get_module((object *)NULL, name, &m);
339 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000340 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 DECREF(v);
342 return m;
343}
344
345object *
346import_module(name)
347 char *name;
348{
349 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000350 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000351 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000352 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
353 if (n < 0)
354 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000355 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000356 err_setstr(SystemError,
357 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000358 }
359 else {
360 m = load_module(name);
361 }
362 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363 return m;
364}
365
366object *
367reload_module(m)
368 object *m;
369{
370 if (m == NULL || !is_moduleobject(m)) {
371 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000372 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000373 }
374 /* XXX Ought to check for builtin modules -- can't reload these... */
375 return get_module(m, getmodulename(m), (object **)NULL);
376}
377
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378void
379doneimport()
380{
381 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000382 int pos;
383 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000384 /* Explicitly erase all modules; this is the safest way
385 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000386 pos = 0;
387 while (mappinggetnext(modules, &pos, &modname, &module)) {
388 if (is_moduleobject(module)) {
389 object *dict;
390 dict = getmoduledict(module);
391 if (dict != NULL && is_dictobject(dict))
392 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393 }
394 }
Guido van Rossum25831651993-05-19 14:50:45 +0000395 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 }
397 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000398 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000399}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000400
401
402/* Initialize built-in modules when first imported */
403
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000404static int
405init_builtin(name)
406 char *name;
407{
408 int i;
409 for (i = 0; inittab[i].name != NULL; i++) {
410 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000411 if (verbose)
412 fprintf(stderr, "import %s # builtin\n",
413 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000414 (*inittab[i].initfunc)();
415 return 1;
416 }
417 }
418 return 0;
419}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000420
421extern struct frozen {
422 char *name;
423 char *code;
424 int size;
425} frozen_modules[];
426
427int
428init_frozen(name)
429 char *name;
430{
431 struct frozen *p;
432 codeobject *co;
433 object *m, *d, *v;
434 for (p = frozen_modules; ; p++) {
435 if (p->name == NULL)
436 return 0;
437 if (strcmp(p->name, name) == 0)
438 break;
439 }
440 if (verbose)
441 fprintf(stderr, "import %s # frozen\n", name);
442 co = (codeobject *) rds_object(p->code, p->size);
443 if (co == NULL)
444 return -1;
445 if ((m = add_module(name)) == NULL ||
446 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000447 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000448 DECREF(co);
449 return -1;
450 }
451 DECREF(co);
452 DECREF(v);
453 return 1;
454}