blob: f65504193349cceb2561d6982c4013daeeb9a00a [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"
Guido van Rossumae311bd1994-09-12 10:39:56 +000065 hpux -- HP-UX Dynamic Linking - defined by the compiler
Guido van Rossum74e6a111994-08-29 12:54:38 +000066
67 (The other WITH_* symbols are used only once, to set the
68 appropriate symbols.)
69*/
70
71/* Configure dynamic linking */
72
Guido van Rossumae311bd1994-09-12 10:39:56 +000073#ifdef hpux
74#define DYNAMIC_LINK
75#include <errno.h>
76typedef void (*dl_funcptr)();
77#define _DL_FUNCPTR_DEFINED 1
78#define SHORT_EXT ".sl"
79#define LONG_EXT "module.sl"
80#endif
81
Guido van Rossum74e6a111994-08-29 12:54:38 +000082#ifdef NT
83#define DYNAMIC_LINK
84#include <windows.h>
85typedef FARPROC dl_funcptr;
86#define _DL_FUNCPTR_DEFINED
87#define SHORT_EXT ".dll"
88#define LONG_EXT "module.dll"
Guido van Rossume25c2561992-01-19 16:28:21 +000089#endif
90
Guido van Rossum74e6a111994-08-29 12:54:38 +000091#if defined(NeXT) || defined(WITH_RLD)
92#define DYNAMIC_LINK
93#define USE_RLD
94#endif
95
96#ifdef WITH_SGI_DL
97#define DYNAMIC_LINK
98#define USE_DL
99#endif
100
101#ifdef WITH_DL_DLD
102#define DYNAMIC_LINK
103#define USE_DL
104#endif
105
106#ifdef WITH_MAC_DL
107#define DYNAMIC_LINK
108#endif
109
110#if !defined(DYNAMIC_LINK) && defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
111#define DYNAMIC_LINK
112#define USE_SHLIB
113#endif
114
115#ifdef _AIX
116#define DYNAMIC_LINK
117#include <sys/ldr.h>
118typedef void (*dl_funcptr)();
119#define _DL_FUNCPTR_DEFINED
120static void aix_loaderror(char *name);
121#endif
122
123#ifdef DYNAMIC_LINK
124
125#ifdef USE_SHLIB
126#include <dlfcn.h>
127#ifndef _DL_FUNCPTR_DEFINED
128typedef void (*dl_funcptr)();
129#endif
130#ifndef RTLD_LAZY
131#define RTLD_LAZY 1
132#endif
133#define SHORT_EXT ".so"
134#define LONG_EXT "module.so"
135#endif /* USE_SHLIB */
136
Guido van Rossumae311bd1994-09-12 10:39:56 +0000137#if defined(USE_DL) || defined(hpux)
Guido van Rossum74e6a111994-08-29 12:54:38 +0000138#include "dl.h"
139#endif
140
141#ifdef WITH_MAC_DL
142#include "dynamic_load.h"
143#endif
144
145#ifdef USE_RLD
146#include <mach-o/rld.h>
147#define FUNCNAME_PATTERN "_init%s"
148#ifndef _DL_FUNCPTR_DEFINED
149typedef void (*dl_funcptr)();
150#endif
151#endif /* USE_RLD */
152
153extern char *getprogramname();
154
155#ifndef FUNCNAME_PATTERN
Guido van Rossumae311bd1994-09-12 10:39:56 +0000156#if defined(__hp9000s300)
157#define FUNCNAME_PATTERN "_init%s"
158#else
Guido van Rossum74e6a111994-08-29 12:54:38 +0000159#define FUNCNAME_PATTERN "init%s"
160#endif
Guido van Rossumae311bd1994-09-12 10:39:56 +0000161#endif
Guido van Rossum74e6a111994-08-29 12:54:38 +0000162
163#if !defined(SHORT_EXT) && !defined(LONG_EXT)
164#define SHORT_EXT ".o"
165#define LONG_EXT "module.o"
166#endif /* !SHORT_EXT && !LONG_EXT */
167
168#endif /* DYNAMIC_LINK */
169
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000170/* Magic word to reject .pyc files generated by other Python versions */
Guido van Rossum3ddee711991-12-16 13:06:34 +0000171
Guido van Rossum74e6a111994-08-29 12:54:38 +0000172#define MAGIC 0x999903L /* Increment by one for each incompatible change */
Guido van Rossum3ddee711991-12-16 13:06:34 +0000173
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174static object *modules;
175
Guido van Rossum66f1fa81991-04-03 19:03:52 +0000176/* Forward */
177static int init_builtin PROTO((char *));
178
Guido van Rossumfdef2711994-09-14 13:31:04 +0000179/* Helper for reading .pyc files */
180
181long
182get_pyc_magic()
183{
184 return MAGIC;
185}
186
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188
189void
190initimport()
191{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000192 if ((modules = newdictobject()) == NULL)
193 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194}
195
196object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197get_modules()
198{
199 return modules;
200}
201
202object *
203add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 char *name;
205{
206 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
208 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 m = newmoduleobject(name);
210 if (m == NULL)
211 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000212 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 DECREF(m);
214 return NULL;
215 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000216 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 return m;
218}
219
Guido van Rossumc45611d1993-11-17 22:58:56 +0000220enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
Guido van Rossume25c2561992-01-19 16:28:21 +0000221
Guido van Rossumc45611d1993-11-17 22:58:56 +0000222static struct filedescr {
223 char *suffix;
224 char *mode;
225 enum filetype type;
226} filetab[] = {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000227#ifdef DYNAMIC_LINK
228#ifdef SHORT_EXT
229 {SHORT_EXT, "rb", C_EXTENSION},
230#endif /* !SHORT_EXT */
231#ifdef LONG_EXT
232 {LONG_EXT, "rb", C_EXTENSION},
233#endif /* !LONG_EXT */
234#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000235 {".py", "r", PY_SOURCE},
236 {".pyc", "rb", PY_COMPILED},
237 {0, 0}
238};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239
Guido van Rossum74e6a111994-08-29 12:54:38 +0000240#ifdef DYNAMIC_LINK
241static object *
242load_dynamic_module(name, namebuf, m, m_ret)
243 char *name;
244 char *namebuf;
245 object *m;
246 object **m_ret;
247{
248 char funcname[258];
249 dl_funcptr p = NULL;
250 if (m != NULL) {
251 err_setstr(ImportError,
252 "cannot reload dynamically loaded module");
253 return NULL;
254 }
255 sprintf(funcname, FUNCNAME_PATTERN, name);
256#ifdef WITH_MAC_DL
257 {
258 object *v = dynamic_load(namebuf);
259 if (v == NULL)
260 return NULL;
261 }
262#else /* !WITH_MAC_DL */
263#ifdef USE_SHLIB
264 {
265#ifdef RTLD_NOW
266 /* RTLD_NOW: resolve externals now
267 (i.e. core dump now if some are missing) */
268 void *handle = dlopen(namebuf, RTLD_NOW);
269#else
270 void *handle;
271 if (verbose)
272 printf("dlopen(\"%s\", %d);\n", namebuf, RTLD_LAZY);
273 handle = dlopen(namebuf, RTLD_LAZY);
274#endif /* RTLD_NOW */
275 if (handle == NULL) {
276 err_setstr(ImportError, dlerror());
277 return NULL;
278 }
279 p = (dl_funcptr) dlsym(handle, funcname);
280 }
281#endif /* USE_SHLIB */
282#ifdef _AIX
283 p = (dl_funcptr) load(namebuf, 1, 0);
284 if (p == NULL) {
285 aix_loaderror(namebuf);
286 return NULL;
287 }
288#endif /* _AIX */
289#ifdef NT
290 {
291 HINSTANCE hDLL;
292 hDLL = LoadLibrary(namebuf);
293 if (hDLL==NULL){
294 char errBuf[64];
295 sprintf(errBuf, "DLL load failed with error code %d",
296 GetLastError());
297 err_setstr(ImportError, errBuf);
298 return NULL;
299 }
300 p = GetProcAddress(hDLL, funcname);
301 }
302#endif /* NT */
303#ifdef USE_DL
304 p = dl_loadmod(getprogramname(), namebuf, funcname);
305#endif /* USE_DL */
306#ifdef USE_RLD
307 {
308 NXStream *errorStream;
309 struct mach_header *new_header;
310 const char *filenames[2];
311 long ret;
312 unsigned long ptr;
313
314 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
315 filenames[0] = namebuf;
316 filenames[1] = NULL;
317 ret = rld_load(errorStream, &new_header,
318 filenames, NULL);
319
320 /* extract the error messages for the exception */
321 if(!ret) {
322 char *streamBuf;
323 int len, maxLen;
324
325 NXPutc(errorStream, (char)0);
326
327 NXGetMemoryBuffer(errorStream,
328 &streamBuf, &len, &maxLen);
329 err_setstr(ImportError, streamBuf);
330 }
331
332 if(ret && rld_lookup(errorStream, funcname, &ptr))
333 p = (dl_funcptr) ptr;
334
335 NXCloseMemory(errorStream, NX_FREEBUFFER);
336
337 if(!ret)
338 return NULL;
339 }
340#endif /* USE_RLD */
Guido van Rossumae311bd1994-09-12 10:39:56 +0000341#ifdef hpux
342 {
343 shl_t lib;
344 int flags;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000345
Guido van Rossumae311bd1994-09-12 10:39:56 +0000346 flags = BIND_DEFERRED;
347 if (verbose)
348 {
349 flags = BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE;
350 printf("shl_load %s\n",namebuf);
351 }
352 lib = shl_load(namebuf, flags, 0);
353 if (lib == NULL)
354 {
355 char buf[256];
356 if (verbose)
357 perror(namebuf);
358 sprintf(buf,"Failed to load %s", namebuf);
359 err_setstr(ImportError, buf);
360 return NULL;
361 }
362 if (verbose)
363 printf("shl_findsym %s\n", funcname);
364 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
365 if (p == NULL && verbose)
366 perror(funcname);
367 }
368#endif hpux
Guido van Rossum74e6a111994-08-29 12:54:38 +0000369 if (p == NULL) {
370 err_setstr(ImportError,
371 "dynamic module does not define init function");
372 return NULL;
373 }
374 (*p)();
375
376#endif /* !WITH_MAC_DL */
377 *m_ret = m = dictlookup(modules, name);
378 if (m == NULL) {
379 if (err_occurred() == NULL)
380 err_setstr(SystemError,
381 "dynamic module not initialized properly");
382 return NULL;
383 }
384 if (verbose)
385 fprintf(stderr,
386 "import %s # dynamically loaded from %s\n",
387 name, namebuf);
388 INCREF(None);
389 return None;
390}
391#endif /* DYNAMIC_LINK */
392
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394get_module(m, name, m_ret)
395 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000399 int err, npath, i, len;
400 long magic;
401 long mtime, pyc_mtime;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000402 char namebuf[MAXPATHLEN+1];
Guido van Rossumc45611d1993-11-17 22:58:56 +0000403 struct filedescr *fdp;
404 FILE *fp = NULL, *fpc = NULL;
405 node *n = NULL;
406 object *path, *v, *d;
407 codeobject *co = NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000408
Guido van Rossumc45611d1993-11-17 22:58:56 +0000409 path = sysget("path");
410 if (path == NULL || !is_listobject(path)) {
411 err_setstr(ImportError,
412 "sys.path must be list of directory names");
413 return NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000414 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000415 npath = getlistsize(path);
416 for (i = 0; i < npath; i++) {
417 v = getlistitem(path, i);
418 if (!is_stringobject(v))
419 continue;
420 strcpy(namebuf, getstringvalue(v));
421 len = getstringsize(v);
422 if (len > 0 && namebuf[len-1] != SEP)
423 namebuf[len++] = SEP;
424 strcpy(namebuf+len, name);
425 len += strlen(name);
426 for (fdp = filetab; fdp->suffix != NULL; fdp++) {
427 strcpy(namebuf+len, fdp->suffix);
428 if (verbose > 1)
429 fprintf(stderr, "# trying %s\n", namebuf);
430 fp = fopen(namebuf, fdp->mode);
431 if (fp != NULL)
432 break;
433 }
434 if (fp != NULL)
435 break;
436 }
437 if (fp == NULL) {
438 sprintf(namebuf, "No module named %s", name);
439 err_setstr(ImportError, namebuf);
440 return NULL;
441 }
442
443 switch (fdp->type) {
444
445 case PY_SOURCE:
Guido van Rossum21d335e1993-10-15 13:01:11 +0000446 mtime = getmtime(namebuf);
Guido van Rossum590baa41993-11-30 13:40:46 +0000447 len = strlen(namebuf);
448 strcpy(namebuf + len, "c");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000449 fpc = fopen(namebuf, "rb");
450 if (fpc != NULL) {
451 magic = rd_long(fpc);
452 if (magic != MAGIC) {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000453 if (verbose)
454 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000455 "# %s has bad magic\n",
456 namebuf);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000457 }
458 else {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000459 pyc_mtime = rd_long(fpc);
460 if (pyc_mtime != mtime) {
461 if (verbose)
462 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000463 "# %s has bad mtime\n",
464 namebuf);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000465 }
466 else {
467 fclose(fp);
468 fp = fpc;
469 if (verbose)
470 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000471 "# %s matches %s.py\n",
472 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000473 goto use_compiled;
474 }
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000475 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000476 fclose(fpc);
477 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000478 namebuf[len] = '\0';
Guido van Rossum74e6a111994-08-29 12:54:38 +0000479 n = parse_file(fp, namebuf, file_input);
480 fclose(fp);
481 if (n == NULL)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000482 return NULL;
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000483 co = compile(n, namebuf);
484 freetree(n);
485 if (co == NULL)
486 return NULL;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000487 if (verbose)
488 fprintf(stderr,
Guido van Rossum590baa41993-11-30 13:40:46 +0000489 "import %s # from %s\n", name, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000490 /* Now write the code object to the ".pyc" file */
Guido van Rossum590baa41993-11-30 13:40:46 +0000491 strcpy(namebuf + len, "c");
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000492 fpc = fopen(namebuf, "wb");
Guido van Rossumfdef2711994-09-14 13:31:04 +0000493#ifdef macintosh
494 setfiletype(namebuf, 'PYTH', 'PYC ');
495#endif
Guido van Rossumc45611d1993-11-17 22:58:56 +0000496 if (fpc == NULL) {
497 if (verbose)
498 fprintf(stderr,
499 "# can't create %s\n", namebuf);
500 }
501 else {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000502 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000503 /* First write a 0 for mtime */
504 wr_long(0L, fpc);
505 wr_object((object *)co, fpc);
506 if (ferror(fpc)) {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000507 if (verbose)
508 fprintf(stderr,
509 "# can't write %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000510 /* Don't keep partial file */
511 fclose(fpc);
512 (void) unlink(namebuf);
513 }
514 else {
515 /* Now write the true mtime */
516 fseek(fpc, 4L, 0);
517 wr_long(mtime, fpc);
518 fflush(fpc);
519 fclose(fpc);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000520 if (verbose)
521 fprintf(stderr,
522 "# wrote %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000523 }
524 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000525 break;
526
527 case PY_COMPILED:
528 if (verbose)
Guido van Rossum74e6a111994-08-29 12:54:38 +0000529 fprintf(stderr, "# %s without %s.py\n",
530 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000531 magic = rd_long(fp);
532 if (magic != MAGIC) {
533 err_setstr(ImportError,
534 "Bad magic number in .pyc file");
535 return NULL;
536 }
537 (void) rd_long(fp);
538 use_compiled:
539 v = rd_object(fp);
540 fclose(fp);
541 if (v == NULL || !is_codeobject(v)) {
542 XDECREF(v);
543 err_setstr(ImportError,
544 "Bad code object in .pyc file");
545 return NULL;
546 }
547 co = (codeobject *)v;
548 if (verbose)
549 fprintf(stderr,
550 "import %s # precompiled from %s\n",
551 name, namebuf);
552 break;
553
Guido van Rossum74e6a111994-08-29 12:54:38 +0000554#ifdef DYNAMIC_LINK
Guido van Rossumc45611d1993-11-17 22:58:56 +0000555 case C_EXTENSION:
Guido van Rossumc45611d1993-11-17 22:58:56 +0000556 fclose(fp);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000557 return load_dynamic_module(name, namebuf, m, m_ret);
558#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000559
560 default:
561 fclose(fp);
562 err_setstr(SystemError,
563 "search loop returned unexpected result");
564 return NULL;
565
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000566 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000567
568 /* We get here for either PY_SOURCE or PY_COMPILED */
569 if (m == NULL) {
570 m = add_module(name);
571 if (m == NULL) {
572 freetree(n);
573 return NULL;
574 }
575 *m_ret = m;
576 }
577 d = getmoduledict(m);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000578 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000579 DECREF(co);
580 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000581}
582
583static object *
584load_module(name)
585 char *name;
586{
587 object *m, *v;
588 v = get_module((object *)NULL, name, &m);
589 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000590 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000591 DECREF(v);
592 return m;
593}
594
595object *
596import_module(name)
597 char *name;
598{
599 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000600 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000601 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000602 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
603 if (n < 0)
604 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000605 if ((m = dictlookup(modules, name)) == NULL) {
606 if (err_occurred() == NULL)
607 err_setstr(SystemError,
608 "builtin module not initialized properly");
609 }
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000610 }
611 else {
612 m = load_module(name);
613 }
614 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000615 return m;
616}
617
618object *
619reload_module(m)
620 object *m;
621{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000622 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000623 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000624 if (m == NULL || !is_moduleobject(m)) {
625 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000626 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000627 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000628 name = getmodulename(m);
629 if (name == NULL)
630 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000631 /* Check for built-in modules */
632 for (i = 0; inittab[i].name != NULL; i++) {
633 if (strcmp(name, inittab[i].name) == 0) {
634 err_setstr(ImportError,
635 "cannot reload built-in module");
636 return NULL;
637 }
638 }
639 /* Check for frozen modules */
640 if ((i = init_frozen(name)) != 0) {
641 if (i < 0)
642 return NULL;
643 INCREF(None);
644 return None;
645 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000646 return get_module(m, name, (object **)NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000647}
648
Guido van Rossum3f5da241990-12-20 15:06:42 +0000649void
650doneimport()
651{
652 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000653 int pos;
654 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655 /* Explicitly erase all modules; this is the safest way
656 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000657 pos = 0;
658 while (mappinggetnext(modules, &pos, &modname, &module)) {
659 if (is_moduleobject(module)) {
660 object *dict;
661 dict = getmoduledict(module);
662 if (dict != NULL && is_dictobject(dict))
663 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664 }
665 }
Guido van Rossum25831651993-05-19 14:50:45 +0000666 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000667 }
668 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000669 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000670}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000671
672
673/* Initialize built-in modules when first imported */
674
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000675static int
676init_builtin(name)
677 char *name;
678{
679 int i;
680 for (i = 0; inittab[i].name != NULL; i++) {
681 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000682 if (inittab[i].initfunc == NULL) {
683 err_setstr(ImportError,
684 "cannot re-init internal module");
685 return -1;
686 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000687 if (verbose)
688 fprintf(stderr, "import %s # builtin\n",
689 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000690 (*inittab[i].initfunc)();
691 return 1;
692 }
693 }
694 return 0;
695}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000696
697extern struct frozen {
698 char *name;
699 char *code;
700 int size;
701} frozen_modules[];
702
703int
704init_frozen(name)
705 char *name;
706{
707 struct frozen *p;
708 codeobject *co;
709 object *m, *d, *v;
710 for (p = frozen_modules; ; p++) {
711 if (p->name == NULL)
712 return 0;
713 if (strcmp(p->name, name) == 0)
714 break;
715 }
716 if (verbose)
717 fprintf(stderr, "import %s # frozen\n", name);
718 co = (codeobject *) rds_object(p->code, p->size);
719 if (co == NULL)
720 return -1;
721 if ((m = add_module(name)) == NULL ||
722 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000723 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000724 DECREF(co);
725 return -1;
726 }
727 DECREF(co);
728 DECREF(v);
729 return 1;
730}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000731
732
733#ifdef _AIX
734
735#include <ctype.h> /* for isdigit() */
736#include <errno.h> /* for global errno */
737#include <string.h> /* for strerror() */
738
739void aix_loaderror(char *namebuf)
740{
741
742 char *message[8], errbuf[1024];
743 int i,j;
744
745 struct errtab {
746 int errno;
747 char *errstr;
748 } load_errtab[] = {
749 {L_ERROR_TOOMANY, "to many errors, rest skipped."},
750 {L_ERROR_NOLIB, "can't load library:"},
751 {L_ERROR_UNDEF, "can't find symbol in library:"},
752 {L_ERROR_RLDBAD,
753 "RLD index out of range or bad relocation type:"},
754 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
755 {L_ERROR_MEMBER,
756 "file not an archive or does not contain requested member:"},
757 {L_ERROR_TYPE, "symbol table mismatch:"},
758 {L_ERROR_ALIGN, "text allignment in file is wrong."},
759 {L_ERROR_SYSTEM, "System error:"},
760 {L_ERROR_ERRNO, NULL}
761 };
762
763#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
764#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf))
765
766 sprintf(errbuf, " from module %s ", namebuf);
767
768 if (!loadquery(1, &message[0], sizeof(message)))
769 ERRBUF_APPEND(strerror(errno));
770 for(i = 0; message[i] && *message[i]; i++) {
771 int nerr = atoi(message[i]);
772 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
773 if (nerr == load_errtab[i].errno && load_errtab[i].errstr)
774 ERRBUF_APPEND(load_errtab[i].errstr);
775 }
776 while (isdigit(*message[i])) message[i]++ ;
777 ERRBUF_APPEND(message[i]);
778 ERRBUF_APPEND("\n");
779 }
780 errbuf[strlen(errbuf)-1] = '\0' ; /* trim off last newline */
781 err_setstr(ImportError, errbuf);
782 return;
783}
784
785#endif /* _AIX */