annotate Python/import.c @ 2005:ed5d0ad5ea2f legacy-trunk

set name to <lambda> instead of None for lambdas
author Guido van Rossum <guido@python.org>
date Thu, 10 Nov 1994 22:40:34 +0000
parents 61c3c1a2fdb4
children 3d822e32c329
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
1 /***********************************************************
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2 Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
1198
2937897a7d8b * Added Fixcprt.py: script to fix copyright message.
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
3 Amsterdam, The Netherlands.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
4
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
5 All Rights Reserved
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
6
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
8 documentation for any purpose and without fee is hereby granted,
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
9 provided that the above copyright notice appear in all copies and that
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
10 both that copyright notice and this permission notice appear in
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
12 Centrum or CWI not be used in advertising or publicity pertaining to
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
13 distribution of the software without specific, written prior permission.
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
14
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
22
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
23 ******************************************************************/
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
24
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 /* Module definition and import implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
27 #include "allobjects.h"
6
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 #include "node.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 #include "token.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #include "graminit.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 #include "import.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #include "errcode.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 #include "sysmodule.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
35 #include "pythonrun.h"
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
36 #include "marshal.h"
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
37 #include "compile.h"
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
38 #include "eval.h"
675
5aff9f8fd299 Move SEP to osdefs.h. Use MAXPATHLEN from osdefs.h.
Guido van Rossum <guido@python.org>
parents: 630
diff changeset
39 #include "osdefs.h"
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
40
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
41 extern int verbose; /* Defined in pythonrun.c */
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
42
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
43 extern long getmtime(); /* In getmtime.c */
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
44
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
45 #ifdef DEBUG
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
46 #define D(x) x
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
47 #else
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
48 #define D(x)
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
49 #endif
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
50
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
51 /* Explanation of some of the the various #defines used by dynamic linking...
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
52
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
53 symbol -- defined for:
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
54
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
55 DYNAMIC_LINK -- any kind of dynamic linking
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
56 USE_RLD -- NeXT dynamic linking
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
57 USE_DL -- Jack's dl for IRIX 4 or GNU dld with emulation for Jack's dl
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
58 USE_SHLIB -- SunOS or IRIX 5 (SVR4?) shared libraries
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
59 _AIX -- AIX style dynamic linking
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
60 NT -- NT style dynamic linking (using DLLs)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
61 _DL_FUNCPTR_DEFINED -- if the typedef dl_funcptr has been defined
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
62 WITH_MAC_DL -- Mac dynamic linking (highly experimental)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
63 SHORT_EXT -- short extension for dynamic module, e.g. ".so"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
64 LONG_EXT -- long extension, e.g. "module.so"
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
65 hpux -- HP-UX Dynamic Linking - defined by the compiler
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
66
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
67 (The other WITH_* symbols are used only once, to set the
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
68 appropriate symbols.)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
69 */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
70
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
71 /* Configure dynamic linking */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
72
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
73 #ifdef hpux
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
74 #define DYNAMIC_LINK
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
75 #include <errno.h>
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
76 typedef void (*dl_funcptr)();
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
77 #define _DL_FUNCPTR_DEFINED 1
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
78 #define SHORT_EXT ".sl"
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
79 #define LONG_EXT "module.sl"
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
80 #endif
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
81
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
82 #ifdef NT
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
83 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
84 #include <windows.h>
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
85 typedef FARPROC dl_funcptr;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
86 #define _DL_FUNCPTR_DEFINED
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
87 #define SHORT_EXT ".dll"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
88 #define LONG_EXT "module.dll"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
89 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
90
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
91 #if defined(NeXT) || defined(WITH_RLD)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
92 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
93 #define USE_RLD
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
94 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
95
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
96 #ifdef WITH_SGI_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
97 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
98 #define USE_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
99 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
100
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
101 #ifdef WITH_DL_DLD
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
102 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
103 #define USE_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
104 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
105
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
106 #ifdef WITH_MAC_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
107 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
108 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
109
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
110 #if !defined(DYNAMIC_LINK) && defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
111 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
112 #define USE_SHLIB
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
113 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
114
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
115 #ifdef _AIX
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
116 #define DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
117 #include <sys/ldr.h>
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
118 typedef void (*dl_funcptr)();
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
119 #define _DL_FUNCPTR_DEFINED
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
120 static void aix_loaderror(char *name);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
121 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
122
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
123 #ifdef DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
124
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
125 #ifdef USE_SHLIB
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
126 #include <dlfcn.h>
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
127 #ifndef _DL_FUNCPTR_DEFINED
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
128 typedef void (*dl_funcptr)();
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
129 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
130 #ifndef RTLD_LAZY
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
131 #define RTLD_LAZY 1
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
132 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
133 #define SHORT_EXT ".so"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
134 #define LONG_EXT "module.so"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
135 #endif /* USE_SHLIB */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
136
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
137 #if defined(USE_DL) || defined(hpux)
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
138 #include "dl.h"
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
139 #endif
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
140
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
141 #ifdef WITH_MAC_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
142 #include "dynamic_load.h"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
143 #endif
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
144
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
145 #ifdef USE_RLD
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
146 #include <mach-o/rld.h>
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
147 #define FUNCNAME_PATTERN "_init%s"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
148 #ifndef _DL_FUNCPTR_DEFINED
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
149 typedef void (*dl_funcptr)();
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
150 #endif
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
151 #endif /* USE_RLD */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
152
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
153 extern char *getprogramname();
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
154
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
155 #ifndef FUNCNAME_PATTERN
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
156 #if defined(__hp9000s300)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
157 #define FUNCNAME_PATTERN "_init%s"
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
158 #else
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
159 #define FUNCNAME_PATTERN "init%s"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
160 #endif
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
161 #endif
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
162
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
163 #if !defined(SHORT_EXT) && !defined(LONG_EXT)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
164 #define SHORT_EXT ".o"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
165 #define LONG_EXT "module.o"
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
166 #endif /* !SHORT_EXT && !LONG_EXT */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
167
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
168 #endif /* DYNAMIC_LINK */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
169
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
170 /* Max length of module suffix searched for -- accommodates "module.so" */
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
171 #ifndef MAXSUFFIXSIZE
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
172 #define MAXSUFFIXSIZE 10
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
173 #endif
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
174
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
175 /* Magic word to reject .pyc files generated by other Python versions */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
176 #define MAGIC 0x999903L /* Increment by one for each incompatible change */
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
177
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
178 static object *modules;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
179
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
180 /* Forward */
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
181 static int init_builtin PROTO((char *));
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
182
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
183 /* Helper for reading .pyc files */
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
184
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
185 long
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
186 get_pyc_magic()
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
187 {
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
188 return MAGIC;
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
189 }
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
190
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
191 /* Initialization */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 void
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 initimport()
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
196 if ((modules = newdictobject()) == NULL)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
197 fatal("no mem for dictionary of modules");
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 }
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 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
201 get_modules()
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
203 return modules;
6
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
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
206 object *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
207 add_module(name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
208 char *name;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
209 {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
210 object *m;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
211 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
212 return m;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
213 m = newmoduleobject(name);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
214 if (m == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
216 if (dictinsert(modules, name, m) != 0) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
217 DECREF(m);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
218 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
220 DECREF(m); /* Yes, it still exists, in modules! */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
221 return m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
224 enum filetype {SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION};
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
225
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
226 static struct filedescr {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
227 char *suffix;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
228 char *mode;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
229 enum filetype type;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
230 } filetab[] = {
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
231 #ifdef DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
232 #ifdef SHORT_EXT
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
233 {SHORT_EXT, "rb", C_EXTENSION},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
234 #endif /* !SHORT_EXT */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
235 #ifdef LONG_EXT
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
236 {LONG_EXT, "rb", C_EXTENSION},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
237 #endif /* !LONG_EXT */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
238 #endif /* DYNAMIC_LINK */
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
239 {".py", "r", PY_SOURCE},
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
240 {".pyc", "rb", PY_COMPILED},
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
241 {0, 0}
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
242 };
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
244 #ifdef DYNAMIC_LINK
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
245 static object *
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
246 load_dynamic_module(name, namebuf, m, m_ret)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
247 char *name;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
248 char *namebuf;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
249 object *m;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
250 object **m_ret;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
251 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
252 char funcname[258];
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
253 dl_funcptr p = NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
254 if (m != NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
255 err_setstr(ImportError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
256 "cannot reload dynamically loaded module");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
257 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
258 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
259 sprintf(funcname, FUNCNAME_PATTERN, name);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
260 #ifdef WITH_MAC_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
261 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
262 object *v = dynamic_load(namebuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
263 if (v == NULL)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
264 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
265 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
266 #else /* !WITH_MAC_DL */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
267 #ifdef USE_SHLIB
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
268 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
269 #ifdef RTLD_NOW
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
270 /* RTLD_NOW: resolve externals now
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
271 (i.e. core dump now if some are missing) */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
272 void *handle = dlopen(namebuf, RTLD_NOW);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
273 #else
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
274 void *handle;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
275 if (verbose)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
276 printf("dlopen(\"%s\", %d);\n", namebuf, RTLD_LAZY);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
277 handle = dlopen(namebuf, RTLD_LAZY);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
278 #endif /* RTLD_NOW */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
279 if (handle == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
280 err_setstr(ImportError, dlerror());
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
281 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
282 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
283 p = (dl_funcptr) dlsym(handle, funcname);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
284 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
285 #endif /* USE_SHLIB */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
286 #ifdef _AIX
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
287 p = (dl_funcptr) load(namebuf, 1, 0);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
288 if (p == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
289 aix_loaderror(namebuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
290 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
291 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
292 #endif /* _AIX */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
293 #ifdef NT
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
294 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
295 HINSTANCE hDLL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
296 hDLL = LoadLibrary(namebuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
297 if (hDLL==NULL){
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
298 char errBuf[64];
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
299 sprintf(errBuf, "DLL load failed with error code %d",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
300 GetLastError());
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
301 err_setstr(ImportError, errBuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
302 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
303 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
304 p = GetProcAddress(hDLL, funcname);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
305 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
306 #endif /* NT */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
307 #ifdef USE_DL
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
308 p = dl_loadmod(getprogramname(), namebuf, funcname);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
309 #endif /* USE_DL */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
310 #ifdef USE_RLD
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
311 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
312 NXStream *errorStream;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
313 struct mach_header *new_header;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
314 const char *filenames[2];
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
315 long ret;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
316 unsigned long ptr;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
317
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
318 errorStream = NXOpenMemory(NULL, 0, NX_WRITEONLY);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
319 filenames[0] = namebuf;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
320 filenames[1] = NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
321 ret = rld_load(errorStream, &new_header,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
322 filenames, NULL);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
323
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
324 /* extract the error messages for the exception */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
325 if(!ret) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
326 char *streamBuf;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
327 int len, maxLen;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
328
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
329 NXPutc(errorStream, (char)0);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
330
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
331 NXGetMemoryBuffer(errorStream,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
332 &streamBuf, &len, &maxLen);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
333 err_setstr(ImportError, streamBuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
334 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
335
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
336 if(ret && rld_lookup(errorStream, funcname, &ptr))
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
337 p = (dl_funcptr) ptr;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
338
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
339 NXCloseMemory(errorStream, NX_FREEBUFFER);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
340
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
341 if(!ret)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
342 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
343 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
344 #endif /* USE_RLD */
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
345 #ifdef hpux
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
346 {
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
347 shl_t lib;
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
348 int flags;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
349
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
350 flags = BIND_DEFERRED;
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
351 if (verbose)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
352 {
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
353 flags = BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE;
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
354 printf("shl_load %s\n",namebuf);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
355 }
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
356 lib = shl_load(namebuf, flags, 0);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
357 if (lib == NULL)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
358 {
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
359 char buf[256];
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
360 if (verbose)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
361 perror(namebuf);
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
362 sprintf(buf, "Failed to load %.200s", namebuf);
1877
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
363 err_setstr(ImportError, buf);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
364 return NULL;
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
365 }
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
366 if (verbose)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
367 printf("shl_findsym %s\n", funcname);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
368 shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
369 if (p == NULL && verbose)
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
370 perror(funcname);
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
371 }
32d005faf5fc Mods for HP-UX dynamic loading.
Guido van Rossum <guido@python.org>
parents: 1844
diff changeset
372 #endif hpux
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
373 if (p == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
374 err_setstr(ImportError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
375 "dynamic module does not define init function");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
376 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
377 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
378 (*p)();
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
379
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
380 #endif /* !WITH_MAC_DL */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
381 *m_ret = m = dictlookup(modules, name);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
382 if (m == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
383 if (err_occurred() == NULL)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
384 err_setstr(SystemError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
385 "dynamic module not initialized properly");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
386 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
387 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
388 if (verbose)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
389 fprintf(stderr,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
390 "import %s # dynamically loaded from %s\n",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
391 name, namebuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
392 INCREF(None);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
393 return None;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
394 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
395 #endif /* DYNAMIC_LINK */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
396
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 static object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
398 get_module(m, name, m_ret)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
399 /*module*/object *m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 char *name;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
401 object **m_ret;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 {
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
403 int err, npath, i, len, namelen;
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
404 long magic;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
405 long mtime, pyc_mtime;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
406 char namebuf[MAXPATHLEN+1];
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
407 struct filedescr *fdp;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
408 FILE *fp = NULL, *fpc = NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
409 node *n = NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
410 object *path, *v, *d;
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
411 codeobject *co = NULL;
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
412
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
413 path = sysget("path");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
414 if (path == NULL || !is_listobject(path)) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
415 err_setstr(ImportError,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
416 "sys.path must be list of directory names");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
417 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
418 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
419 npath = getlistsize(path);
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
420 namelen = strlen(name);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
421 for (i = 0; i < npath; i++) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
422 v = getlistitem(path, i);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
423 if (!is_stringobject(v))
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
424 continue;
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
425 len = getstringsize(v);
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
426 if (len + 1 + namelen + MAXSUFFIXSIZE >= MAXPATHLEN)
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
427 continue; /* Too long */
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
428 strcpy(namebuf, getstringvalue(v));
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
429 if (strlen(namebuf) != len)
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
430 continue; /* v contains '\0' */
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
431 if (len > 0 && namebuf[len-1] != SEP)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
432 namebuf[len++] = SEP;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
433 strcpy(namebuf+len, name);
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
434 len += namelen;
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
435 for (fdp = filetab; fdp->suffix != NULL; fdp++) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
436 strcpy(namebuf+len, fdp->suffix);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
437 if (verbose > 1)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
438 fprintf(stderr, "# trying %s\n", namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
439 fp = fopen(namebuf, fdp->mode);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
440 if (fp != NULL)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
441 break;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
442 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
443 if (fp != NULL)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
444 break;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
445 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
446 if (fp == NULL) {
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
447 sprintf(namebuf, "No module named %.200s", name);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
448 err_setstr(ImportError, namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
449 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
450 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
451
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
452 switch (fdp->type) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
453
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
454 case PY_SOURCE:
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
455 mtime = getmtime(namebuf);
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1410
diff changeset
456 len = strlen(namebuf);
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1410
diff changeset
457 strcpy(namebuf + len, "c");
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
458 fpc = fopen(namebuf, "rb");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
459 if (fpc != NULL) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
460 magic = rd_long(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
461 if (magic != MAGIC) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
462 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
463 fprintf(stderr,
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
464 "# %s has bad magic\n",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
465 namebuf);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
466 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
467 else {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
468 pyc_mtime = rd_long(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
469 if (pyc_mtime != mtime) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
470 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
471 fprintf(stderr,
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
472 "# %s has bad mtime\n",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
473 namebuf);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
474 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
475 else {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
476 fclose(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
477 fp = fpc;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
478 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
479 fprintf(stderr,
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
480 "# %s matches %s.py\n",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
481 namebuf, name);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
482 goto use_compiled;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
483 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
484 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
485 fclose(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
486 }
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1410
diff changeset
487 namebuf[len] = '\0';
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
488 n = parse_file(fp, namebuf, file_input);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
489 fclose(fp);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
490 if (n == NULL)
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
491 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
492 co = compile(n, namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
493 freetree(n);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
494 if (co == NULL)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
495 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
496 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
497 fprintf(stderr,
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1410
diff changeset
498 "import %s # from %s\n", name, namebuf);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
499 /* Now write the code object to the ".pyc" file */
1415
06570429f062 * import.c (get_module): pass .py filename to parse_file, not .pyc filename!
Guido van Rossum <guido@python.org>
parents: 1410
diff changeset
500 strcpy(namebuf + len, "c");
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
501 fpc = fopen(namebuf, "wb");
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
502 #ifdef macintosh
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
503 setfiletype(namebuf, 'PYTH', 'PYC ');
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
504 #endif
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
505 if (fpc == NULL) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
506 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
507 fprintf(stderr,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
508 "# can't create %s\n", namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
509 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
510 else {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
511 wr_long(MAGIC, fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
512 /* First write a 0 for mtime */
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
513 wr_long(0L, fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
514 wr_object((object *)co, fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
515 if (ferror(fpc)) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
516 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
517 fprintf(stderr,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
518 "# can't write %s\n", namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
519 /* Don't keep partial file */
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
520 fclose(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
521 (void) unlink(namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
522 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
523 else {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
524 /* Now write the true mtime */
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
525 fseek(fpc, 4L, 0);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
526 wr_long(mtime, fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
527 fflush(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
528 fclose(fpc);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
529 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
530 fprintf(stderr,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
531 "# wrote %s\n", namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
532 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
533 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
534 break;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
535
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
536 case PY_COMPILED:
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
537 if (verbose)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
538 fprintf(stderr, "# %s without %s.py\n",
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
539 namebuf, name);
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
540 magic = rd_long(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
541 if (magic != MAGIC) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
542 err_setstr(ImportError,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
543 "Bad magic number in .pyc file");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
544 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
545 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
546 (void) rd_long(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
547 use_compiled:
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
548 v = rd_object(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
549 fclose(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
550 if (v == NULL || !is_codeobject(v)) {
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
551 XDECREF(v);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
552 err_setstr(ImportError,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
553 "Bad code object in .pyc file");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
554 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
555 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
556 co = (codeobject *)v;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
557 if (verbose)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
558 fprintf(stderr,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
559 "import %s # precompiled from %s\n",
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
560 name, namebuf);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
561 break;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
562
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
563 #ifdef DYNAMIC_LINK
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
564 case C_EXTENSION:
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
565 fclose(fp);
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
566 return load_dynamic_module(name, namebuf, m, m_ret);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
567 #endif /* DYNAMIC_LINK */
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
568
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
569 default:
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
570 fclose(fp);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
571 err_setstr(SystemError,
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
572 "search loop returned unexpected result");
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
573 return NULL;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
574
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
575 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
576
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
577 /* We get here for either PY_SOURCE or PY_COMPILED */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
578 if (m == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
579 m = add_module(name);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
580 if (m == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
581 freetree(n);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
582 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
583 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
584 *m_ret = m;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
585 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
586 d = getmoduledict(m);
1293
ac3c80abbf43 * classobject.c: in instance_getattr, don't make a method out of a
Guido van Rossum <guido@python.org>
parents: 1289
diff changeset
587 v = eval_code(co, d, d, d, (object *)NULL);
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
588 DECREF(co);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
589 return v;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
590 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
591
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
592 static object *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
593 load_module(name)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
594 char *name;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
595 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
596 object *m, *v;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
597 v = get_module((object *)NULL, name, &m);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
598 if (v == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
600 DECREF(v);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
605 import_module(name)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 object *m;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
609 int n;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
610 if ((m = dictlookup(modules, name)) == NULL) {
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
611 if ((n = init_builtin(name)) || (n = init_frozen(name))) {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
612 if (n < 0)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
613 return NULL;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
614 if ((m = dictlookup(modules, name)) == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
615 if (err_occurred() == NULL)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
616 err_setstr(SystemError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
617 "builtin module not initialized properly");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
618 }
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
619 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
620 else {
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
621 m = load_module(name);
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
622 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
623 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
626
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
627 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
628 reload_module(m)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
629 object *m;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
630 {
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
631 char *name;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
632 int i;
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
633 if (m == NULL || !is_moduleobject(m)) {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
634 err_setstr(TypeError, "reload() argument must be module");
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
635 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
636 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
637 name = getmodulename(m);
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
638 if (name == NULL)
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
639 return NULL;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
640 /* Check for built-in modules */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
641 for (i = 0; inittab[i].name != NULL; i++) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
642 if (strcmp(name, inittab[i].name) == 0) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
643 err_setstr(ImportError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
644 "cannot reload built-in module");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
645 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
646 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
647 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
648 /* Check for frozen modules */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
649 if ((i = init_frozen(name)) != 0) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
650 if (i < 0)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
651 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
652 INCREF(None);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
653 return None;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
654 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
655 return get_module(m, name, (object **)NULL);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
656 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
657
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
658 void
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
659 doneimport()
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
660 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
661 if (modules != NULL) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
662 int pos;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
663 object *modname, *module;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
664 /* Explicitly erase all modules; this is the safest way
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
665 to get rid of at least *some* circular dependencies */
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
666 pos = 0;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
667 while (mappinggetnext(modules, &pos, &modname, &module)) {
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
668 if (is_moduleobject(module)) {
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
669 object *dict;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
670 dict = getmoduledict(module);
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
671 if (dict != NULL && is_dictobject(dict))
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
672 mappingclear(dict);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
673 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
674 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
675 mappingclear(modules);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
676 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
677 DECREF(modules);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
678 modules = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
679 }
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
680
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
681
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
682 /* Initialize built-in modules when first imported */
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
683
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
684 static int
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
685 init_builtin(name)
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
686 char *name;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
687 {
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
688 int i;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
689 for (i = 0; inittab[i].name != NULL; i++) {
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
690 if (strcmp(name, inittab[i].name) == 0) {
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
691 if (inittab[i].initfunc == NULL) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
692 err_setstr(ImportError,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
693 "cannot re-init internal module");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
694 return -1;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
695 }
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
696 if (verbose)
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
697 fprintf(stderr, "import %s # builtin\n",
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
698 name);
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
699 (*inittab[i].initfunc)();
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
700 return 1;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
701 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
702 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
703 return 0;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
704 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
705
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
706 extern struct frozen {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
707 char *name;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
708 char *code;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
709 int size;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
710 } frozen_modules[];
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
711
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
712 int
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
713 init_frozen(name)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
714 char *name;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
715 {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
716 struct frozen *p;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
717 codeobject *co;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
718 object *m, *d, *v;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
719 for (p = frozen_modules; ; p++) {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
720 if (p->name == NULL)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
721 return 0;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
722 if (strcmp(p->name, name) == 0)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
723 break;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
724 }
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
725 if (verbose)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
726 fprintf(stderr, "import %s # frozen\n", name);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
727 co = (codeobject *) rds_object(p->code, p->size);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
728 if (co == NULL)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
729 return -1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
730 if ((m = add_module(name)) == NULL ||
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
731 (d = getmoduledict(m)) == NULL ||
1293
ac3c80abbf43 * classobject.c: in instance_getattr, don't make a method out of a
Guido van Rossum <guido@python.org>
parents: 1289
diff changeset
732 (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
733 DECREF(co);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
734 return -1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
735 }
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
736 DECREF(co);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
737 DECREF(v);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
738 return 1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
739 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
740
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
741
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
742 #ifdef _AIX
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
743
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
744 #include <ctype.h> /* for isdigit() */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
745 #include <errno.h> /* for global errno */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
746 #include <string.h> /* for strerror() */
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
747
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
748 void aix_loaderror(char *namebuf)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
749 {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
750
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
751 char *message[8], errbuf[1024];
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
752 int i,j;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
753
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
754 struct errtab {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
755 int errno;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
756 char *errstr;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
757 } load_errtab[] = {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
758 {L_ERROR_TOOMANY, "to many errors, rest skipped."},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
759 {L_ERROR_NOLIB, "can't load library:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
760 {L_ERROR_UNDEF, "can't find symbol in library:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
761 {L_ERROR_RLDBAD,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
762 "RLD index out of range or bad relocation type:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
763 {L_ERROR_FORMAT, "not a valid, executable xcoff file:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
764 {L_ERROR_MEMBER,
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
765 "file not an archive or does not contain requested member:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
766 {L_ERROR_TYPE, "symbol table mismatch:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
767 {L_ERROR_ALIGN, "text allignment in file is wrong."},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
768 {L_ERROR_SYSTEM, "System error:"},
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
769 {L_ERROR_ERRNO, NULL}
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
770 };
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
771
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
772 #define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
773 #define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
774
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
775 sprintf(errbuf, " from module %.200s ", namebuf);
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
776
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
777 if (!loadquery(1, &message[0], sizeof(message)))
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
778 ERRBUF_APPEND(strerror(errno));
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
779 for(i = 0; message[i] && *message[i]; i++) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
780 int nerr = atoi(message[i]);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
781 for (j=0; j<LOAD_ERRTAB_LEN ; j++) {
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
782 if (nerr == load_errtab[i].errno && load_errtab[i].errstr)
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
783 ERRBUF_APPEND(load_errtab[i].errstr);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
784 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
785 while (isdigit(*message[i])) message[i]++ ;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
786 ERRBUF_APPEND(message[i]);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
787 ERRBUF_APPEND("\n");
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
788 }
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
789 errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
790 err_setstr(ImportError, errbuf);
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
791 return;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
792 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
793
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
794 #endif /* _AIX */