blob: 980ccd23b5eec470cb5016fea78e94c0607eeccd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum74e6a111994-08-29 12:54:38 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "eval.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000039#include "osdefs.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000040
Guido van Rossum74e6a111994-08-29 12:54:38 +000041extern int verbose; /* Defined in pythonrun.c */
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +000042
Guido van Rossum74e6a111994-08-29 12:54:38 +000043extern long getmtime(); /* In getmtime.c */
Guido van Rossum21d335e1993-10-15 13:01:11 +000044
Guido van Rossume25c2561992-01-19 16:28:21 +000045#ifdef DEBUG
46#define D(x) x
47#else
48#define D(x)
49#endif
50
Guido van Rossum74e6a111994-08-29 12:54:38 +000051/* Explanation of some of the the various #defines used by dynamic linking...
Guido van Rossume25c2561992-01-19 16:28:21 +000052
Guido van Rossum74e6a111994-08-29 12:54:38 +000053 symbol -- defined for:
54
55 DYNAMIC_LINK -- any kind of dynamic linking
56 USE_RLD -- NeXT dynamic linking
57 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
58 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
59 _AIX -- AIX style dynamic linking
60 NT -- NT style dynamic linking (using DLLs)
61 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
62 WITH_MAC_DL -- Mac dynamic linking (highly experimental)
63 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
64 LONG_EXT -- long extension, e.g. "module.so"
65
66 (The other WITH_* symbols are used only once, to set the
67 appropriate symbols.)
68*/
69
70/* Configure dynamic linking */
71
72#ifdef NT
73#define DYNAMIC_LINK
74#include <windows.h>
75typedef FARPROC dl_funcptr;
76#define _DL_FUNCPTR_DEFINED
77#define SHORT_EXT ".dll"
78#define LONG_EXT "module.dll"
Guido van Rossume25c2561992-01-19 16:28:21 +000079#endif
80
Guido van Rossum74e6a111994-08-29 12:54:38 +000081#if defined(NeXT) || defined(WITH_RLD)
82#define DYNAMIC_LINK
83#define USE_RLD
84#endif
85
86#ifdef WITH_SGI_DL
87#define DYNAMIC_LINK
88#define USE_DL
89#endif
90
91#ifdef WITH_DL_DLD
92#define DYNAMIC_LINK
93#define USE_DL
94#endif
95
96#ifdef WITH_MAC_DL
97#define DYNAMIC_LINK
98#endif
99
100#if !defined(DYNAMIC_LINK) && defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
101#define DYNAMIC_LINK
102#define USE_SHLIB
103#endif
104
105#ifdef _AIX
106#define DYNAMIC_LINK
107#include <sys/ldr.h>
108typedef void (*dl_funcptr)();
109#define _DL_FUNCPTR_DEFINED
110static void aix_loaderror(char *name);
111#endif
112
113#ifdef DYNAMIC_LINK
114
115#ifdef USE_SHLIB
116#include <dlfcn.h>
117#ifndef _DL_FUNCPTR_DEFINED
118typedef void (*dl_funcptr)();
119#endif
120#ifndef RTLD_LAZY
121#define RTLD_LAZY 1
122#endif
123#define SHORT_EXT ".so"
124#define LONG_EXT "module.so"
125#endif /* USE_SHLIB */
126
127#ifdef USE_DL
128#include "dl.h"
129#endif
130
131#ifdef WITH_MAC_DL
132#include "dynamic_load.h"
133#endif
134
135#ifdef USE_RLD
136#include <mach-o/rld.h>
137#define FUNCNAME_PATTERN "_init%s"
138#ifndef _DL_FUNCPTR_DEFINED
139typedef void (*dl_funcptr)();
140#endif
141#endif /* USE_RLD */
142
143extern char *getprogramname();
144
145#ifndef FUNCNAME_PATTERN
146#define FUNCNAME_PATTERN "init%s"
147#endif
148
149#if !defined(SHORT_EXT) && !defined(LONG_EXT)
150#define SHORT_EXT ".o"
151#define LONG_EXT "module.o"
152#endif /* !SHORT_EXT && !LONG_EXT */
153
154#endif /* DYNAMIC_LINK */
155
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000156/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum3ddee711991-12-16 13:06:34 +0000157
Guido van Rossum74e6a111994-08-29 12:54:38 +0000158#define MAGIC 0x999903L /* Increment by one for each incompatible change */
Guido van Rossum3ddee711991-12-16 13:06:34 +0000159
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160static object *modules;
161
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000162/* Forward */
163static int init_builtin PROTO((char *));
164
Guido van Rossum3f5da241990-12-20 15:06:42 +0000165/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166
167void
168initimport()
169{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170 if ((modules = newdictobject()) == NULL)
171 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172}
173
174object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000175get_modules()
176{
177 return modules;
178}
179
180object *
181add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182 char *name;
183{
184 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000185 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
186 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 m = newmoduleobject(name);
188 if (m == NULL)
189 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000190 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 DECREF(m);
192 return NULL;
193 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000194 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 return m;
196}
197
Guido van Rossumc45611d1993-11-17 22:58:56 +0000198enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
Guido van Rossume25c2561992-01-19 16:28:21 +0000199
Guido van Rossumc45611d1993-11-17 22:58:56 +0000200static struct filedescr {
201 char *suffix;
202 char *mode;
203 enum filetype type;
204} filetab[] = {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000205#ifdef DYNAMIC_LINK
206#ifdef SHORT_EXT
207 {SHORT_EXT, "rb", C_EXTENSION},
208#endif /* !SHORT_EXT */
209#ifdef LONG_EXT
210 {LONG_EXT, "rb", C_EXTENSION},
211#endif /* !LONG_EXT */
212#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000213 {".py", "r", PY_SOURCE},
214 {".pyc", "rb", PY_COMPILED},
215 {0, 0}
216};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217
Guido van Rossum74e6a111994-08-29 12:54:38 +0000218#ifdef DYNAMIC_LINK
219static object *
220load_dynamic_module(name, namebuf, m, m_ret)
221 char *name;
222 char *namebuf;
223 object *m;
224 object **m_ret;
225{
226 char funcname[258];
227 dl_funcptr p = NULL;
228 if (m != NULL) {
229 err_setstr(ImportError,
230 "cannot reload dynamically loaded module");
231 return NULL;
232 }
233 sprintf(funcname, FUNCNAME_PATTERN, name);
234#ifdef WITH_MAC_DL
235 {
236 object *v = dynamic_load(namebuf);
237 if (v == NULL)
238 return NULL;
239 }
240#else /* !WITH_MAC_DL */
241#ifdef USE_SHLIB
242 {
243#ifdef RTLD_NOW
244 /* RTLD_NOW: resolve externals now
245 (i.e. core dump now if some are missing) */
246 void *handle = dlopen(namebuf, RTLD_NOW);
247#else
248 void *handle;
249 if (verbose)
250 printf("dlopen(\"%s\", %d);\n", namebuf, RTLD_LAZY);
251 handle = dlopen(namebuf, RTLD_LAZY);
252#endif /* RTLD_NOW */
253 if (handle == NULL) {
254 err_setstr(ImportError, dlerror());
255 return NULL;
256 }
257 p = (dl_funcptr) dlsym(handle, funcname);
258 }
259#endif /* USE_SHLIB */
260#ifdef _AIX
261 p = (dl_funcptr) load(namebuf, 1, 0);
262 if (p == NULL) {
263 aix_loaderror(namebuf);
264 return NULL;
265 }
266#endif /* _AIX */
267#ifdef NT
268 {
269 HINSTANCE hDLL;
270 hDLL = LoadLibrary(namebuf);
271 if (hDLL==NULL){
272 char errBuf[64];
273 sprintf(errBuf, "DLL load failed with error code %d",
274 GetLastError());
275 err_setstr(ImportError, errBuf);
276 return NULL;
277 }
278 p = GetProcAddress(hDLL, funcname);
279 }
280#endif /* NT */
281#ifdef USE_DL
282 p = dl_loadmod(getprogramname(), namebuf, funcname);
283#endif /* USE_DL */
284#ifdef USE_RLD
285 {
286 NXStream *errorStream;
287 struct mach_header *new_header;
288 const char *filenames[2];
289 long ret;
290 unsigned long ptr;
291
292 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
293 filenames[0] = namebuf;
294 filenames[1] = NULL;
295 ret = rld_load(errorStream, &new_header,
296 filenames, NULL);
297
298 /* extract the error messages for the exception */
299 if(!ret) {
300 char *streamBuf;
301 int len, maxLen;
302
303 NXPutc(errorStream, (char)0);
304
305 NXGetMemoryBuffer(errorStream,
306 &streamBuf, &len, &maxLen);
307 err_setstr(ImportError, streamBuf);
308 }
309
310 if(ret && rld_lookup(errorStream, funcname, &ptr))
311 p = (dl_funcptr) ptr;
312
313 NXCloseMemory(errorStream, NX_FREEBUFFER);
314
315 if(!ret)
316 return NULL;
317 }
318#endif /* USE_RLD */
319
320 if (p == NULL) {
321 err_setstr(ImportError,
322 "dynamic module does not define init function");
323 return NULL;
324 }
325 (*p)();
326
327#endif /* !WITH_MAC_DL */
328 *m_ret = m = dictlookup(modules, name);
329 if (m == NULL) {
330 if (err_occurred() == NULL)
331 err_setstr(SystemError,
332 "dynamic module not initialized properly");
333 return NULL;
334 }
335 if (verbose)
336 fprintf(stderr,
337 "import %s # dynamically loaded from %s\n",
338 name, namebuf);
339 INCREF(None);
340 return None;
341}
342#endif /* DYNAMIC_LINK */
343
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345get_module(m, name, m_ret)
346 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000350 int err, npath, i, len;
351 long magic;
352 long mtime, pyc_mtime;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000353 char namebuf[MAXPATHLEN+1];
Guido van Rossumc45611d1993-11-17 22:58:56 +0000354 struct filedescr *fdp;
355 FILE *fp = NULL, *fpc = NULL;
356 node *n = NULL;
357 object *path, *v, *d;
358 codeobject *co = NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000359
Guido van Rossumc45611d1993-11-17 22:58:56 +0000360 path = sysget("path");
361 if (path == NULL || !is_listobject(path)) {
362 err_setstr(ImportError,
363 "sys.path must be list of directory names");
364 return NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000365 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000366 npath = getlistsize(path);
367 for (i = 0; i < npath; i++) {
368 v = getlistitem(path, i);
369 if (!is_stringobject(v))
370 continue;
371 strcpy(namebuf, getstringvalue(v));
372 len = getstringsize(v);
373 if (len > 0 && namebuf[len-1] != SEP)
374 namebuf[len++] = SEP;
375 strcpy(namebuf+len, name);
376 len += strlen(name);
377 for (fdp = filetab; fdp->suffix != NULL; fdp++) {
378 strcpy(namebuf+len, fdp->suffix);
379 if (verbose > 1)
380 fprintf(stderr, "# trying %s\n", namebuf);
381 fp = fopen(namebuf, fdp->mode);
382 if (fp != NULL)
383 break;
384 }
385 if (fp != NULL)
386 break;
387 }
388 if (fp == NULL) {
389 sprintf(namebuf, "No module named %s", name);
390 err_setstr(ImportError, namebuf);
391 return NULL;
392 }
393
394 switch (fdp->type) {
395
396 case PY_SOURCE:
Guido van Rossum21d335e1993-10-15 13:01:11 +0000397 mtime = getmtime(namebuf);
Guido van Rossum590baa41993-11-30 13:40:46 +0000398 len = strlen(namebuf);
399 strcpy(namebuf + len, "c");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000400 fpc = fopen(namebuf, "rb");
401 if (fpc != NULL) {
402 magic = rd_long(fpc);
403 if (magic != MAGIC) {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000404 if (verbose)
405 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000406 "# %s has bad magic\n",
407 namebuf);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000408 }
409 else {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000410 pyc_mtime = rd_long(fpc);
411 if (pyc_mtime != mtime) {
412 if (verbose)
413 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000414 "# %s has bad mtime\n",
415 namebuf);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000416 }
417 else {
418 fclose(fp);
419 fp = fpc;
420 if (verbose)
421 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000422 "# %s matches %s.py\n",
423 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000424 goto use_compiled;
425 }
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000426 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000427 fclose(fpc);
428 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000429 namebuf[len] = '\0';
Guido van Rossum74e6a111994-08-29 12:54:38 +0000430 n = parse_file(fp, namebuf, file_input);
431 fclose(fp);
432 if (n == NULL)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000433 return NULL;
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000434 co = compile(n, namebuf);
435 freetree(n);
436 if (co == NULL)
437 return NULL;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000438 if (verbose)
439 fprintf(stderr,
Guido van Rossum590baa41993-11-30 13:40:46 +0000440 "import %s # from %s\n", name, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000441 /* Now write the code object to the ".pyc" file */
Guido van Rossum590baa41993-11-30 13:40:46 +0000442 strcpy(namebuf + len, "c");
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000443 fpc = fopen(namebuf, "wb");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000444 if (fpc == NULL) {
445 if (verbose)
446 fprintf(stderr,
447 "# can't create %s\n", namebuf);
448 }
449 else {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000450 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000451 /* First write a 0 for mtime */
452 wr_long(0L, fpc);
453 wr_object((object *)co, fpc);
454 if (ferror(fpc)) {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000455 if (verbose)
456 fprintf(stderr,
457 "# can't write %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000458 /* Don't keep partial file */
459 fclose(fpc);
460 (void) unlink(namebuf);
461 }
462 else {
463 /* Now write the true mtime */
464 fseek(fpc, 4L, 0);
465 wr_long(mtime, fpc);
466 fflush(fpc);
467 fclose(fpc);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000468 if (verbose)
469 fprintf(stderr,
470 "# wrote %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000471 }
472 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000473 break;
474
475 case PY_COMPILED:
476 if (verbose)
Guido van Rossum74e6a111994-08-29 12:54:38 +0000477 fprintf(stderr, "# %s without %s.py\n",
478 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000479 magic = rd_long(fp);
480 if (magic != MAGIC) {
481 err_setstr(ImportError,
482 "Bad magic number in .pyc file");
483 return NULL;
484 }
485 (void) rd_long(fp);
486 use_compiled:
487 v = rd_object(fp);
488 fclose(fp);
489 if (v == NULL || !is_codeobject(v)) {
490 XDECREF(v);
491 err_setstr(ImportError,
492 "Bad code object in .pyc file");
493 return NULL;
494 }
495 co = (codeobject *)v;
496 if (verbose)
497 fprintf(stderr,
498 "import %s # precompiled from %s\n",
499 name, namebuf);
500 break;
501
Guido van Rossum74e6a111994-08-29 12:54:38 +0000502#ifdef DYNAMIC_LINK
Guido van Rossumc45611d1993-11-17 22:58:56 +0000503 case C_EXTENSION:
Guido van Rossumc45611d1993-11-17 22:58:56 +0000504 fclose(fp);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000505 return load_dynamic_module(name, namebuf, m, m_ret);
506#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000507
508 default:
509 fclose(fp);
510 err_setstr(SystemError,
511 "search loop returned unexpected result");
512 return NULL;
513
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000514 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000515
516 /* We get here for either PY_SOURCE or PY_COMPILED */
517 if (m == NULL) {
518 m = add_module(name);
519 if (m == NULL) {
520 freetree(n);
521 return NULL;
522 }
523 *m_ret = m;
524 }
525 d = getmoduledict(m);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000526 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000527 DECREF(co);
528 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000529}
530
531static object *
532load_module(name)
533 char *name;
534{
535 object *m, *v;
536 v = get_module((object *)NULL, name, &m);
537 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000538 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539 DECREF(v);
540 return m;
541}
542
543object *
544import_module(name)
545 char *name;
546{
547 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000548 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000549 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000550 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
551 if (n < 0)
552 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000553 if ((m = dictlookup(modules, name)) == NULL) {
554 if (err_occurred() == NULL)
555 err_setstr(SystemError,
556 "builtin module not initialized properly");
557 }
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000558 }
559 else {
560 m = load_module(name);
561 }
562 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 return m;
564}
565
566object *
567reload_module(m)
568 object *m;
569{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000570 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000571 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000572 if (m == NULL || !is_moduleobject(m)) {
573 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000574 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000575 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000576 name = getmodulename(m);
577 if (name == NULL)
578 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000579 /* Check for built-in modules */
580 for (i = 0; inittab[i].name != NULL; i++) {
581 if (strcmp(name, inittab[i].name) == 0) {
582 err_setstr(ImportError,
583 "cannot reload built-in module");
584 return NULL;
585 }
586 }
587 /* Check for frozen modules */
588 if ((i = init_frozen(name)) != 0) {
589 if (i < 0)
590 return NULL;
591 INCREF(None);
592 return None;
593 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000594 return get_module(m, name, (object **)NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000595}
596
Guido van Rossum3f5da241990-12-20 15:06:42 +0000597void
598doneimport()
599{
600 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000601 int pos;
602 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000603 /* Explicitly erase all modules; this is the safest way
604 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000605 pos = 0;
606 while (mappinggetnext(modules, &pos, &modname, &module)) {
607 if (is_moduleobject(module)) {
608 object *dict;
609 dict = getmoduledict(module);
610 if (dict != NULL && is_dictobject(dict))
611 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000612 }
613 }
Guido van Rossum25831651993-05-19 14:50:45 +0000614 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000615 }
616 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000617 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000618}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000619
620
621/* Initialize built-in modules when first imported */
622
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000623static int
624init_builtin(name)
625 char *name;
626{
627 int i;
628 for (i = 0; inittab[i].name != NULL; i++) {
629 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000630 if (inittab[i].initfunc == NULL) {
631 err_setstr(ImportError,
632 "cannot re-init internal module");
633 return -1;
634 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000635 if (verbose)
636 fprintf(stderr, "import %s # builtin\n",
637 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000638 (*inittab[i].initfunc)();
639 return 1;
640 }
641 }
642 return 0;
643}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000644
645extern struct frozen {
646 char *name;
647 char *code;
648 int size;
649} frozen_modules[];
650
651int
652init_frozen(name)
653 char *name;
654{
655 struct frozen *p;
656 codeobject *co;
657 object *m, *d, *v;
658 for (p = frozen_modules; ; p++) {
659 if (p->name == NULL)
660 return 0;
661 if (strcmp(p->name, name) == 0)
662 break;
663 }
664 if (verbose)
665 fprintf(stderr, "import %s # frozen\n", name);
666 co = (codeobject *) rds_object(p->code, p->size);
667 if (co == NULL)
668 return -1;
669 if ((m = add_module(name)) == NULL ||
670 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000671 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000672 DECREF(co);
673 return -1;
674 }
675 DECREF(co);
676 DECREF(v);
677 return 1;
678}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000679
680
681#ifdef _AIX
682
683#include <ctype.h> /* for isdigit() */
684#include <errno.h> /* for global errno */
685#include <string.h> /* for strerror() */
686
687void aix_loaderror(char *namebuf)
688{
689
690 char *message[8], errbuf[1024];
691 int i,j;
692
693 struct errtab {
694 int errno;
695 char *errstr;
696 } load_errtab[] = {
697 {L_ERROR_TOOMANY, "to many errors, rest skipped."},
698 {L_ERROR_NOLIB, "can't load library:"},
699 {L_ERROR_UNDEF, "can't find symbol in library:"},
700 {L_ERROR_RLDBAD,
701 "RLD index out of range or bad relocation type:"},
702 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
703 {L_ERROR_MEMBER,
704 "file not an archive or does not contain requested member:"},
705 {L_ERROR_TYPE, "symbol table mismatch:"},
706 {L_ERROR_ALIGN, "text allignment in file is wrong."},
707 {L_ERROR_SYSTEM, "System error:"},
708 {L_ERROR_ERRNO, NULL}
709 };
710
711#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
712#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf))
713
714 sprintf(errbuf, " from module %s ", namebuf);
715
716 if (!loadquery(1, &message[0], sizeof(message)))
717 ERRBUF_APPEND(strerror(errno));
718 for(i = 0; message[i] && *message[i]; i++) {
719 int nerr = atoi(message[i]);
720 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
721 if (nerr == load_errtab[i].errno && load_errtab[i].errstr)
722 ERRBUF_APPEND(load_errtab[i].errstr);
723 }
724 while (isdigit(*message[i])) message[i]++ ;
725 ERRBUF_APPEND(message[i]);
726 ERRBUF_APPEND("\n");
727 }
728 errbuf[strlen(errbuf)-1] = '\0' ; /* trim off last newline */
729 err_setstr(ImportError, errbuf);
730 return;
731}
732
733#endif /* _AIX */