blob: b5326510159c9352e30339dc0341fd13c348f5cf [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 Rossum25831651993-05-19 14:50:45 +000057#define MAGIC 0x999901L /* Increment by one for each incompatible change */
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 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000306 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000307 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
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356void
357doneimport()
358{
359 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000360 int pos;
361 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362 /* Explicitly erase all modules; this is the safest way
363 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000364 pos = 0;
365 while (mappinggetnext(modules, &pos, &modname, &module)) {
366 if (is_moduleobject(module)) {
367 object *dict;
368 dict = getmoduledict(module);
369 if (dict != NULL && is_dictobject(dict))
370 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371 }
372 }
Guido van Rossum25831651993-05-19 14:50:45 +0000373 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 }
375 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000376 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000377}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000378
379
380/* Initialize built-in modules when first imported */
381
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000382static int
383init_builtin(name)
384 char *name;
385{
386 int i;
387 for (i = 0; inittab[i].name != NULL; i++) {
388 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000389 if (verbose)
390 fprintf(stderr, "import %s # builtin\n",
391 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000392 (*inittab[i].initfunc)();
393 return 1;
394 }
395 }
396 return 0;
397}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000398
399extern struct frozen {
400 char *name;
401 char *code;
402 int size;
403} frozen_modules[];
404
405int
406init_frozen(name)
407 char *name;
408{
409 struct frozen *p;
410 codeobject *co;
411 object *m, *d, *v;
412 for (p = frozen_modules; ; p++) {
413 if (p->name == NULL)
414 return 0;
415 if (strcmp(p->name, name) == 0)
416 break;
417 }
418 if (verbose)
419 fprintf(stderr, "import %s # frozen\n", name);
420 co = (codeobject *) rds_object(p->code, p->size);
421 if (co == NULL)
422 return -1;
423 if ((m = add_module(name)) == NULL ||
424 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000425 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000426 DECREF(co);
427 return -1;
428 }
429 DECREF(co);
430 DECREF(v);
431 return 1;
432}