blob: 4310afa1f8ceaba57a2956c5134c63fd9834d46f [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 Rossume25c2561992-01-19 16:28:21 +000043#ifdef DEBUG
44#define D(x) x
45#else
46#define D(x)
47#endif
48
49#ifdef USE_DL
50#include "dl.h"
51
Guido van Rossume0513de1992-01-26 18:15:22 +000052extern char *argv0;
Guido van Rossume25c2561992-01-19 16:28:21 +000053#endif
54
Guido van Rossumf56e3db1993-04-01 20:59:32 +000055/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum3ddee711991-12-16 13:06:34 +000056
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000057#define MAGIC 0x99BE3AL
Guido van Rossum3ddee711991-12-16 13:06:34 +000058
Guido van Rossum3f5da241990-12-20 15:06:42 +000059static object *modules;
60
Guido van Rossum66f1fa81991-04-03 19:03:52 +000061/* Forward */
62static int init_builtin PROTO((char *));
63
Guido van Rossum3f5da241990-12-20 15:06:42 +000064/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065
66void
67initimport()
68{
Guido van Rossum3f5da241990-12-20 15:06:42 +000069 if ((modules = newdictobject()) == NULL)
70 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
73object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000074get_modules()
75{
76 return modules;
77}
78
79object *
80add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081 char *name;
82{
83 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +000084 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
85 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 m = newmoduleobject(name);
87 if (m == NULL)
88 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 DECREF(m);
91 return NULL;
92 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000093 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094 return m;
95}
96
Guido van Rossume25c2561992-01-19 16:28:21 +000097/* Suffixes used by open_module: */
98
99#define PY_SUFFIX ".py"
100#ifdef USE_DL
101#define O_SUFFIX "module.o"
102#endif
103
104/* Find and open a module file, using sys.path.
105 Return a NULL pointer if no module file is found.
106 When dynamic loading is enabled, the contents of namebuf
107 is important when NULL is returned: if namebuf[0] != '\0'
108 a dl-able object file was found and namebuf is its pathname. */
109
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110static FILE *
Guido van Rossume25c2561992-01-19 16:28:21 +0000111open_module(name, namebuf)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000113 char *namebuf; /* XXX No buffer overflow checks! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
115 object *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 FILE *fp;
117
118 path = sysget("path");
119 if (path == NULL || !is_listobject(path)) {
Guido van Rossume25c2561992-01-19 16:28:21 +0000120 /* No path -- at least try current directory */
121#ifdef USE_DL
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 strcpy(namebuf, name);
Guido van Rossume25c2561992-01-19 16:28:21 +0000123 strcat(namebuf, O_SUFFIX);
124 if (getmtime(namebuf) > 0)
125 return NULL;
126#endif
127 strcpy(namebuf, name);
128 strcat(namebuf, PY_SUFFIX);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 fp = fopen(namebuf, "r");
130 }
131 else {
132 int npath = getlistsize(path);
133 int i;
134 fp = NULL;
135 for (i = 0; i < npath; i++) {
136 object *v = getlistitem(path, i);
137 int len;
138 if (!is_stringobject(v))
139 continue;
140 strcpy(namebuf, getstringvalue(v));
141 len = getstringsize(v);
142 if (len > 0 && namebuf[len-1] != SEP)
143 namebuf[len++] = SEP;
Guido van Rossume25c2561992-01-19 16:28:21 +0000144#ifdef USE_DL
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145 strcpy(namebuf+len, name);
Guido van Rossume25c2561992-01-19 16:28:21 +0000146 strcat(namebuf, O_SUFFIX);
147 if (getmtime(namebuf) > 0)
148 return NULL;
149#endif
150 strcpy(namebuf+len, name);
151 strcat(namebuf, PY_SUFFIX);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 fp = fopen(namebuf, "r");
153 if (fp != NULL)
154 break;
155 }
156 }
Guido van Rossume25c2561992-01-19 16:28:21 +0000157 if (fp == NULL)
158 namebuf[0] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 return fp;
160}
161
162static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000163get_module(m, name, m_ret)
164 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167{
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000168 codeobject *co = NULL;
169 object *v, *d;
170 FILE *fp, *fpc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 node *n;
172 int err;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000173 char namebuf[MAXPATHLEN+1];
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000174 int namelen;
175 long mtime;
176 extern long getmtime();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177
Guido van Rossume25c2561992-01-19 16:28:21 +0000178 fp = open_module(name, namebuf);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000179 if (fp == NULL) {
Guido van Rossume25c2561992-01-19 16:28:21 +0000180#ifdef USE_DL
181 if (namebuf[0] != '\0') {
182 char funcname[258];
183 dl_funcptr p;
184 D(fprintf(stderr, "Found %s\n", namebuf));
185 sprintf(funcname, "init%s", name);
Guido van Rossume0513de1992-01-26 18:15:22 +0000186 p = dl_loadmod(argv0, namebuf, funcname);
Guido van Rossume25c2561992-01-19 16:28:21 +0000187 if (p == NULL) {
188 D(fprintf(stderr, "dl_loadmod failed\n"));
189 }
190 else {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000191 if (verbose)
192 fprintf(stderr,
193 "import %s # dynamically loaded from \"%s\"\n",
194 name, namebuf);
Guido van Rossume25c2561992-01-19 16:28:21 +0000195 (*p)();
196 *m_ret = m = dictlookup(modules, name);
197 if (m == NULL) {
198 err_setstr(SystemError,
199 "dynamic module missing");
200 return NULL;
201 }
202 else {
203 D(fprintf(stderr,
204 "module %s loaded!\n", name));
205 INCREF(None);
206 return None;
207 }
208 }
209 }
210#endif
Guido van Rossum4135e781991-12-24 13:26:56 +0000211 if (m == NULL) {
212 sprintf(namebuf, "no module named %.200s", name);
213 err_setstr(ImportError, namebuf);
214 }
215 else {
216 sprintf(namebuf, "no source for module %.200s", name);
217 err_setstr(ImportError, namebuf);
218 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000219 return NULL;
220 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000221 /* Get mtime -- always useful */
222 mtime = getmtime(namebuf);
223 /* Check ".pyc" file first */
224 namelen = strlen(namebuf);
225 namebuf[namelen] = 'c';
226 namebuf[namelen+1] = '\0';
227 fpc = fopen(namebuf, "rb");
228 if (fpc != NULL) {
229 long pyc_mtime;
Guido van Rossum3ddee711991-12-16 13:06:34 +0000230 long magic;
231 magic = rd_long(fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000232 pyc_mtime = rd_long(fpc);
Guido van Rossum3ddee711991-12-16 13:06:34 +0000233 if (magic == MAGIC && pyc_mtime == mtime && mtime != 0 && mtime != -1) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000234 v = rd_object(fpc);
235 if (v == NULL || err_occurred() || !is_codeobject(v)) {
236 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,
246 "import %s # precompiled from \"%s\"\n",
247 name, namebuf);
248 else
249 fprintf(stderr,
250 "# invalid precompiled file \"%s\"\n",
251 namebuf);
252 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000253 }
254 namebuf[namelen] = '\0';
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000255 if (co == NULL) {
256 if (verbose)
257 fprintf(stderr,
258 "import %s # from \"%s\"\n",
259 name, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000260 err = parse_file(fp, namebuf, file_input, &n);
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000261 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000262 else
263 err = E_DONE;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000264 fclose(fp);
265 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000266 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000267 return NULL;
268 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000269 if (m == NULL) {
270 m = add_module(name);
271 if (m == NULL) {
272 freetree(n);
273 return NULL;
274 }
275 *m_ret = m;
276 }
277 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000278 if (co == NULL) {
279 co = compile(n, namebuf);
280 freetree(n);
281 if (co == NULL)
282 return NULL;
283 /* Now write the code object to the ".pyc" file */
284 namebuf[namelen] = 'c';
285 namebuf[namelen+1] = '\0';
286 fpc = fopen(namebuf, "wb");
287 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000288 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000289 /* First write a 0 for mtime */
290 wr_long(0L, fpc);
291 wr_object((object *)co, fpc);
292 if (ferror(fpc)) {
293 /* Don't keep partial file */
294 fclose(fpc);
295 (void) unlink(namebuf);
296 }
297 else {
298 /* Now write the true mtime */
299 fseek(fpc, 4L, 0);
300 wr_long(mtime, fpc);
301 fflush(fpc);
302 fclose(fpc);
303 }
304 }
305 }
306 v = eval_code(co, d, d, (object *)NULL);
307 DECREF(co);
308 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000309}
310
311static object *
312load_module(name)
313 char *name;
314{
315 object *m, *v;
316 v = get_module((object *)NULL, name, &m);
317 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000318 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 DECREF(v);
320 return m;
321}
322
323object *
324import_module(name)
325 char *name;
326{
327 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000328 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000329 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000330 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
331 if (n < 0)
332 return NULL;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000333 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000334 err_setstr(SystemError,
335 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000336 }
337 else {
338 m = load_module(name);
339 }
340 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 return m;
342}
343
344object *
345reload_module(m)
346 object *m;
347{
348 if (m == NULL || !is_moduleobject(m)) {
349 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000350 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 }
352 /* XXX Ought to check for builtin modules -- can't reload these... */
353 return get_module(m, getmodulename(m), (object **)NULL);
354}
355
356static void
357cleardict(d)
358 object *d;
359{
360 int i;
361 for (i = getdictsize(d); --i >= 0; ) {
362 char *k;
363 k = getdictkey(d, i);
364 if (k != NULL)
365 (void) dictremove(d, k);
366 }
367}
368
369void
370doneimport()
371{
372 if (modules != NULL) {
373 int i;
374 /* Explicitly erase all modules; this is the safest way
375 to get rid of at least *some* circular dependencies */
376 for (i = getdictsize(modules); --i >= 0; ) {
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000377 object *k;
378 k = getdict2key(modules, i);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379 if (k != NULL) {
380 object *m;
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000381 m = dict2lookup(modules, k);
382 if (m == NULL)
383 err_clear();
384 else if (is_moduleobject(m)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 object *d;
386 d = getmoduledict(m);
387 if (d != NULL && is_dictobject(d)) {
388 cleardict(d);
389 }
390 }
391 }
392 }
393 cleardict(modules);
394 }
395 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000396}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000397
398
399/* Initialize built-in modules when first imported */
400
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000401static int
402init_builtin(name)
403 char *name;
404{
405 int i;
406 for (i = 0; inittab[i].name != NULL; i++) {
407 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000408 if (verbose)
409 fprintf(stderr, "import %s # builtin\n",
410 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000411 (*inittab[i].initfunc)();
412 return 1;
413 }
414 }
415 return 0;
416}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000417
418extern struct frozen {
419 char *name;
420 char *code;
421 int size;
422} frozen_modules[];
423
424int
425init_frozen(name)
426 char *name;
427{
428 struct frozen *p;
429 codeobject *co;
430 object *m, *d, *v;
431 for (p = frozen_modules; ; p++) {
432 if (p->name == NULL)
433 return 0;
434 if (strcmp(p->name, name) == 0)
435 break;
436 }
437 if (verbose)
438 fprintf(stderr, "import %s # frozen\n", name);
439 co = (codeobject *) rds_object(p->code, p->size);
440 if (co == NULL)
441 return -1;
442 if ((m = add_module(name)) == NULL ||
443 (d = getmoduledict(m)) == NULL ||
444 (v = eval_code(co, d, d, (object *)NULL)) == NULL) {
445 DECREF(co);
446 return -1;
447 }
448 DECREF(co);
449 DECREF(v);
450 return 1;
451}