blob: 93952a5ebc10185b82cb9f7234a88541b7c06ac4 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module definition and import implementation */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005#include "node.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "token.h"
7#include "graminit.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008#include "import.h"
9#include "errcode.h"
10#include "sysmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000011#include "pythonrun.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000012
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* Define pathname separator used in file names */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
15#ifdef THINK_C
16#define SEP ':'
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017#endif
18
19#ifndef SEP
20#define SEP '/'
21#endif
22
Guido van Rossum3f5da241990-12-20 15:06:42 +000023static object *modules;
24
25/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026
27void
28initimport()
29{
Guido van Rossum3f5da241990-12-20 15:06:42 +000030 if ((modules = newdictobject()) == NULL)
31 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032}
33
34object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000035get_modules()
36{
37 return modules;
38}
39
40object *
41add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042 char *name;
43{
44 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +000045 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
46 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047 m = newmoduleobject(name);
48 if (m == NULL)
49 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 DECREF(m);
52 return NULL;
53 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000054 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 return m;
56}
57
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058static FILE *
Guido van Rossum3f5da241990-12-20 15:06:42 +000059open_module(name, suffix, namebuf)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 char *name;
61 char *suffix;
Guido van Rossum3f5da241990-12-20 15:06:42 +000062 char *namebuf; /* XXX No buffer overflow checks! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063{
64 object *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065 FILE *fp;
66
67 path = sysget("path");
68 if (path == NULL || !is_listobject(path)) {
69 strcpy(namebuf, name);
70 strcat(namebuf, suffix);
71 fp = fopen(namebuf, "r");
72 }
73 else {
74 int npath = getlistsize(path);
75 int i;
76 fp = NULL;
77 for (i = 0; i < npath; i++) {
78 object *v = getlistitem(path, i);
79 int len;
80 if (!is_stringobject(v))
81 continue;
82 strcpy(namebuf, getstringvalue(v));
83 len = getstringsize(v);
84 if (len > 0 && namebuf[len-1] != SEP)
85 namebuf[len++] = SEP;
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 strcpy(namebuf+len, name);
87 strcat(namebuf, suffix);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 fp = fopen(namebuf, "r");
89 if (fp != NULL)
90 break;
91 }
92 }
93 return fp;
94}
95
96static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000097get_module(m, name, m_ret)
98 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000102 object *d;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103 FILE *fp;
104 node *n;
105 int err;
106 char namebuf[256];
107
108 fp = open_module(name, ".py", namebuf);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000109 if (fp == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000110 if (m == NULL)
111 err_setstr(NameError, name);
112 else
113 err_setstr(RuntimeError, "no module source file");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000114 return NULL;
115 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000116 err = parse_file(fp, namebuf, file_input, &n);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000117 fclose(fp);
118 if (err != E_DONE) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000119 err_input(err);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000120 return NULL;
121 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122 if (m == NULL) {
123 m = add_module(name);
124 if (m == NULL) {
125 freetree(n);
126 return NULL;
127 }
128 *m_ret = m;
129 }
130 d = getmoduledict(m);
131 return run_node(n, namebuf, d, d);
132}
133
134static object *
135load_module(name)
136 char *name;
137{
138 object *m, *v;
139 v = get_module((object *)NULL, name, &m);
140 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000141 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142 DECREF(v);
143 return m;
144}
145
146object *
147import_module(name)
148 char *name;
149{
150 object *m;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000151 if ((m = dictlookup(modules, name)) == NULL) {
152 if (init_builtin(name)) {
153 if ((m = dictlookup(modules, name)) == NULL)
154 err_setstr(SystemError, "builtin module missing");
155 }
156 else {
157 m = load_module(name);
158 }
159 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160 return m;
161}
162
163object *
164reload_module(m)
165 object *m;
166{
167 if (m == NULL || !is_moduleobject(m)) {
168 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000169 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170 }
171 /* XXX Ought to check for builtin modules -- can't reload these... */
172 return get_module(m, getmodulename(m), (object **)NULL);
173}
174
175static void
176cleardict(d)
177 object *d;
178{
179 int i;
180 for (i = getdictsize(d); --i >= 0; ) {
181 char *k;
182 k = getdictkey(d, i);
183 if (k != NULL)
184 (void) dictremove(d, k);
185 }
186}
187
188void
189doneimport()
190{
191 if (modules != NULL) {
192 int i;
193 /* Explicitly erase all modules; this is the safest way
194 to get rid of at least *some* circular dependencies */
195 for (i = getdictsize(modules); --i >= 0; ) {
196 char *k;
197 k = getdictkey(modules, i);
198 if (k != NULL) {
199 object *m;
200 m = dictlookup(modules, k);
201 if (m != NULL && is_moduleobject(m)) {
202 object *d;
203 d = getmoduledict(m);
204 if (d != NULL && is_dictobject(d)) {
205 cleardict(d);
206 }
207 }
208 }
209 }
210 cleardict(modules);
211 }
212 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000213}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000214
215
216/* Initialize built-in modules when first imported */
217
218extern struct {
219 char *name;
220 void (*initfunc)();
221} inittab[];
222
223static int
224init_builtin(name)
225 char *name;
226{
227 int i;
228 for (i = 0; inittab[i].name != NULL; i++) {
229 if (strcmp(name, inittab[i].name) == 0) {
230 (*inittab[i].initfunc)();
231 return 1;
232 }
233 }
234 return 0;
235}