blob: a4995ea003aecdde06db4f1b3476a08ef1e4a8bc [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
40#ifdef THINK_C
41#define macintosh
42#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
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
46#ifdef THINK_C
47#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;
167 (void) rd_long(fpc); /* Reserved for magic word */
168 pyc_mtime = rd_long(fpc);
169 if (pyc_mtime != 0 && pyc_mtime != -1 && pyc_mtime == mtime) {
170 v = rd_object(fpc);
171 if (v == NULL || err_occurred() || !is_codeobject(v)) {
172 err_clear();
173 XDECREF(v);
174 }
175 else
176 co = (codeobject *)v;
177 }
178 fclose(fpc);
179 }
180 namebuf[namelen] = '\0';
181 if (co == NULL)
182 err = parse_file(fp, namebuf, file_input, &n);
183 else
184 err = E_DONE;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000185 fclose(fp);
186 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000188 return NULL;
189 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000190 if (m == NULL) {
191 m = add_module(name);
192 if (m == NULL) {
193 freetree(n);
194 return NULL;
195 }
196 *m_ret = m;
197 }
198 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000199 if (co == NULL) {
200 co = compile(n, namebuf);
201 freetree(n);
202 if (co == NULL)
203 return NULL;
204 /* Now write the code object to the ".pyc" file */
205 namebuf[namelen] = 'c';
206 namebuf[namelen+1] = '\0';
207 fpc = fopen(namebuf, "wb");
208 if (fpc != NULL) {
209 wr_long(0L, fpc); /* Reserved for magic word */
210 /* First write a 0 for mtime */
211 wr_long(0L, fpc);
212 wr_object((object *)co, fpc);
213 if (ferror(fpc)) {
214 /* Don't keep partial file */
215 fclose(fpc);
216 (void) unlink(namebuf);
217 }
218 else {
219 /* Now write the true mtime */
220 fseek(fpc, 4L, 0);
221 wr_long(mtime, fpc);
222 fflush(fpc);
223 fclose(fpc);
224 }
225 }
226 }
227 v = eval_code(co, d, d, (object *)NULL);
228 DECREF(co);
229 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230}
231
232static object *
233load_module(name)
234 char *name;
235{
236 object *m, *v;
237 v = get_module((object *)NULL, name, &m);
238 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000239 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 DECREF(v);
241 return m;
242}
243
244object *
245import_module(name)
246 char *name;
247{
248 object *m;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000249 if ((m = dictlookup(modules, name)) == NULL) {
250 if (init_builtin(name)) {
251 if ((m = dictlookup(modules, name)) == NULL)
252 err_setstr(SystemError, "builtin module missing");
253 }
254 else {
255 m = load_module(name);
256 }
257 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258 return m;
259}
260
261object *
262reload_module(m)
263 object *m;
264{
265 if (m == NULL || !is_moduleobject(m)) {
266 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000267 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 }
269 /* XXX Ought to check for builtin modules -- can't reload these... */
270 return get_module(m, getmodulename(m), (object **)NULL);
271}
272
273static void
274cleardict(d)
275 object *d;
276{
277 int i;
278 for (i = getdictsize(d); --i >= 0; ) {
279 char *k;
280 k = getdictkey(d, i);
281 if (k != NULL)
282 (void) dictremove(d, k);
283 }
284}
285
286void
287doneimport()
288{
289 if (modules != NULL) {
290 int i;
291 /* Explicitly erase all modules; this is the safest way
292 to get rid of at least *some* circular dependencies */
293 for (i = getdictsize(modules); --i >= 0; ) {
294 char *k;
295 k = getdictkey(modules, i);
296 if (k != NULL) {
297 object *m;
298 m = dictlookup(modules, k);
299 if (m != NULL && is_moduleobject(m)) {
300 object *d;
301 d = getmoduledict(m);
302 if (d != NULL && is_dictobject(d)) {
303 cleardict(d);
304 }
305 }
306 }
307 }
308 cleardict(modules);
309 }
310 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000311}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000312
313
314/* Initialize built-in modules when first imported */
315
316extern struct {
317 char *name;
318 void (*initfunc)();
319} inittab[];
320
321static int
322init_builtin(name)
323 char *name;
324{
325 int i;
326 for (i = 0; inittab[i].name != NULL; i++) {
327 if (strcmp(name, inittab[i].name) == 0) {
328 (*inittab[i].initfunc)();
329 return 1;
330 }
331 }
332 return 0;
333}