blob: 0eb44f231133dabd7bdc508aa38c7a921bdcfbca [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 Rossum4135e781991-12-24 13:26:56 +0000152 if (m == NULL) {
153 sprintf(namebuf, "no module named %.200s", name);
154 err_setstr(ImportError, namebuf);
155 }
156 else {
157 sprintf(namebuf, "no source for module %.200s", name);
158 err_setstr(ImportError, namebuf);
159 }
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000160 return NULL;
161 }
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000162 /* Get mtime -- always useful */
163 mtime = getmtime(namebuf);
164 /* Check ".pyc" file first */
165 namelen = strlen(namebuf);
166 namebuf[namelen] = 'c';
167 namebuf[namelen+1] = '\0';
168 fpc = fopen(namebuf, "rb");
169 if (fpc != NULL) {
170 long pyc_mtime;
Guido van Rossum3ddee711991-12-16 13:06:34 +0000171 long magic;
172 magic = rd_long(fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000173 pyc_mtime = rd_long(fpc);
Guido van Rossum3ddee711991-12-16 13:06:34 +0000174 if (magic == MAGIC && pyc_mtime == mtime && mtime != 0 && mtime != -1) {
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000175 v = rd_object(fpc);
176 if (v == NULL || err_occurred() || !is_codeobject(v)) {
177 err_clear();
178 XDECREF(v);
179 }
180 else
181 co = (codeobject *)v;
182 }
183 fclose(fpc);
184 }
185 namebuf[namelen] = '\0';
186 if (co == NULL)
187 err = parse_file(fp, namebuf, file_input, &n);
188 else
189 err = E_DONE;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000190 fclose(fp);
191 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000192 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000193 return NULL;
194 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000195 if (m == NULL) {
196 m = add_module(name);
197 if (m == NULL) {
198 freetree(n);
199 return NULL;
200 }
201 *m_ret = m;
202 }
203 d = getmoduledict(m);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000204 if (co == NULL) {
205 co = compile(n, namebuf);
206 freetree(n);
207 if (co == NULL)
208 return NULL;
209 /* Now write the code object to the ".pyc" file */
210 namebuf[namelen] = 'c';
211 namebuf[namelen+1] = '\0';
212 fpc = fopen(namebuf, "wb");
213 if (fpc != NULL) {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000214 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000215 /* First write a 0 for mtime */
216 wr_long(0L, fpc);
217 wr_object((object *)co, fpc);
218 if (ferror(fpc)) {
219 /* Don't keep partial file */
220 fclose(fpc);
221 (void) unlink(namebuf);
222 }
223 else {
224 /* Now write the true mtime */
225 fseek(fpc, 4L, 0);
226 wr_long(mtime, fpc);
227 fflush(fpc);
228 fclose(fpc);
229 }
230 }
231 }
232 v = eval_code(co, d, d, (object *)NULL);
233 DECREF(co);
234 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235}
236
237static object *
238load_module(name)
239 char *name;
240{
241 object *m, *v;
242 v = get_module((object *)NULL, name, &m);
243 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000244 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 DECREF(v);
246 return m;
247}
248
249object *
250import_module(name)
251 char *name;
252{
253 object *m;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000254 if ((m = dictlookup(modules, name)) == NULL) {
255 if (init_builtin(name)) {
256 if ((m = dictlookup(modules, name)) == NULL)
257 err_setstr(SystemError, "builtin module missing");
258 }
259 else {
260 m = load_module(name);
261 }
262 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 return m;
264}
265
266object *
267reload_module(m)
268 object *m;
269{
270 if (m == NULL || !is_moduleobject(m)) {
271 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000272 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273 }
274 /* XXX Ought to check for builtin modules -- can't reload these... */
275 return get_module(m, getmodulename(m), (object **)NULL);
276}
277
278static void
279cleardict(d)
280 object *d;
281{
282 int i;
283 for (i = getdictsize(d); --i >= 0; ) {
284 char *k;
285 k = getdictkey(d, i);
286 if (k != NULL)
287 (void) dictremove(d, k);
288 }
289}
290
291void
292doneimport()
293{
294 if (modules != NULL) {
295 int i;
296 /* Explicitly erase all modules; this is the safest way
297 to get rid of at least *some* circular dependencies */
298 for (i = getdictsize(modules); --i >= 0; ) {
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000299 object *k;
300 k = getdict2key(modules, i);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 if (k != NULL) {
302 object *m;
Guido van Rossumf0ada4a1991-08-16 09:01:08 +0000303 m = dict2lookup(modules, k);
304 if (m == NULL)
305 err_clear();
306 else if (is_moduleobject(m)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000307 object *d;
308 d = getmoduledict(m);
309 if (d != NULL && is_dictobject(d)) {
310 cleardict(d);
311 }
312 }
313 }
314 }
315 cleardict(modules);
316 }
317 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000318}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000319
320
321/* Initialize built-in modules when first imported */
322
323extern struct {
324 char *name;
325 void (*initfunc)();
326} inittab[];
327
328static int
329init_builtin(name)
330 char *name;
331{
332 int i;
333 for (i = 0; inittab[i].name != NULL; i++) {
334 if (strcmp(name, inittab[i].name) == 0) {
335 (*inittab[i].initfunc)();
336 return 1;
337 }
338 }
339 return 0;
340}