annotate Python/import.c @ 1351:e149c77d173c legacy-trunk

Makefile, import.c: Lance's alternative module search (allow .pyc file without .py file); Bill's dynamic loading for SunOS using shared libraries. pwdmodule.c (mkgrent): remove DECREF of uninitialized variable. classobject.c (instance_getattr): Fix case when class lookup returns unbound method instead of function.
author Guido van Rossum <guido@python.org>
date Fri, 15 Oct 1993 13:01:11 +0000
parents ac3c80abbf43
children a6355c83578d
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 /***********************************************************
1198
2937897a7d8b * Added Fixcprt.py: script to fix copyright message.
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
2 Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
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
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
41 extern int verbose; /* Defined in pythonmain.c */
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
42
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
43 extern long getmtime(); /* Defined in posixmodule.c */
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
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
51 #ifdef USE_DL
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
52 #ifdef SUN_SHLIB
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
53 #include <dlfcn.h>
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
54 typedef void (*dl_funcptr)();
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
55 #else
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
56 #include "dl.h"
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
57 #endif /* SUN_SHLIB */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
58
630
04ed4765b17c getbinaryname is now part of dl_loadmod.
Guido van Rossum <guido@python.org>
parents: 609
diff changeset
59 extern char *argv0;
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
60 #endif
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
61
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
62 /* Magic word to reject .pyc files generated by other Python versions */
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
63
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
64 #define MAGIC 0x999901L /* 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
65
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
66 static object *modules;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
67
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
68 /* Forward */
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
69 static int init_builtin PROTO((char *));
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
70
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
71 /* Initialization */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 void
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 initimport()
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
76 if ((modules = newdictobject()) == NULL)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
77 fatal("no mem for dictionary of modules");
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
81 get_modules()
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
83 return modules;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
86 object *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
87 add_module(name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
88 char *name;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
89 {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
90 object *m;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
91 if ((m = dictlookup(modules, name)) != NULL && is_moduleobject(m))
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
92 return m;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
93 m = newmoduleobject(name);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
94 if (m == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
96 if (dictinsert(modules, name, m) != 0) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
97 DECREF(m);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
98 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
100 DECREF(m); /* Yes, it still exists, in modules! */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
101 return m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
104 /* Suffixes used by find_module: */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
105
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
106 #define PY_SUFFIX ".py"
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
107 #define PYC_SUFFIX ".pyc"
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
108 #ifdef USE_DL
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
109 #ifdef SUN_SHLIB
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
110 #define O_SUFFIX "module.so"
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
111 #else
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
112 #define O_SUFFIX "module.o"
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
113 #endif /* SUN_SHLIB */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
114 #endif
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
115
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
116 /* This will search for a module named 'name' with the extension 'ext'
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
117 and return it in 'namebuf' and return the mtime of each in 'mtime'.
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
118 It returns a file pointer opened for 'mode' if successful, NULL if
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
119 unsuccessful.
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
120 */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 static FILE *
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
122 find_module(name, ext, mode, namebuf, mtime)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 char *name;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
124 char *ext;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
125 char *mode;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
126 char *namebuf;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
127 long *mtime;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 object *path;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 FILE *fp;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
131
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 path = sysget("path");
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 if (path == NULL || !is_listobject(path)) {
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
134 /* No path -- at least try current directory */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 strcpy(namebuf, name);
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
136 strcat(namebuf, ext);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
137 if ((fp = fopen(namebuf, mode)) == NULL)
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
138 return NULL;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
139 *mtime = getmtime(namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
140 return fp;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
141 } else {
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 int npath = getlistsize(path);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 int i;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 for (i = 0; i < npath; i++) {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 object *v = getlistitem(path, i);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 int len;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 if (!is_stringobject(v))
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 continue;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 strcpy(namebuf, getstringvalue(v));
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 len = getstringsize(v);
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 if (len > 0 && namebuf[len-1] != SEP)
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 namebuf[len++] = SEP;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
153 strcpy(namebuf+len, name);
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
154 strcat(namebuf, ext);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
155 if ((fp = fopen(namebuf, mode)) == NULL)
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
156 continue;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
157 *mtime = getmtime(namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
158 return fp;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 }
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
161 namebuf[0] = '\0';
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
162 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 static object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
166 get_module(m, name, m_ret)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
167 /*module*/object *m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 char *name;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
169 object **m_ret;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 {
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
171 codeobject *co = NULL;
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
172 object *v, *d;
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
173 FILE *fp, *fpc;
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
174 node *n;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 int err;
675
5aff9f8fd299 Move SEP to osdefs.h. Use MAXPATHLEN from osdefs.h.
Guido van Rossum <guido@python.org>
parents: 630
diff changeset
176 char namebuf[MAXPATHLEN+1];
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
177 int namelen;
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
178 long mtime;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
179
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
180 #ifdef USE_DL
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
181 if ((fpc = find_module(name, O_SUFFIX, "rb",
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
182 namebuf, &mtime)) != NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
183 char funcname[258];
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
184 dl_funcptr p;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
185 D(fprintf(stderr, "Found %s\n", namebuf));
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
186 fclose(fpc);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
187 sprintf(funcname, "init%s", name);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
188 #ifdef SUN_SHLIB
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
189 {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
190 void *handle = dlopen (namebuf, 1);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
191 p = (dl_funcptr) dlsym(handle, funcname);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
192 }
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
193 #else
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
194 p = dl_loadmod(argv0, namebuf, funcname);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
195 #endif /* SUN_SHLIB */
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
196 if (p == NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
197 D(fprintf(stderr, "dl_loadmod failed\n"));
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
198 } else {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
199 if (verbose)
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
200 fprintf(stderr,
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
201 "import %s # dynamically loaded from \"%s\"\n",
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
202 name, namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
203 (*p)();
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
204 *m_ret = m = dictlookup(modules, name);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
205 if (m == NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
206 err_setstr(SystemError,
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
207 "dynamic module missing");
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
208 return NULL;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
209 } else {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
210 D(fprintf(stderr,
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
211 "module %s loaded!\n", name));
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
212 INCREF(None);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
213 return None;
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
214 }
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
215 }
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
216 }
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
217 else
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
218 #endif
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
219 if ((fpc = find_module(name, PYC_SUFFIX, "rb",
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
220 namebuf, &mtime)) != NULL) {
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
221 long pyc_mtime;
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
222 long magic;
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
223 namebuf[(strlen(namebuf)-1)] = '\0';
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
224 mtime = getmtime(namebuf);
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
225 magic = rd_long(fpc);
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
226 pyc_mtime = rd_long(fpc);
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
227 if (mtime != -1 && mtime > pyc_mtime) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
228 fclose(fpc);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
229 fp = fopen(namebuf, "rb");
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
230 goto read_py;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
231 }
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
232 if (magic == MAGIC) {
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
233 v = rd_object(fpc);
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
234 if (v == NULL || err_occurred() ||
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
235 !is_codeobject(v)) {
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
236 err_clear();
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
237 XDECREF(v);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
238 }
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
239 else
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
240 co = (codeobject *)v;
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
241 }
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
242 fclose(fpc);
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
243 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
244 if (co != NULL)
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
245 fprintf(stderr,
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
246 "import %s # precompiled from \"%s\"\n",
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
247 name, namebuf);
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
248 else
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
249 fprintf(stderr,
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
250 "# invalid precompiled file \"%s\"\n",
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
251 namebuf);
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
252 }
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
253 }
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
254 else if ((fp = find_module(name, PY_SUFFIX, "r",
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
255 namebuf, &mtime)) != NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
256 read_py:
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
257 namelen = strlen(namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
258 if (co == NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
259 if (verbose)
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
260 fprintf(stderr,
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
261 "import %s # from \"%s\"\n",
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
262 name, namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
263 err = parse_file(fp, namebuf, file_input, &n);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
264 } else
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
265 err = E_DONE;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
266 fclose(fp);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
267 if (err != E_DONE) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
268 err_input(err);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
269 return NULL;
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
270 }
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
271 }
1351
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
272 else {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
273 if (m == NULL) {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
274 sprintf(namebuf, "no module named %.200s", name);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
275 err_setstr(ImportError, namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
276 }
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
277 else {
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
278 sprintf(namebuf, "no source for module %.200s", name);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
279 err_setstr(ImportError, namebuf);
e149c77d173c Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
280 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 return NULL;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
283 if (m == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
284 m = add_module(name);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
285 if (m == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
286 freetree(n);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
287 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
288 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
289 *m_ret = m;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
290 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
291 d = getmoduledict(m);
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
292 if (co == NULL) {
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
293 co = compile(n, namebuf);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
294 freetree(n);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
295 if (co == NULL)
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
296 return NULL;
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
297 /* Now write the code object to the ".pyc" file */
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
298 namebuf[namelen] = 'c';
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
299 namebuf[namelen+1] = '\0';
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
300 fpc = fopen(namebuf, "wb");
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
301 if (fpc != NULL) {
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
302 wr_long(MAGIC, fpc);
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
303 /* First write a 0 for mtime */
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
304 wr_long(0L, fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
305 wr_object((object *)co, fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
306 if (ferror(fpc)) {
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
307 /* Don't keep partial file */
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
308 fclose(fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
309 (void) unlink(namebuf);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
310 }
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
311 else {
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
312 /* Now write the true mtime */
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
313 fseek(fpc, 4L, 0);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
314 wr_long(mtime, fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
315 fflush(fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
316 fclose(fpc);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
317 }
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
318 }
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
319 }
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
320 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
321 DECREF(co);
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
322 return v;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
323 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
324
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
325 static object *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
326 load_module(name)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
327 char *name;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
328 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
329 object *m, *v;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
330 v = get_module((object *)NULL, name, &m);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
331 if (v == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
333 DECREF(v);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
338 import_module(name)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 char *name;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 object *m;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
342 int n;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
343 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
344 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
345 if (n < 0)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
346 return NULL;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
347 if ((m = dictlookup(modules, name)) == NULL)
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
348 err_setstr(SystemError,
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
349 "builtin module missing");
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
350 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
351 else {
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
352 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
353 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
354 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
357
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
358 object *
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
359 reload_module(m)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
360 object *m;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
361 {
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
362 if (m == NULL || !is_moduleobject(m)) {
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
363 err_setstr(TypeError, "reload() argument must be module");
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
364 return NULL;
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
365 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
366 /* XXX Ought to check for builtin modules -- can't reload these... */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
367 return get_module(m, getmodulename(m), (object **)NULL);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
368 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
369
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
370 void
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
371 doneimport()
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
372 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
373 if (modules != NULL) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
374 int pos;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
375 object *modname, *module;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
376 /* Explicitly erase all modules; this is the safest way
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
377 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
378 pos = 0;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
379 while (mappinggetnext(modules, &pos, &modname, &module)) {
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
380 if (is_moduleobject(module)) {
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
381 object *dict;
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
382 dict = getmoduledict(module);
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
383 if (dict != NULL && is_dictobject(dict))
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
384 mappingclear(dict);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
385 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
386 }
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
387 mappingclear(modules);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
388 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
389 DECREF(modules);
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
390 modules = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
391 }
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
392
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
393
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
394 /* 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
395
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
396 static int
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
397 init_builtin(name)
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
398 char *name;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
399 {
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
400 int i;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
401 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
402 if (strcmp(name, inittab[i].name) == 0) {
727
9a754486ef0b Print messages about where from modules are imported when -v is given.
Guido van Rossum <guido@python.org>
parents: 675
diff changeset
403 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
404 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
405 name);
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
406 (*inittab[i].initfunc)();
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
407 return 1;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
408 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
409 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
410 return 0;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
411 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
412
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
413 extern struct frozen {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
414 char *name;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
415 char *code;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
416 int size;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
417 } frozen_modules[];
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
418
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
419 int
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
420 init_frozen(name)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
421 char *name;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
422 {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
423 struct frozen *p;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
424 codeobject *co;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
425 object *m, *d, *v;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
426 for (p = frozen_modules; ; p++) {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
427 if (p->name == NULL)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
428 return 0;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
429 if (strcmp(p->name, name) == 0)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
430 break;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
431 }
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
432 if (verbose)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
433 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
434 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
435 if (co == NULL)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
436 return -1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
437 if ((m = add_module(name)) == NULL ||
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
438 (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
439 (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
440 DECREF(co);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
441 return -1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
442 }
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
443 DECREF(co);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
444 DECREF(v);
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
445 return 1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
446 }