blob: c654940d4f9279be3109f43ef0c1cc15d262e8bd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
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"
38#include "ceval.h"
39
Guido van Rossum3ddee711991-12-16 13:06:34 +000040/* Magic word to reject pre-0.9.4 .pyc files */
41
42#define MAGIC 0x949494L
43
Guido van Rossum3f5da241990-12-20 15:06:42 +000044/* Define pathname separator used in file names */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Guido van Rossumd6a15ad1991-06-24 22:30:42 +000046#ifdef macintosh
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047#define SEP ':'
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048#endif
49
Guido van Rossum175a9ea1991-05-05 20:07:59 +000050#ifdef MSDOS
51#define SEP '\\'
52#endif
53
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054#ifndef SEP
55#define SEP '/'
56#endif
57
Guido van Rossum3f5da241990-12-20 15:06:42 +000058static object *modules;
59
Guido van Rossum66f1fa81991-04-03 19:03:52 +000060/* Forward */
61static int init_builtin PROTO((char *));
62
Guido van Rossum3f5da241990-12-20 15:06:42 +000063/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064
65void
66initimport()
67{
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 if ((modules = newdictobject()) == NULL)
69 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070}
71
72object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000073get_modules()
74{
75 return modules;
76}
77
78object *
79add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 char *name;
81{
82 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
84 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 m = newmoduleobject(name);
86 if (m == NULL)
87 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 DECREF(m);
90 return NULL;
91 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000092 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 return m;
94}
95
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096static FILE *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097open_module(name, suffix, namebuf)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098 char *name;
99 char *suffix;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 char *namebuf; /* XXX No buffer overflow checks! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
102 object *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 FILE *fp;
104
105 path = sysget("path");
106 if (path == NULL || !is_listobject(path)) {
107 strcpy(namebuf, name);
108 strcat(namebuf, suffix);
109 fp = fopen(namebuf, "r");
110 }
111 else {
112 int npath = getlistsize(path);
113 int i;
114 fp = NULL;
115 for (i = 0; i < npath; i++) {
116 object *v = getlistitem(path, i);
117 int len;
118 if (!is_stringobject(v))
119 continue;
120 strcpy(namebuf, getstringvalue(v));
121 len = getstringsize(v);
122 if (len > 0 && namebuf[len-1] != SEP)
123 namebuf[len++] = SEP;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124 strcpy(namebuf+len, name);
125 strcat(namebuf, suffix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 fp = fopen(namebuf, "r");
127 if (fp != NULL)
128 break;
129 }
130 }
131 return fp;
132}
133
134static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135get_module(m, name, m_ret)
136 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000138 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000140 codeobject *co = NULL;
141 object *v, *d;
142 FILE *fp, *fpc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143 node *n;
144 int err;
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000145 char namebuf[258];
146 int namelen;
147 long mtime;
148 extern long getmtime();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149
150 fp = open_module(name, ".py", namebuf);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000151 if (fp == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152 if (m == NULL)
153 err_setstr(NameError, name);
154 else
155 err_setstr(RuntimeError, "no module source file");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000156 return NULL;
157 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000158 /* Get mtime -- always useful */
159 mtime = getmtime(namebuf);
160 /* Check ".pyc" file first */
161 namelen = strlen(namebuf);
162 namebuf[namelen] = 'c';
163 namebuf[namelen+1] = '\0';
164 fpc = fopen(namebuf, "rb");
165 if (fpc != NULL) {
166 long pyc_mtime;
Guido van Rossum3ddee711991-12-16 13:06:34 +0000167 long magic;
168 magic = rd_long(fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000169 pyc_mtime = rd_long(fpc);
Guido van Rossum3ddee711991-12-16 13:06:34 +0000170 if (magic == MAGIC && pyc_mtime == mtime && mtime != 0 && mtime != -1) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000171 v = rd_object(fpc);
172 if (v == NULL || err_occurred() || !is_codeobject(v)) {
173 err_clear();
174 XDECREF(v);
175 }
176 else
177 co = (codeobject *)v;
178 }
179 fclose(fpc);
180 }
181 namebuf[namelen] = '\0';
182 if (co == NULL)
183 err = parse_file(fp, namebuf, file_input, &n);
184 else
185 err = E_DONE;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000186 fclose(fp);
187 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000188 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000189 return NULL;
190 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000191 if (m == NULL) {
192 m = add_module(name);
193 if (m == NULL) {
194 freetree(n);
195 return NULL;
196 }
197 *m_ret = m;
198 }
199 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000200 if (co == NULL) {
201 co = compile(n, namebuf);
202 freetree(n);
203 if (co == NULL)
204 return NULL;
205 /* Now write the code object to the ".pyc" file */
206 namebuf[namelen] = 'c';
207 namebuf[namelen+1] = '\0';
208 fpc = fopen(namebuf, "wb");
209 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000210 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000211 /* First write a 0 for mtime */
212 wr_long(0L, fpc);
213 wr_object((object *)co, fpc);
214 if (ferror(fpc)) {
215 /* Don't keep partial file */
216 fclose(fpc);
217 (void) unlink(namebuf);
218 }
219 else {
220 /* Now write the true mtime */
221 fseek(fpc, 4L, 0);
222 wr_long(mtime, fpc);
223 fflush(fpc);
224 fclose(fpc);
225 }
226 }
227 }
228 v = eval_code(co, d, d, (object *)NULL);
229 DECREF(co);
230 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231}
232
233static object *
234load_module(name)
235 char *name;
236{
237 object *m, *v;
238 v = get_module((object *)NULL, name, &m);
239 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000240 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 DECREF(v);
242 return m;
243}
244
245object *
246import_module(name)
247 char *name;
248{
249 object *m;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000250 if ((m = dictlookup(modules, name)) == NULL) {
251 if (init_builtin(name)) {
252 if ((m = dictlookup(modules, name)) == NULL)
253 err_setstr(SystemError, "builtin module missing");
254 }
255 else {
256 m = load_module(name);
257 }
258 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000259 return m;
260}
261
262object *
263reload_module(m)
264 object *m;
265{
266 if (m == NULL || !is_moduleobject(m)) {
267 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000268 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000269 }
270 /* XXX Ought to check for builtin modules -- can't reload these... */
271 return get_module(m, getmodulename(m), (object **)NULL);
272}
273
274static void
275cleardict(d)
276 object *d;
277{
278 int i;
279 for (i = getdictsize(d); --i >= 0; ) {
280 char *k;
281 k = getdictkey(d, i);
282 if (k != NULL)
283 (void) dictremove(d, k);
284 }
285}
286
287void
288doneimport()
289{
290 if (modules != NULL) {
291 int i;
292 /* Explicitly erase all modules; this is the safest way
293 to get rid of at least *some* circular dependencies */
294 for (i = getdictsize(modules); --i >= 0; ) {
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000295 object *k;
296 k = getdict2key(modules, i);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000297 if (k != NULL) {
298 object *m;
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000299 m = dict2lookup(modules, k);
300 if (m == NULL)
301 err_clear();
302 else if (is_moduleobject(m)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303 object *d;
304 d = getmoduledict(m);
305 if (d != NULL && is_dictobject(d)) {
306 cleardict(d);
307 }
308 }
309 }
310 }
311 cleardict(modules);
312 }
313 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000314}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000315
316
317/* Initialize built-in modules when first imported */
318
319extern struct {
320 char *name;
321 void (*initfunc)();
322} inittab[];
323
324static int
325init_builtin(name)
326 char *name;
327{
328 int i;
329 for (i = 0; inittab[i].name != NULL; i++) {
330 if (strcmp(name, inittab[i].name) == 0) {
331 (*inittab[i].initfunc)();
332 return 1;
333 }
334 }
335 return 0;
336}