blob: f62d1d266a1eafa2f90a6b43256b195722619014 [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 Rossum3f5da241990-12-20 15:06:42 +000040/* Define pathname separator used in file names */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossumd6a15ad1991-06-24 22:30:42 +000042#ifdef macintosh
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043#define SEP ':'
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044#endif
45
Guido van Rossum175a9ea1991-05-05 20:07:59 +000046#ifdef MSDOS
47#define SEP '\\'
48#endif
49
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050#ifndef SEP
51#define SEP '/'
52#endif
53
Guido van Rossum3f5da241990-12-20 15:06:42 +000054static object *modules;
55
Guido van Rossum66f1fa81991-04-03 19:03:52 +000056/* Forward */
57static int init_builtin PROTO((char *));
58
Guido van Rossum3f5da241990-12-20 15:06:42 +000059/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060
61void
62initimport()
63{
Guido van Rossum3f5da241990-12-20 15:06:42 +000064 if ((modules = newdictobject()) == NULL)
65 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066}
67
68object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000069get_modules()
70{
71 return modules;
72}
73
74object *
75add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 char *name;
77{
78 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +000079 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
80 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081 m = newmoduleobject(name);
82 if (m == NULL)
83 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000084 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 DECREF(m);
86 return NULL;
87 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 return m;
90}
91
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092static FILE *
Guido van Rossum3f5da241990-12-20 15:06:42 +000093open_module(name, suffix, namebuf)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094 char *name;
95 char *suffix;
Guido van Rossum3f5da241990-12-20 15:06:42 +000096 char *namebuf; /* XXX No buffer overflow checks! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
98 object *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 FILE *fp;
100
101 path = sysget("path");
102 if (path == NULL || !is_listobject(path)) {
103 strcpy(namebuf, name);
104 strcat(namebuf, suffix);
105 fp = fopen(namebuf, "r");
106 }
107 else {
108 int npath = getlistsize(path);
109 int i;
110 fp = NULL;
111 for (i = 0; i < npath; i++) {
112 object *v = getlistitem(path, i);
113 int len;
114 if (!is_stringobject(v))
115 continue;
116 strcpy(namebuf, getstringvalue(v));
117 len = getstringsize(v);
118 if (len > 0 && namebuf[len-1] != SEP)
119 namebuf[len++] = SEP;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 strcpy(namebuf+len, name);
121 strcat(namebuf, suffix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 fp = fopen(namebuf, "r");
123 if (fp != NULL)
124 break;
125 }
126 }
127 return fp;
128}
129
130static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000131get_module(m, name, m_ret)
132 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135{
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000136 codeobject *co = NULL;
137 object *v, *d;
138 FILE *fp, *fpc;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000139 node *n;
140 int err;
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000141 char namebuf[258];
142 int namelen;
143 long mtime;
144 extern long getmtime();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145
146 fp = open_module(name, ".py", namebuf);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000147 if (fp == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 if (m == NULL)
149 err_setstr(NameError, name);
150 else
151 err_setstr(RuntimeError, "no module source file");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000152 return NULL;
153 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000154 /* Get mtime -- always useful */
155 mtime = getmtime(namebuf);
156 /* Check ".pyc" file first */
157 namelen = strlen(namebuf);
158 namebuf[namelen] = 'c';
159 namebuf[namelen+1] = '\0';
160 fpc = fopen(namebuf, "rb");
161 if (fpc != NULL) {
162 long pyc_mtime;
163 (void) rd_long(fpc); /* Reserved for magic word */
164 pyc_mtime = rd_long(fpc);
165 if (pyc_mtime != 0 && pyc_mtime != -1 && pyc_mtime == mtime) {
166 v = rd_object(fpc);
167 if (v == NULL || err_occurred() || !is_codeobject(v)) {
168 err_clear();
169 XDECREF(v);
170 }
171 else
172 co = (codeobject *)v;
173 }
174 fclose(fpc);
175 }
176 namebuf[namelen] = '\0';
177 if (co == NULL)
178 err = parse_file(fp, namebuf, file_input, &n);
179 else
180 err = E_DONE;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000181 fclose(fp);
182 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000183 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000184 return NULL;
185 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000186 if (m == NULL) {
187 m = add_module(name);
188 if (m == NULL) {
189 freetree(n);
190 return NULL;
191 }
192 *m_ret = m;
193 }
194 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000195 if (co == NULL) {
196 co = compile(n, namebuf);
197 freetree(n);
198 if (co == NULL)
199 return NULL;
200 /* Now write the code object to the ".pyc" file */
201 namebuf[namelen] = 'c';
202 namebuf[namelen+1] = '\0';
203 fpc = fopen(namebuf, "wb");
204 if (fpc != NULL) {
205 wr_long(0L, fpc); /* Reserved for magic word */
206 /* First write a 0 for mtime */
207 wr_long(0L, fpc);
208 wr_object((object *)co, fpc);
209 if (ferror(fpc)) {
210 /* Don't keep partial file */
211 fclose(fpc);
212 (void) unlink(namebuf);
213 }
214 else {
215 /* Now write the true mtime */
216 fseek(fpc, 4L, 0);
217 wr_long(mtime, fpc);
218 fflush(fpc);
219 fclose(fpc);
220 }
221 }
222 }
223 v = eval_code(co, d, d, (object *)NULL);
224 DECREF(co);
225 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226}
227
228static object *
229load_module(name)
230 char *name;
231{
232 object *m, *v;
233 v = get_module((object *)NULL, name, &m);
234 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000235 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236 DECREF(v);
237 return m;
238}
239
240object *
241import_module(name)
242 char *name;
243{
244 object *m;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000245 if ((m = dictlookup(modules, name)) == NULL) {
246 if (init_builtin(name)) {
247 if ((m = dictlookup(modules, name)) == NULL)
248 err_setstr(SystemError, "builtin module missing");
249 }
250 else {
251 m = load_module(name);
252 }
253 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000254 return m;
255}
256
257object *
258reload_module(m)
259 object *m;
260{
261 if (m == NULL || !is_moduleobject(m)) {
262 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000263 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 }
265 /* XXX Ought to check for builtin modules -- can't reload these... */
266 return get_module(m, getmodulename(m), (object **)NULL);
267}
268
269static void
270cleardict(d)
271 object *d;
272{
273 int i;
274 for (i = getdictsize(d); --i >= 0; ) {
275 char *k;
276 k = getdictkey(d, i);
277 if (k != NULL)
278 (void) dictremove(d, k);
279 }
280}
281
282void
283doneimport()
284{
285 if (modules != NULL) {
286 int i;
287 /* Explicitly erase all modules; this is the safest way
288 to get rid of at least *some* circular dependencies */
289 for (i = getdictsize(modules); --i >= 0; ) {
290 char *k;
291 k = getdictkey(modules, i);
292 if (k != NULL) {
293 object *m;
294 m = dictlookup(modules, k);
295 if (m != NULL && is_moduleobject(m)) {
296 object *d;
297 d = getmoduledict(m);
298 if (d != NULL && is_dictobject(d)) {
299 cleardict(d);
300 }
301 }
302 }
303 }
304 cleardict(modules);
305 }
306 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000307}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000308
309
310/* Initialize built-in modules when first imported */
311
312extern struct {
313 char *name;
314 void (*initfunc)();
315} inittab[];
316
317static int
318init_builtin(name)
319 char *name;
320{
321 int i;
322 for (i = 0; inittab[i].name != NULL; i++) {
323 if (strcmp(name, inittab[i].name) == 0) {
324 (*inittab[i].initfunc)();
325 return 1;
326 }
327 }
328 return 0;
329}