blob: c0f163ae6ca7a6904dbddf0c316ba0d502399443 [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 goto read_py;
254 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000255 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000256 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000257 else {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000258read_py:
259 if ((fp = find_module(name, PY_SUFFIX, "r",
260 namebuf, &mtime)) != NULL) {
261 namelen = strlen(namebuf);
262 if (co == NULL) {
263 if (verbose)
264 fprintf(stderr,
265 "import %s # from \"%s\"\n",
266 name, namebuf);
267 err = parse_file(fp, namebuf, file_input, &n);
268 } else
269 err = E_DONE;
270 fclose(fp);
271 if (err != E_DONE) {
272 err_input(err);
273 return NULL;
274 }
Guido van Rossum21d335e1993-10-15 13:01:11 +0000275 }
276 else {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000277 if (m == NULL) {
278 sprintf(namebuf, "no module named %.200s",
279 name);
280 err_setstr(ImportError, namebuf);
281 }
282 else {
283 sprintf(namebuf, "no source for module %.200s",
284 name);
285 err_setstr(ImportError, namebuf);
286 }
287 return NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000288 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000289 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 if (m == NULL) {
291 m = add_module(name);
292 if (m == NULL) {
293 freetree(n);
294 return NULL;
295 }
296 *m_ret = m;
297 }
298 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000299 if (co == NULL) {
300 co = compile(n, namebuf);
301 freetree(n);
302 if (co == NULL)
303 return NULL;
304 /* Now write the code object to the ".pyc" file */
305 namebuf[namelen] = 'c';
306 namebuf[namelen+1] = '\0';
307 fpc = fopen(namebuf, "wb");
308 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000309 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000310 /* First write a 0 for mtime */
311 wr_long(0L, fpc);
312 wr_object((object *)co, fpc);
313 if (ferror(fpc)) {
314 /* Don't keep partial file */
315 fclose(fpc);
316 (void) unlink(namebuf);
317 }
318 else {
319 /* Now write the true mtime */
320 fseek(fpc, 4L, 0);
321 wr_long(mtime, fpc);
322 fflush(fpc);
323 fclose(fpc);
324 }
325 }
326 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000327 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000328 DECREF(co);
329 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330}
331
332static object *
333load_module(name)
334 char *name;
335{
336 object *m, *v;
337 v = get_module((object *)NULL, name, &m);
338 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000339 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340 DECREF(v);
341 return m;
342}
343
344object *
345import_module(name)
346 char *name;
347{
348 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000349 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000350 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000351 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
352 if (n < 0)
353 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000354 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000355 err_setstr(SystemError,
356 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000357 }
358 else {
359 m = load_module(name);
360 }
361 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362 return m;
363}
364
365object *
366reload_module(m)
367 object *m;
368{
369 if (m == NULL || !is_moduleobject(m)) {
370 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000371 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 }
373 /* XXX Ought to check for builtin modules -- can't reload these... */
374 return get_module(m, getmodulename(m), (object **)NULL);
375}
376
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377void
378doneimport()
379{
380 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000381 int pos;
382 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 /* Explicitly erase all modules; this is the safest way
384 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000385 pos = 0;
386 while (mappinggetnext(modules, &pos, &modname, &module)) {
387 if (is_moduleobject(module)) {
388 object *dict;
389 dict = getmoduledict(module);
390 if (dict != NULL && is_dictobject(dict))
391 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 }
393 }
Guido van Rossum25831651993-05-19 14:50:45 +0000394 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 }
396 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000397 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000398}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000399
400
401/* Initialize built-in modules when first imported */
402
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000403static int
404init_builtin(name)
405 char *name;
406{
407 int i;
408 for (i = 0; inittab[i].name != NULL; i++) {
409 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000410 if (verbose)
411 fprintf(stderr, "import %s # builtin\n",
412 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000413 (*inittab[i].initfunc)();
414 return 1;
415 }
416 }
417 return 0;
418}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000419
420extern struct frozen {
421 char *name;
422 char *code;
423 int size;
424} frozen_modules[];
425
426int
427init_frozen(name)
428 char *name;
429{
430 struct frozen *p;
431 codeobject *co;
432 object *m, *d, *v;
433 for (p = frozen_modules; ; p++) {
434 if (p->name == NULL)
435 return 0;
436 if (strcmp(p->name, name) == 0)
437 break;
438 }
439 if (verbose)
440 fprintf(stderr, "import %s # frozen\n", name);
441 co = (codeobject *) rds_object(p->code, p->size);
442 if (co == NULL)
443 return -1;
444 if ((m = add_module(name)) == NULL ||
445 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000446 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000447 DECREF(co);
448 return -1;
449 }
450 DECREF(co);
451 DECREF(v);
452 return 1;
453}