blob: 1a13fcfaf3c52571c32180fbd207900f8e834f08 [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 Rossum3f5da241990-12-20 15:06:42 +0000179/* Initialization */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180
181void
182initimport()
183{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000184 if ((modules = newdictobject()) == NULL)
185 fatal("no mem for dictionary of modules");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
188object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000189get_modules()
190{
191 return modules;
192}
193
194object *
195add_module(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 char *name;
197{
198 object *m;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
200 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 m = newmoduleobject(name);
202 if (m == NULL)
203 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204 if (dictinsert(modules, name, m) != 0) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 DECREF(m);
206 return NULL;
207 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000208 DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 return m;
210}
211
Guido van Rossumc45611d1993-11-17 22:58:56 +0000212enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
Guido van Rossume25c2561992-01-19 16:28:21 +0000213
Guido van Rossumc45611d1993-11-17 22:58:56 +0000214static struct filedescr {
215 char *suffix;
216 char *mode;
217 enum filetype type;
218} filetab[] = {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000219#ifdef DYNAMIC_LINK
220#ifdef SHORT_EXT
221 {SHORT_EXT, "rb", C_EXTENSION},
222#endif /* !SHORT_EXT */
223#ifdef LONG_EXT
224 {LONG_EXT, "rb", C_EXTENSION},
225#endif /* !LONG_EXT */
226#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000227 {".py", "r", PY_SOURCE},
228 {".pyc", "rb", PY_COMPILED},
229 {0, 0}
230};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231
Guido van Rossum74e6a111994-08-29 12:54:38 +0000232#ifdef DYNAMIC_LINK
233static object *
234load_dynamic_module(name, namebuf, m, m_ret)
235 char *name;
236 char *namebuf;
237 object *m;
238 object **m_ret;
239{
240 char funcname[258];
241 dl_funcptr p = NULL;
242 if (m != NULL) {
243 err_setstr(ImportError,
244 "cannot reload dynamically loaded module");
245 return NULL;
246 }
247 sprintf(funcname, FUNCNAME_PATTERN, name);
248#ifdef WITH_MAC_DL
249 {
250 object *v = dynamic_load(namebuf);
251 if (v == NULL)
252 return NULL;
253 }
254#else /* !WITH_MAC_DL */
255#ifdef USE_SHLIB
256 {
257#ifdef RTLD_NOW
258 /* RTLD_NOW: resolve externals now
259 (i.e. core dump now if some are missing) */
260 void *handle = dlopen(namebuf, RTLD_NOW);
261#else
262 void *handle;
263 if (verbose)
264 printf("dlopen(\"%s\", %d);\n", namebuf, RTLD_LAZY);
265 handle = dlopen(namebuf, RTLD_LAZY);
266#endif /* RTLD_NOW */
267 if (handle == NULL) {
268 err_setstr(ImportError, dlerror());
269 return NULL;
270 }
271 p = (dl_funcptr) dlsym(handle, funcname);
272 }
273#endif /* USE_SHLIB */
274#ifdef _AIX
275 p = (dl_funcptr) load(namebuf, 1, 0);
276 if (p == NULL) {
277 aix_loaderror(namebuf);
278 return NULL;
279 }
280#endif /* _AIX */
281#ifdef NT
282 {
283 HINSTANCE hDLL;
284 hDLL = LoadLibrary(namebuf);
285 if (hDLL==NULL){
286 char errBuf[64];
287 sprintf(errBuf, "DLL load failed with error code %d",
288 GetLastError());
289 err_setstr(ImportError, errBuf);
290 return NULL;
291 }
292 p = GetProcAddress(hDLL, funcname);
293 }
294#endif /* NT */
295#ifdef USE_DL
296 p = dl_loadmod(getprogramname(), namebuf, funcname);
297#endif /* USE_DL */
298#ifdef USE_RLD
299 {
300 NXStream *errorStream;
301 struct mach_header *new_header;
302 const char *filenames[2];
303 long ret;
304 unsigned long ptr;
305
306 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
307 filenames[0] = namebuf;
308 filenames[1] = NULL;
309 ret = rld_load(errorStream, &new_header,
310 filenames, NULL);
311
312 /* extract the error messages for the exception */
313 if(!ret) {
314 char *streamBuf;
315 int len, maxLen;
316
317 NXPutc(errorStream, (char)0);
318
319 NXGetMemoryBuffer(errorStream,
320 &streamBuf, &len, &maxLen);
321 err_setstr(ImportError, streamBuf);
322 }
323
324 if(ret && rld_lookup(errorStream, funcname, &ptr))
325 p = (dl_funcptr) ptr;
326
327 NXCloseMemory(errorStream, NX_FREEBUFFER);
328
329 if(!ret)
330 return NULL;
331 }
332#endif /* USE_RLD */
Guido van Rossumae311bd1994-09-12 10:39:56 +0000333#ifdef hpux
334 {
335 shl_t lib;
336 int flags;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000337
Guido van Rossumae311bd1994-09-12 10:39:56 +0000338 flags = BIND_DEFERRED;
339 if (verbose)
340 {
341 flags = BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE;
342 printf("shl_load %s\n",namebuf);
343 }
344 lib = shl_load(namebuf, flags, 0);
345 if (lib == NULL)
346 {
347 char buf[256];
348 if (verbose)
349 perror(namebuf);
350 sprintf(buf,"Failed to load %s", namebuf);
351 err_setstr(ImportError, buf);
352 return NULL;
353 }
354 if (verbose)
355 printf("shl_findsym %s\n", funcname);
356 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
357 if (p == NULL && verbose)
358 perror(funcname);
359 }
360#endif hpux
Guido van Rossum74e6a111994-08-29 12:54:38 +0000361 if (p == NULL) {
362 err_setstr(ImportError,
363 "dynamic module does not define init function");
364 return NULL;
365 }
366 (*p)();
367
368#endif /* !WITH_MAC_DL */
369 *m_ret = m = dictlookup(modules, name);
370 if (m == NULL) {
371 if (err_occurred() == NULL)
372 err_setstr(SystemError,
373 "dynamic module not initialized properly");
374 return NULL;
375 }
376 if (verbose)
377 fprintf(stderr,
378 "import %s # dynamically loaded from %s\n",
379 name, namebuf);
380 INCREF(None);
381 return None;
382}
383#endif /* DYNAMIC_LINK */
384
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000386get_module(m, name, m_ret)
387 /*module*/object *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 object **m_ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000391 int err, npath, i, len;
392 long magic;
393 long mtime, pyc_mtime;
Guido van Rossumd8bac6d1992-02-26 15:19:13 +0000394 char namebuf[MAXPATHLEN+1];
Guido van Rossumc45611d1993-11-17 22:58:56 +0000395 struct filedescr *fdp;
396 FILE *fp = NULL, *fpc = NULL;
397 node *n = NULL;
398 object *path, *v, *d;
399 codeobject *co = NULL;
Guido van Rossum21d335e1993-10-15 13:01:11 +0000400
Guido van Rossumc45611d1993-11-17 22:58:56 +0000401 path = sysget("path");
402 if (path == NULL || !is_listobject(path)) {
403 err_setstr(ImportError,
404 "sys.path must be list of directory names");
405 return NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000406 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000407 npath = getlistsize(path);
408 for (i = 0; i < npath; i++) {
409 v = getlistitem(path, i);
410 if (!is_stringobject(v))
411 continue;
412 strcpy(namebuf, getstringvalue(v));
413 len = getstringsize(v);
414 if (len > 0 && namebuf[len-1] != SEP)
415 namebuf[len++] = SEP;
416 strcpy(namebuf+len, name);
417 len += strlen(name);
418 for (fdp = filetab; fdp->suffix != NULL; fdp++) {
419 strcpy(namebuf+len, fdp->suffix);
420 if (verbose > 1)
421 fprintf(stderr, "# trying %s\n", namebuf);
422 fp = fopen(namebuf, fdp->mode);
423 if (fp != NULL)
424 break;
425 }
426 if (fp != NULL)
427 break;
428 }
429 if (fp == NULL) {
430 sprintf(namebuf, "No module named %s", name);
431 err_setstr(ImportError, namebuf);
432 return NULL;
433 }
434
435 switch (fdp->type) {
436
437 case PY_SOURCE:
Guido van Rossum21d335e1993-10-15 13:01:11 +0000438 mtime = getmtime(namebuf);
Guido van Rossum590baa41993-11-30 13:40:46 +0000439 len = strlen(namebuf);
440 strcpy(namebuf + len, "c");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000441 fpc = fopen(namebuf, "rb");
442 if (fpc != NULL) {
443 magic = rd_long(fpc);
444 if (magic != MAGIC) {
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000445 if (verbose)
446 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000447 "# %s has bad magic\n",
448 namebuf);
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000449 }
450 else {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000451 pyc_mtime = rd_long(fpc);
452 if (pyc_mtime != mtime) {
453 if (verbose)
454 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000455 "# %s has bad mtime\n",
456 namebuf);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000457 }
458 else {
459 fclose(fp);
460 fp = fpc;
461 if (verbose)
462 fprintf(stderr,
Guido van Rossum74e6a111994-08-29 12:54:38 +0000463 "# %s matches %s.py\n",
464 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000465 goto use_compiled;
466 }
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000467 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000468 fclose(fpc);
469 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000470 namebuf[len] = '\0';
Guido van Rossum74e6a111994-08-29 12:54:38 +0000471 n = parse_file(fp, namebuf, file_input);
472 fclose(fp);
473 if (n == NULL)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +0000474 return NULL;
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000475 co = compile(n, namebuf);
476 freetree(n);
477 if (co == NULL)
478 return NULL;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000479 if (verbose)
480 fprintf(stderr,
Guido van Rossum590baa41993-11-30 13:40:46 +0000481 "import %s # from %s\n", name, namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000482 /* Now write the code object to the ".pyc" file */
Guido van Rossum590baa41993-11-30 13:40:46 +0000483 strcpy(namebuf + len, "c");
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000484 fpc = fopen(namebuf, "wb");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000485 if (fpc == NULL) {
486 if (verbose)
487 fprintf(stderr,
488 "# can't create %s\n", namebuf);
489 }
490 else {
Guido van Rossum3ddee711991-12-16 13:06:34 +0000491 wr_long(MAGIC, fpc);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000492 /* First write a 0 for mtime */
493 wr_long(0L, fpc);
494 wr_object((object *)co, fpc);
495 if (ferror(fpc)) {
Guido van Rossumc45611d1993-11-17 22:58:56 +0000496 if (verbose)
497 fprintf(stderr,
498 "# can't write %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000499 /* Don't keep partial file */
500 fclose(fpc);
501 (void) unlink(namebuf);
502 }
503 else {
504 /* Now write the true mtime */
505 fseek(fpc, 4L, 0);
506 wr_long(mtime, fpc);
507 fflush(fpc);
508 fclose(fpc);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000509 if (verbose)
510 fprintf(stderr,
511 "# wrote %s\n", namebuf);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000512 }
513 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000514 break;
515
516 case PY_COMPILED:
517 if (verbose)
Guido van Rossum74e6a111994-08-29 12:54:38 +0000518 fprintf(stderr, "# %s without %s.py\n",
519 namebuf, name);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000520 magic = rd_long(fp);
521 if (magic != MAGIC) {
522 err_setstr(ImportError,
523 "Bad magic number in .pyc file");
524 return NULL;
525 }
526 (void) rd_long(fp);
527 use_compiled:
528 v = rd_object(fp);
529 fclose(fp);
530 if (v == NULL || !is_codeobject(v)) {
531 XDECREF(v);
532 err_setstr(ImportError,
533 "Bad code object in .pyc file");
534 return NULL;
535 }
536 co = (codeobject *)v;
537 if (verbose)
538 fprintf(stderr,
539 "import %s # precompiled from %s\n",
540 name, namebuf);
541 break;
542
Guido van Rossum74e6a111994-08-29 12:54:38 +0000543#ifdef DYNAMIC_LINK
Guido van Rossumc45611d1993-11-17 22:58:56 +0000544 case C_EXTENSION:
Guido van Rossumc45611d1993-11-17 22:58:56 +0000545 fclose(fp);
Guido van Rossum74e6a111994-08-29 12:54:38 +0000546 return load_dynamic_module(name, namebuf, m, m_ret);
547#endif /* DYNAMIC_LINK */
Guido van Rossumc45611d1993-11-17 22:58:56 +0000548
549 default:
550 fclose(fp);
551 err_setstr(SystemError,
552 "search loop returned unexpected result");
553 return NULL;
554
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000555 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000556
557 /* We get here for either PY_SOURCE or PY_COMPILED */
558 if (m == NULL) {
559 m = add_module(name);
560 if (m == NULL) {
561 freetree(n);
562 return NULL;
563 }
564 *m_ret = m;
565 }
566 d = getmoduledict(m);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000567 v = eval_code(co, d, d, d, (object *)NULL);
Guido van Rossumc405b7b1991-06-04 19:39:42 +0000568 DECREF(co);
569 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000570}
571
572static object *
573load_module(name)
574 char *name;
575{
576 object *m, *v;
577 v = get_module((object *)NULL, name, &m);
578 if (v == NULL)
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000579 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000580 DECREF(v);
581 return m;
582}
583
584object *
585import_module(name)
586 char *name;
587{
588 object *m;
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000589 int n;
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000590 if ((m = dictlookup(modules, name)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000591 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
592 if (n < 0)
593 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000594 if ((m = dictlookup(modules, name)) == NULL) {
595 if (err_occurred() == NULL)
596 err_setstr(SystemError,
597 "builtin module not initialized properly");
598 }
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000599 }
600 else {
601 m = load_module(name);
602 }
603 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000604 return m;
605}
606
607object *
608reload_module(m)
609 object *m;
610{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000611 char *name;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000612 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000613 if (m == NULL || !is_moduleobject(m)) {
614 err_setstr(TypeError, "reload() argument must be module");
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000615 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000616 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000617 name = getmodulename(m);
618 if (name == NULL)
619 return NULL;
Guido van Rossum74e6a111994-08-29 12:54:38 +0000620 /* Check for built-in modules */
621 for (i = 0; inittab[i].name != NULL; i++) {
622 if (strcmp(name, inittab[i].name) == 0) {
623 err_setstr(ImportError,
624 "cannot reload built-in module");
625 return NULL;
626 }
627 }
628 /* Check for frozen modules */
629 if ((i = init_frozen(name)) != 0) {
630 if (i < 0)
631 return NULL;
632 INCREF(None);
633 return None;
634 }
Guido van Rossumc45611d1993-11-17 22:58:56 +0000635 return get_module(m, name, (object **)NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000636}
637
Guido van Rossum3f5da241990-12-20 15:06:42 +0000638void
639doneimport()
640{
641 if (modules != NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +0000642 int pos;
643 object *modname, *module;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000644 /* Explicitly erase all modules; this is the safest way
645 to get rid of at least *some* circular dependencies */
Guido van Rossum25831651993-05-19 14:50:45 +0000646 pos = 0;
647 while (mappinggetnext(modules, &pos, &modname, &module)) {
648 if (is_moduleobject(module)) {
649 object *dict;
650 dict = getmoduledict(module);
651 if (dict != NULL && is_dictobject(dict))
652 mappingclear(dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000653 }
654 }
Guido van Rossum25831651993-05-19 14:50:45 +0000655 mappingclear(modules);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000656 }
657 DECREF(modules);
Guido van Rossum25831651993-05-19 14:50:45 +0000658 modules = NULL;
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000659}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000660
661
662/* Initialize built-in modules when first imported */
663
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000664static int
665init_builtin(name)
666 char *name;
667{
668 int i;
669 for (i = 0; inittab[i].name != NULL; i++) {
670 if (strcmp(name, inittab[i].name) == 0) {
Guido van Rossum74e6a111994-08-29 12:54:38 +0000671 if (inittab[i].initfunc == NULL) {
672 err_setstr(ImportError,
673 "cannot re-init internal module");
674 return -1;
675 }
Guido van Rossum4cd8b5c1992-03-27 17:21:04 +0000676 if (verbose)
677 fprintf(stderr, "import %s # builtin\n",
678 name);
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000679 (*inittab[i].initfunc)();
680 return 1;
681 }
682 }
683 return 0;
684}
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000685
686extern struct frozen {
687 char *name;
688 char *code;
689 int size;
690} frozen_modules[];
691
692int
693init_frozen(name)
694 char *name;
695{
696 struct frozen *p;
697 codeobject *co;
698 object *m, *d, *v;
699 for (p = frozen_modules; ; p++) {
700 if (p->name == NULL)
701 return 0;
702 if (strcmp(p->name, name) == 0)
703 break;
704 }
705 if (verbose)
706 fprintf(stderr, "import %s # frozen\n", name);
707 co = (codeobject *) rds_object(p->code, p->size);
708 if (co == NULL)
709 return -1;
710 if ((m = add_module(name)) == NULL ||
711 (d = getmoduledict(m)) == NULL ||
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000712 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000713 DECREF(co);
714 return -1;
715 }
716 DECREF(co);
717 DECREF(v);
718 return 1;
719}
Guido van Rossum74e6a111994-08-29 12:54:38 +0000720
721
722#ifdef _AIX
723
724#include <ctype.h> /* for isdigit() */
725#include <errno.h> /* for global errno */
726#include <string.h> /* for strerror() */
727
728void aix_loaderror(char *namebuf)
729{
730
731 char *message[8], errbuf[1024];
732 int i,j;
733
734 struct errtab {
735 int errno;
736 char *errstr;
737 } load_errtab[] = {
738 {L_ERROR_TOOMANY, "to many errors, rest skipped."},
739 {L_ERROR_NOLIB, "can't load library:"},
740 {L_ERROR_UNDEF, "can't find symbol in library:"},
741 {L_ERROR_RLDBAD,
742 "RLD index out of range or bad relocation type:"},
743 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
744 {L_ERROR_MEMBER,
745 "file not an archive or does not contain requested member:"},
746 {L_ERROR_TYPE, "symbol table mismatch:"},
747 {L_ERROR_ALIGN, "text allignment in file is wrong."},
748 {L_ERROR_SYSTEM, "System error:"},
749 {L_ERROR_ERRNO, NULL}
750 };
751
752#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
753#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf))
754
755 sprintf(errbuf, " from module %s ", namebuf);
756
757 if (!loadquery(1, &message[0], sizeof(message)))
758 ERRBUF_APPEND(strerror(errno));
759 for(i = 0; message[i] && *message[i]; i++) {
760 int nerr = atoi(message[i]);
761 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
762 if (nerr == load_errtab[i].errno && load_errtab[i].errstr)
763 ERRBUF_APPEND(load_errtab[i].errstr);
764 }
765 while (isdigit(*message[i])) message[i]++ ;
766 ERRBUF_APPEND(message[i]);
767 ERRBUF_APPEND("\n");
768 }
769 errbuf[strlen(errbuf)-1] = '\0' ; /* trim off last newline */
770 err_setstr(ImportError, errbuf);
771 return;
772}
773
774#endif /* _AIX */