blob: 44f6d7bdceb2756a6e5824aca349bb98eaa4dec3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
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 Rossum3ddee711991-12-16 13:06:34 +000055/* Magic word to reject pre-0.9.4 .pyc files */
56
57#define MAGIC 0x949494L
58
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 Rossum7f133ed1991-02-19 12:23:57 +0000328 if ((m = dictlookup(modules, name)) == NULL) {
329 if (init_builtin(name)) {
330 if ((m = dictlookup(modules, name)) == NULL)
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000331 err_setstr(SystemError,
332 "builtin module missing");
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000333 }
334 else {
335 m = load_module(name);
336 }
337 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338 return m;
339}
340
341object *
342reload_module(m)
343 object *m;
344{
345 if (m == NULL || !is_moduleobject(m)) {
346 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000347 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 }
349 /* XXX Ought to check for builtin modules -- can't reload these... */
350 return get_module(m, getmodulename(m), (object **)NULL);
351}
352
353static void
354cleardict(d)
355 object *d;
356{
357 int i;
358 for (i = getdictsize(d); --i >= 0; ) {
359 char *k;
360 k = getdictkey(d, i);
361 if (k != NULL)
362 (void) dictremove(d, k);
363 }
364}
365
366void
367doneimport()
368{
369 if (modules != NULL) {
370 int i;
371 /* Explicitly erase all modules; this is the safest way
372 to get rid of at least *some* circular dependencies */
373 for (i = getdictsize(modules); --i >= 0; ) {
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000374 object *k;
375 k = getdict2key(modules, i);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376 if (k != NULL) {
377 object *m;
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000378 m = dict2lookup(modules, k);
379 if (m == NULL)
380 err_clear();
381 else if (is_moduleobject(m)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382 object *d;
383 d = getmoduledict(m);
384 if (d != NULL && is_dictobject(d)) {
385 cleardict(d);
386 }
387 }
388 }
389 }
390 cleardict(modules);
391 }
392 DECREF(modules);
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
398extern struct {
399 char *name;
400 void (*initfunc)();
401} inittab[];
402
403static 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}