annotate Python/import.c @ 74:bc244df20251 legacy-trunk

Add extra DECREF.
author Guido van Rossum <guido@python.org>
date Sun, 18 Nov 1990 17:36:26 +0000
parents f28ac7f621c7
children a6934380c6e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Module definition and import implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include <stdio.h>
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include "string.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include "PROTO.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #include "object.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #include "stringobject.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #include "listobject.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #include "dictobject.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #include "moduleobject.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #include "node.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 #include "context.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 #include "token.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #include "graminit.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #include "run.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 #include "support.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #include "import.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 #include "errcode.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #include "sysmodule.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 /* Define pathname separator and delimiter in $PYTHONPATH */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #ifdef THINK_C
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 #define SEP ':'
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 #define DELIM ' '
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #endif
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #ifndef SEP
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 #define SEP '/'
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #endif
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #ifndef DELIM
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 #define DELIM ':'
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 #endif
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 void
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 initimport()
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 object *v;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 if ((v = newdictobject()) == NULL)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 fatal("no mem for module table");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if (sysset("modules", v) != 0)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 fatal("can't assign sys.modules");
74
bc244df20251 Add extra DECREF.
Guido van Rossum <guido@python.org>
parents: 40
diff changeset
45 DECREF(v);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 object *
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 new_module(name)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 object *m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 object *mtab;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 mtab = sysget("modules");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 if (mtab == NULL || !is_dictobject(mtab)) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 errno = EBADF;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 m = newmoduleobject(name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 if (m == NULL)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if (dictinsert(mtab, name, m) != 0) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 DECREF(m);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
69 static void
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
70 use_module(ctx, d)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 context *ctx;
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
72 object *d;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 INCREF(d);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 DECREF(ctx->ctx_locals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 ctx->ctx_locals = d;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 INCREF(d);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 DECREF(ctx->ctx_globals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 ctx->ctx_globals = d;
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
80 }
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
81
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
82 static void
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
83 define_module(ctx, name)
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
84 context *ctx;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
85 char *name;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
86 {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
87 object *m;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
88 m = new_module(name);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
89 if (m == NULL) {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
90 puterrno(ctx);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
91 return;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
92 }
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
93 use_module(ctx, getmoduledict(m));
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 DECREF(m);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
97 static object *
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 parsepath(path, delim)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 char *path;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 int delim;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 int i, n;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 char *p;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 object *v, *w;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 n = 1;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 p = path;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 while ((p = strchr(p, delim)) != NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 n++;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 p++;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 v = newlistobject(n);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 if (v == NULL)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 for (i = 0; ; i++) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 p = strchr(path, delim);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 if (p == NULL)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 p = strchr(path, '\0'); /* End of string */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 w = newsizedstringobject(path, (int) (p - path));
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 if (w == NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 DECREF(v);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 setlistitem(v, i, w);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 if (*p == '\0')
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 break;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 path = p+1;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 return v;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 void
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 setpythonpath(path)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 char *path;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 object *v;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 if ((v = parsepath(path, DELIM)) != NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 if (sysset("path", v) != 0)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 fatal("can't assign sys.path");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 DECREF(v);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 static FILE *
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 open_module(name, suffix)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 char *suffix;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 object *path;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 char namebuf[256];
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 FILE *fp;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 path = sysget("path");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 if (path == NULL || !is_listobject(path)) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 strcpy(namebuf, name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 strcat(namebuf, suffix);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 fp = fopen(namebuf, "r");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 else {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 int npath = getlistsize(path);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 int i;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 fp = NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 for (i = 0; i < npath; i++) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 object *v = getlistitem(path, i);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 int len;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 if (!is_stringobject(v))
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 continue;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 strcpy(namebuf, getstringvalue(v));
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 len = getstringsize(v);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 if (len > 0 && namebuf[len-1] != SEP)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 namebuf[len++] = SEP;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 strcpy(namebuf+len, name); /* XXX check for overflow */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 strcat(namebuf, suffix); /* XXX ditto */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 fp = fopen(namebuf, "r");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 if (fp != NULL)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 break;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 return fp;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 static object *
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 load_module(ctx, name)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 context *ctx;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 object *m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 char **p;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 FILE *fp;
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
190 node *n;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 int err;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 object *mtab;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 object *save_locals, *save_globals;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 mtab = sysget("modules");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 if (mtab == NULL || !is_dictobject(mtab)) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 errno = EBADF;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 fp = open_module(name, ".py");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 if (fp == NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 name_error(ctx, name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 err = parseinput(fp, file_input, &n);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 fclose(fp);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 if (err != E_DONE) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 input_error(ctx, err);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 save_locals = ctx->ctx_locals;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 INCREF(save_locals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 save_globals = ctx->ctx_globals;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 INCREF(save_globals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 define_module(ctx, name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 exec_node(ctx, n);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 DECREF(ctx->ctx_locals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 ctx->ctx_locals = save_locals;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 DECREF(ctx->ctx_globals);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 ctx->ctx_globals = save_globals;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 /* XXX need to free the tree n here; except referenced defs */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 if (ctx->ctx_exception) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 dictremove(mtab, name); /* Undefine the module */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 m = dictlookup(mtab, name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 if (m == NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 error(ctx, "module not defined after loading");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 object *
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 import_module(ctx, name)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 context *ctx;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 object *m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 object *mtab;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 mtab = sysget("modules");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 if (mtab == NULL || !is_dictobject(mtab)) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 error(ctx, "bad sys.modules");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 if ((m = dictlookup(mtab, name)) == NULL) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 m = load_module(ctx, name);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
251
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
252 object *
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
253 reload_module(ctx, m)
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
254 context *ctx;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
255 object *m;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
256 {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
257 char *name;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
258 FILE *fp;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
259 node *n;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
260 int err;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
261 object *d;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
262 object *save_locals, *save_globals;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
263 if (m == NULL || !is_moduleobject(m)) {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
264 type_error(ctx, "reload() argument must be module");
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
265 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
266 }
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
267 /* XXX Ought to check for builtin module */
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
268 name = getmodulename(m);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
269 fp = open_module(name, ".py");
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
270 if (fp == NULL) {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
271 error(ctx, "reload() cannot find module source file");
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
272 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
273 }
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
274 err = parseinput(fp, file_input, &n);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
275 fclose(fp);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
276 if (err != E_DONE) {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
277 input_error(ctx, err);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
278 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
279 }
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
280 d = newdictobject();
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
281 if (d == NULL)
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
282 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
283 setmoduledict(m, d);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
284 save_locals = ctx->ctx_locals;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
285 INCREF(save_locals);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
286 save_globals = ctx->ctx_globals;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
287 INCREF(save_globals);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
288 use_module(ctx, d);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
289 exec_node(ctx, n);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
290 DECREF(ctx->ctx_locals);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
291 ctx->ctx_locals = save_locals;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
292 DECREF(ctx->ctx_globals);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
293 ctx->ctx_globals = save_globals;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
294 if (ctx->ctx_exception)
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
295 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
296 INCREF(None);
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
297 return None;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
298 }