blob: f4b4ca9a980651e97315fca6c1a9bb25fc80166b [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;
151 if ((m = dictlookup(modules, name)) == NULL)
152 m = load_module(name);
153 return m;
154}
155
156object *
157reload_module(m)
158 object *m;
159{
160 if (m == NULL || !is_moduleobject(m)) {
161 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000162 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000163 }
164 /* XXX Ought to check for builtin modules -- can't reload these... */
165 return get_module(m, getmodulename(m), (object **)NULL);
166}
167
168static void
169cleardict(d)
170 object *d;
171{
172 int i;
173 for (i = getdictsize(d); --i >= 0; ) {
174 char *k;
175 k = getdictkey(d, i);
176 if (k != NULL)
177 (void) dictremove(d, k);
178 }
179}
180
181void
182doneimport()
183{
184 if (modules != NULL) {
185 int i;
186 /* Explicitly erase all modules; this is the safest way
187 to get rid of at least *some* circular dependencies */
188 for (i = getdictsize(modules); --i >= 0; ) {
189 char *k;
190 k = getdictkey(modules, i);
191 if (k != NULL) {
192 object *m;
193 m = dictlookup(modules, k);
194 if (m != NULL && is_moduleobject(m)) {
195 object *d;
196 d = getmoduledict(m);
197 if (d != NULL && is_dictobject(d)) {
198 cleardict(d);
199 }
200 }
201 }
202 }
203 cleardict(modules);
204 }
205 DECREF(modules);
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000206}