annotate Python/import.c @ 28394:bc9076b01694 2.2

Backport 2.220, SF patch #708201, unchecked return value in import.c by Jason Harper
author Neal Norwitz <nnorwitz@gmail.com>
date Sun, 23 Mar 2003 14:32:56 +0000
parents e6cf9557de42
children
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
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Module definition and import implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
4 #include "Python.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include "node.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #include "token.h"
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #include "errcode.h"
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
9 #include "marshal.h"
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
10 #include "compile.h"
926
c156d4960c2b * Makefile: cosmetics
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
11 #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
12 #include "osdefs.h"
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
13 #include "importdl.h"
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
14 #ifdef macintosh
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
15 #include "macglue.h"
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
16 #endif
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
17
14708
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
18 #ifdef HAVE_FCNTL_H
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
19 #include <fcntl.h>
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
20 #endif
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
21
23623
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
22 /* check if the int_value can't be written in 15 bits (signed) */
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
23 #define CANT_WRITE(int_value) (int_value > 32767)
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
24
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
25 extern time_t PyOS_GetLastModificationTime(char *, FILE *);
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
26 /* 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
27
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
28 /* Magic word to reject .pyc files generated by other Python versions */
2812
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
29 /* Change for each incompatible change */
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
30 /* The value of CR and LF is incorporated so if you ever read or write
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
31 a .pyc file in text mode the magic number will be wrong; also, the
21010
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
32 Apple MPW compiler swaps their values, botching string constants.
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
33 XXX That probably isn't important anymore.
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
34 */
2812
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
35 /* XXX Perhaps the magic number should be frozen and a version field
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
36 added to the .pyc file header? */
21010
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
37 /* New way to come up with the low 16 bits of the magic number:
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
38 (YEAR-1995) * 10000 + MONTH * 100 + DAY
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
39 where MONTH and DAY are 1-based.
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
40 XXX Whatever the "old way" may have been isn't documented.
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
41 XXX This scheme breaks in 2002, as (2002-1995)*10000 = 70000 doesn't
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
42 fit in 16 bits.
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
43 XXX Later, sometimes 1 gets added to MAGIC in order to record that
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
44 the Unicode -U option is in use. IMO (Tim's), that's a Bad Idea
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
45 (quite apart from that the -U option doesn't work so isn't used
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
46 anyway).
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
47 */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18808
diff changeset
48 #define MAGIC (60717 | ((long)'\r'<<16) | ((long)'\n'<<24))
487
77b80a91d357 New magic word; and check it.
Guido van Rossum <guido@python.org>
parents: 340
diff changeset
49
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
50 /* Magic word as global; note that _PyImport_Init() can change the
13181
6f4669814884 another typo caught by Rob Hooft
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
51 value of this global to accommodate for alterations of how the
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
52 compiler works which are enabled by command line switches. */
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
53 static long pyc_magic = MAGIC;
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
54
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
55 /* See _PyImport_FixupExtension() below */
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
56 static PyObject *extensions = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
57
6541
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
58 /* This table is defined in config.c: */
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
59 extern struct _inittab _PyImport_Inittab[];
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
60
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
61 struct _inittab *PyImport_Inittab = _PyImport_Inittab;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
62
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
63 /* these tables define the module suffixes that Python recognizes */
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
64 struct filedescr * _PyImport_Filetab = NULL;
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
65
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
66 #ifdef RISCOS
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
67 static const struct filedescr _PyImport_StandardFiletab[] = {
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
68 {"/py", "r", PY_SOURCE},
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
69 {"/pyc", "rb", PY_COMPILED},
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
70 {0, 0}
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
71 };
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
72 #else
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
73 static const struct filedescr _PyImport_StandardFiletab[] = {
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
74 {".py", "r", PY_SOURCE},
18992
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
75 #ifdef MS_WIN32
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
76 {".pyw", "r", PY_SOURCE},
21010
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
77 #endif
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
78 {".pyc", "rb", PY_COMPILED},
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
79 {0, 0}
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
80 };
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
81 #endif
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
82
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
83 /* Initialize things */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
84
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
85 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
86 _PyImport_Init(void)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
87 {
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
88 const struct filedescr *scan;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
89 struct filedescr *filetab;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
90 int countD = 0;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
91 int countS = 0;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
92
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
93 /* prepare _PyImport_Filetab: copy entries from
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
94 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
95 */
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
96 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
97 ++countD;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
98 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
99 ++countS;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
100 filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
101 memcpy(filetab, _PyImport_DynLoadFiletab,
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
102 countD * sizeof(struct filedescr));
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
103 memcpy(filetab + countD, _PyImport_StandardFiletab,
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
104 countS * sizeof(struct filedescr));
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
105 filetab[countD + countS].suffix = NULL;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
106
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
107 _PyImport_Filetab = filetab;
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
108
5180
6bc56259cc4c When -O is given, use ".pyo" instead of ".pyc".
Guido van Rossum <guido@python.org>
parents: 5043
diff changeset
109 if (Py_OptimizeFlag) {
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
110 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
111 for (; filetab->suffix != NULL; filetab++) {
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
112 #ifndef RISCOS
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
113 if (strcmp(filetab->suffix, ".pyc") == 0)
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
114 filetab->suffix = ".pyo";
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
115 #else
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
116 if (strcmp(filetab->suffix, "/pyc") == 0)
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
117 filetab->suffix = "/pyo";
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
118 #endif
5180
6bc56259cc4c When -O is given, use ".pyo" instead of ".pyc".
Guido van Rossum <guido@python.org>
parents: 5043
diff changeset
119 }
6bc56259cc4c When -O is given, use ".pyo" instead of ".pyc".
Guido van Rossum <guido@python.org>
parents: 5043
diff changeset
120 }
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
121
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
122 if (Py_UnicodeFlag) {
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
123 /* Fix the pyc_magic so that byte compiled code created
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
124 using the all-Unicode method doesn't interfere with
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
125 code created in normal operation mode. */
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
126 pyc_magic = MAGIC + 1;
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
127 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
128 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
129
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
130 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
131 _PyImport_Fini(void)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
132 {
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
133 Py_XDECREF(extensions);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
134 extensions = NULL;
14991
5d41ca49a10a _PyImport_Fini(): Closed small memory leak when an embedded app calls
Barry Warsaw <barry@python.org>
parents: 14921
diff changeset
135 PyMem_DEL(_PyImport_Filetab);
5d41ca49a10a _PyImport_Fini(): Closed small memory leak when an embedded app calls
Barry Warsaw <barry@python.org>
parents: 14921
diff changeset
136 _PyImport_Filetab = NULL;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
137 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
138
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
139
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
140 /* Locking primitives to prevent parallel imports of the same module
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
141 in different threads to return with a partially loaded module.
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
142 These calls are serialized by the global interpreter lock. */
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
143
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
144 #ifdef WITH_THREAD
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
145
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 9187
diff changeset
146 #include "pythread.h"
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
147
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
148 static PyThread_type_lock import_lock = 0;
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
149 static long import_lock_thread = -1;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
150 static int import_lock_level = 0;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
151
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
152 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
153 lock_import(void)
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
154 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
155 long me = PyThread_get_thread_ident();
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
156 if (me == -1)
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
157 return; /* Too bad */
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
158 if (import_lock == NULL)
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
159 import_lock = PyThread_allocate_lock();
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
160 if (import_lock_thread == me) {
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
161 import_lock_level++;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
162 return;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
163 }
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
164 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0))
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
165 {
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
166 PyThreadState *tstate = PyEval_SaveThread();
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
167 PyThread_acquire_lock(import_lock, 1);
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
168 PyEval_RestoreThread(tstate);
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
169 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
170 import_lock_thread = me;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
171 import_lock_level = 1;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
172 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
173
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
174 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
175 unlock_import(void)
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
176 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
177 long me = PyThread_get_thread_ident();
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
178 if (me == -1)
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
179 return 0; /* Too bad */
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
180 if (import_lock_thread != me)
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
181 return -1;
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
182 import_lock_level--;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
183 if (import_lock_level == 0) {
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
184 import_lock_thread = -1;
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
185 PyThread_release_lock(import_lock);
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
186 }
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
187 return 1;
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
188 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
189
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
190 #else
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
191
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
192 #define lock_import()
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
193 #define unlock_import() 0
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
194
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
195 #endif
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
196
19596
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
197 static PyObject *
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
198 imp_lock_held(PyObject *self, PyObject *args)
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
199 {
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
200 if (!PyArg_ParseTuple(args, ":lock_held"))
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
201 return NULL;
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
202 #ifdef WITH_THREAD
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
203 return PyInt_FromLong(import_lock_thread != -1);
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
204 #else
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
205 return PyInt_FromLong(0);
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
206 #endif
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
207 }
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
208
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
209 static PyObject *
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
210 imp_acquire_lock(PyObject *self, PyObject *args)
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
211 {
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
212 if (!PyArg_ParseTuple(args, ":acquire_lock"))
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
213 return NULL;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
214 #ifdef WITH_THREAD
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
215 lock_import();
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
216 #endif
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
217 Py_INCREF(Py_None);
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
218 return Py_None;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
219 }
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
220
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
221 static PyObject *
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
222 imp_release_lock(PyObject *self, PyObject *args)
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
223 {
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
224 if (!PyArg_ParseTuple(args, ":release_lock"))
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
225 return NULL;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
226 #ifdef WITH_THREAD
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
227 if (unlock_import() < 0) {
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
228 PyErr_SetString(PyExc_RuntimeError,
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
229 "not holding the import lock");
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
230 return NULL;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
231 }
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
232 #endif
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
233 Py_INCREF(Py_None);
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
234 return Py_None;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
235 }
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
236
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
237 /* Helper for sys */
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
238
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
239 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
240 PyImport_GetModuleDict(void)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
241 {
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
242 PyInterpreterState *interp = PyThreadState_Get()->interp;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
243 if (interp->modules == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
244 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
245 return interp->modules;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
246 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
247
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
248
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
249 /* List of names to clear in sys */
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
250 static char* sys_deletes[] = {
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
251 "path", "argv", "ps1", "ps2", "exitfunc",
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
252 "exc_type", "exc_value", "exc_traceback",
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
253 "last_type", "last_value", "last_traceback",
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
254 NULL
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
255 };
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
256
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
257 static char* sys_files[] = {
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
258 "stdin", "__stdin__",
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
259 "stdout", "__stdout__",
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
260 "stderr", "__stderr__",
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
261 NULL
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
262 };
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
263
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
264
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
265 /* Un-initialize things, as good as we can */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
266
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
267 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
268 PyImport_Cleanup(void)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
269 {
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
270 int pos, ndone;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
271 char *name;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
272 PyObject *key, *value, *dict;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
273 PyInterpreterState *interp = PyThreadState_Get()->interp;
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
274 PyObject *modules = interp->modules;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
275
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
276 if (modules == NULL)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
277 return; /* Already done */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
278
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
279 /* Delete some special variables first. These are common
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
280 places where user values hide and people complain when their
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
281 destructors fail. Since the modules containing them are
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
282 deleted *last* of all, they would come too late in the normal
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
283 destruction order. Sigh. */
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
284
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
285 value = PyDict_GetItemString(modules, "__builtin__");
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
286 if (value != NULL && PyModule_Check(value)) {
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
287 dict = PyModule_GetDict(value);
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
288 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
289 PySys_WriteStderr("# clear __builtin__._\n");
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
290 PyDict_SetItemString(dict, "_", Py_None);
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
291 }
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
292 value = PyDict_GetItemString(modules, "sys");
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
293 if (value != NULL && PyModule_Check(value)) {
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
294 char **p;
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
295 PyObject *v;
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
296 dict = PyModule_GetDict(value);
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
297 for (p = sys_deletes; *p != NULL; p++) {
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
298 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
299 PySys_WriteStderr("# clear sys.%s\n", *p);
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
300 PyDict_SetItemString(dict, *p, Py_None);
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
301 }
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
302 for (p = sys_files; *p != NULL; p+=2) {
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
303 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
304 PySys_WriteStderr("# restore sys.%s\n", *p);
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
305 v = PyDict_GetItemString(dict, *(p+1));
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
306 if (v == NULL)
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
307 v = Py_None;
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
308 PyDict_SetItemString(dict, *p, v);
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
309 }
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
310 }
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
311
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
312 /* First, delete __main__ */
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
313 value = PyDict_GetItemString(modules, "__main__");
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
314 if (value != NULL && PyModule_Check(value)) {
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
315 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
316 PySys_WriteStderr("# cleanup __main__\n");
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
317 _PyModule_Clear(value);
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
318 PyDict_SetItemString(modules, "__main__", Py_None);
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
319 }
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
320
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
321 /* The special treatment of __builtin__ here is because even
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
322 when it's not referenced as a module, its dictionary is
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
323 referenced by almost every module's __builtins__. Since
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
324 deleting a module clears its dictionary (even if there are
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
325 references left to it), we need to delete the __builtin__
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
326 module last. Likewise, we don't delete sys until the very
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
327 end because it is implicitly referenced (e.g. by print).
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
328
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
329 Also note that we 'delete' modules by replacing their entry
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
330 in the modules dict with None, rather than really deleting
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
331 them; this avoids a rehash of the modules dictionary and
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
332 also marks them as "non existent" so they won't be
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
333 re-imported. */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
334
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
335 /* Next, repeatedly delete modules with a reference count of
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
336 one (skipping __builtin__ and sys) and delete them */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
337 do {
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
338 ndone = 0;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
339 pos = 0;
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
340 while (PyDict_Next(modules, &pos, &key, &value)) {
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
341 if (value->ob_refcnt != 1)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
342 continue;
9187
e21d0798c02a While scalling sys.modules, skip entries that don't have string keys,
Guido van Rossum <guido@python.org>
parents: 9096
diff changeset
343 if (PyString_Check(key) && PyModule_Check(value)) {
e21d0798c02a While scalling sys.modules, skip entries that don't have string keys,
Guido van Rossum <guido@python.org>
parents: 9096
diff changeset
344 name = PyString_AS_STRING(key);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
345 if (strcmp(name, "__builtin__") == 0)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
346 continue;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
347 if (strcmp(name, "sys") == 0)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
348 continue;
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
349 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
350 PySys_WriteStderr(
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
351 "# cleanup[1] %s\n", name);
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
352 _PyModule_Clear(value);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
353 PyDict_SetItem(modules, key, Py_None);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
354 ndone++;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
355 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
356 }
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
357 } while (ndone > 0);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
358
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
359 /* Next, delete all modules (still skipping __builtin__ and sys) */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
360 pos = 0;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
361 while (PyDict_Next(modules, &pos, &key, &value)) {
9187
e21d0798c02a While scalling sys.modules, skip entries that don't have string keys,
Guido van Rossum <guido@python.org>
parents: 9096
diff changeset
362 if (PyString_Check(key) && PyModule_Check(value)) {
e21d0798c02a While scalling sys.modules, skip entries that don't have string keys,
Guido van Rossum <guido@python.org>
parents: 9096
diff changeset
363 name = PyString_AS_STRING(key);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
364 if (strcmp(name, "__builtin__") == 0)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
365 continue;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
366 if (strcmp(name, "sys") == 0)
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
367 continue;
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
368 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
369 PySys_WriteStderr("# cleanup[2] %s\n", name);
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
370 _PyModule_Clear(value);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
371 PyDict_SetItem(modules, key, Py_None);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
372 }
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
373 }
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
374
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
375 /* Next, delete sys and __builtin__ (in that order) */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
376 value = PyDict_GetItemString(modules, "sys");
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
377 if (value != NULL && PyModule_Check(value)) {
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
378 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
379 PySys_WriteStderr("# cleanup sys\n");
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
380 _PyModule_Clear(value);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
381 PyDict_SetItemString(modules, "sys", Py_None);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
382 }
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
383 value = PyDict_GetItemString(modules, "__builtin__");
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
384 if (value != NULL && PyModule_Check(value)) {
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
385 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
386 PySys_WriteStderr("# cleanup __builtin__\n");
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
387 _PyModule_Clear(value);
7111
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
388 PyDict_SetItemString(modules, "__builtin__", Py_None);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
389 }
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
390
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
391 /* Finally, clear and delete the modules directory */
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
392 PyDict_Clear(modules);
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
393 interp->modules = NULL;
f063f1eb2964 Rewritten PyImport_Cleanup() and its helper, clear_carefully(). They
Guido van Rossum <guido@python.org>
parents: 6907
diff changeset
394 Py_DECREF(modules);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
395 }
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
396
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
397
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
398 /* Helper for pythonrun.c -- return magic number */
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
399
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
400 long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
401 PyImport_GetMagicNumber(void)
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
402 {
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
403 return pyc_magic;
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
404 }
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
405
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
407 /* Magic for extension modules (built-in as well as dynamically
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
408 loaded). To prevent initializing an extension module more than
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
409 once, we keep a static dictionary 'extensions' keyed by module name
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
410 (for built-in modules) or by filename (for dynamically loaded
19238
5b87ee44000b Fixed typo in comment leading up to _PyImport_FixupExtension().
Barry Warsaw <barry@python.org>
parents: 19063
diff changeset
411 modules), containing these modules. A copy of the module's
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
412 dictionary is stored by calling _PyImport_FixupExtension()
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
413 immediately after the module initialization function succeeds. A
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
414 copy can be retrieved from there by calling
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
415 _PyImport_FindExtension(). */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
417 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
418 _PyImport_FixupExtension(char *name, char *filename)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
420 PyObject *modules, *mod, *dict, *copy;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
421 if (extensions == NULL) {
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
422 extensions = PyDict_New();
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
423 if (extensions == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
424 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
425 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
426 modules = PyImport_GetModuleDict();
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
427 mod = PyDict_GetItemString(modules, name);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
428 if (mod == NULL || !PyModule_Check(mod)) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
429 PyErr_Format(PyExc_SystemError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
430 "_PyImport_FixupExtension: module %.200s not loaded", name);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
431 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
432 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
433 dict = PyModule_GetDict(mod);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
434 if (dict == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
435 return NULL;
20671
3fb403eaede1 Use PyDict_Copy() and PyDict_Update() instead of using PyObject_CallMethod()
Fred Drake <fdrake@acm.org>
parents: 20654
diff changeset
436 copy = PyDict_Copy(dict);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
437 if (copy == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
438 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
439 PyDict_SetItemString(extensions, filename, copy);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
440 Py_DECREF(copy);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
441 return copy;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
442 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
443
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
444 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
445 _PyImport_FindExtension(char *name, char *filename)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
446 {
20671
3fb403eaede1 Use PyDict_Copy() and PyDict_Update() instead of using PyObject_CallMethod()
Fred Drake <fdrake@acm.org>
parents: 20654
diff changeset
447 PyObject *dict, *mod, *mdict;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
448 if (extensions == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
449 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
450 dict = PyDict_GetItemString(extensions, filename);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
451 if (dict == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
452 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
453 mod = PyImport_AddModule(name);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
454 if (mod == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
455 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
456 mdict = PyModule_GetDict(mod);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
457 if (mdict == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
458 return NULL;
20671
3fb403eaede1 Use PyDict_Copy() and PyDict_Update() instead of using PyObject_CallMethod()
Fred Drake <fdrake@acm.org>
parents: 20654
diff changeset
459 if (PyDict_Update(mdict, dict))
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
460 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
461 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
462 PySys_WriteStderr("import %s # previously loaded (%s)\n",
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
463 name, filename);
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
464 return mod;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
467
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
468 /* Get the module object corresponding to a module name.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
469 First check the modules dictionary if there's one there,
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
470 if not, create a new one and insert in in the modules dictionary.
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
471 Because the former action is most common, THIS DOES NOT RETURN A
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
472 'NEW' REFERENCE! */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
473
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
474 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
475 PyImport_AddModule(char *name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
476 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
477 PyObject *modules = PyImport_GetModuleDict();
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
478 PyObject *m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
479
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
480 if ((m = PyDict_GetItemString(modules, name)) != NULL &&
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
481 PyModule_Check(m))
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
482 return m;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
483 m = PyModule_New(name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
484 if (m == NULL)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 return NULL;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
486 if (PyDict_SetItemString(modules, name, m) != 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
487 Py_DECREF(m);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
488 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
490 Py_DECREF(m); /* Yes, it still exists, in modules! */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
491
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
492 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
493 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
494
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
495
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
496 /* Execute a code object in a module and return the module object
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
497 WITH INCREMENTED REFERENCE COUNT */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
498
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
499 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
500 PyImport_ExecCodeModule(char *name, PyObject *co)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
501 {
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
502 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL);
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
503 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
504
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
505 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
506 PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
507 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
508 PyObject *modules = PyImport_GetModuleDict();
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
509 PyObject *m, *d, *v;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
510
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
511 m = PyImport_AddModule(name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
512 if (m == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
513 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
514 d = PyModule_GetDict(m);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
515 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
516 if (PyDict_SetItemString(d, "__builtins__",
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
517 PyEval_GetBuiltins()) != 0)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
518 return NULL;
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
519 }
3557
cee4a6d8415e Remember source filename as <module>.__file__.
Guido van Rossum <guido@python.org>
parents: 3492
diff changeset
520 /* Remember the filename as the __file__ attribute */
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
521 v = NULL;
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
522 if (pathname != NULL) {
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
523 v = PyString_FromString(pathname);
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
524 if (v == NULL)
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
525 PyErr_Clear();
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
526 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
527 if (v == NULL) {
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
528 v = ((PyCodeObject *)co)->co_filename;
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
529 Py_INCREF(v);
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
530 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
531 if (PyDict_SetItemString(d, "__file__", v) != 0)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
532 PyErr_Clear(); /* Not important enough to report */
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
533 Py_DECREF(v);
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
534
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
535 v = PyEval_EvalCode((PyCodeObject *)co, d, d);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
536 if (v == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
537 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
538 Py_DECREF(v);
5758
bfe9ba74c19e Fix problem discovered by Greg McFarlane: when an imported module
Guido van Rossum <guido@python.org>
parents: 5511
diff changeset
539
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
540 if ((m = PyDict_GetItemString(modules, name)) == NULL) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
541 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
542 "Loaded module %.200s not found in sys.modules",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
543 name);
5758
bfe9ba74c19e Fix problem discovered by Greg McFarlane: when an imported module
Guido van Rossum <guido@python.org>
parents: 5511
diff changeset
544 return NULL;
bfe9ba74c19e Fix problem discovered by Greg McFarlane: when an imported module
Guido van Rossum <guido@python.org>
parents: 5511
diff changeset
545 }
bfe9ba74c19e Fix problem discovered by Greg McFarlane: when an imported module
Guido van Rossum <guido@python.org>
parents: 5511
diff changeset
546
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
547 Py_INCREF(m);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
548
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
549 return m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
552
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
553 /* Given a pathname for a Python source file, fill a buffer with the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
554 pathname for the corresponding compiled file. Return the pathname
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
555 for the compiled file, or NULL if there's no space in the buffer.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
556 Doesn't set an exception. */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
557
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
558 static char *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
559 make_compiled_pathname(char *pathname, char *buf, size_t buflen)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
560 {
18992
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
561 size_t len = strlen(pathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
562 if (len+2 > buflen)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
563 return NULL;
18992
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
564
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
565 #ifdef MS_WIN32
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
566 /* Treat .pyw as if it were .py. The case of ".pyw" must match
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
567 that used in _PyImport_StandardFiletab. */
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
568 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0)
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
569 --len; /* pretend 'w' isn't there */
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
570 #endif
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
571 memcpy(buf, pathname, len);
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
572 buf[len] = Py_OptimizeFlag ? 'o' : 'c';
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
573 buf[len+1] = '\0';
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
574
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
575 return buf;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
576 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
577
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
578
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
579 /* Given a pathname for a Python source file, its time of last
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
580 modification, and a pathname for a compiled file, check whether the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
581 compiled file represents the same version of the source. If so,
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
582 return a FILE pointer for the compiled file, positioned just after
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
583 the header; if not, return NULL.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
584 Doesn't set an exception. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
585
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
586 static FILE *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
587 check_compiled_module(char *pathname, long mtime, char *cpathname)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
588 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
589 FILE *fp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
590 long magic;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
591 long pyc_mtime;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
592
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
593 fp = fopen(cpathname, "rb");
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
594 if (fp == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
595 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
596 magic = PyMarshal_ReadLongFromFile(fp);
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
597 if (magic != pyc_magic) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
598 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
599 PySys_WriteStderr("# %s has bad magic\n", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
600 fclose(fp);
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
601 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
602 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
603 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
604 if (pyc_mtime != mtime) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
605 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
606 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
607 fclose(fp);
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
608 return NULL;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
609 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
610 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
611 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
612 return fp;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
613 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
614
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
615
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
616 /* Read a code object from a file and check it for validity */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
617
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
618 static PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
619 read_compiled_module(char *cpathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
620 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
621 PyObject *co;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
622
16311
8c41f3861aad It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents: 16257
diff changeset
623 co = PyMarshal_ReadLastObjectFromFile(fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
624 /* Ugly: rd_object() may return NULL with or without error */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
625 if (co == NULL || !PyCode_Check(co)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
626 if (!PyErr_Occurred())
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
627 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
628 "Non-code object in %.200s", cpathname);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
629 Py_XDECREF(co);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
630 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
631 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
632 return (PyCodeObject *)co;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
633 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
634
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
635
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
636 /* Load a module from a compiled file, execute it, and return its
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
637 module object WITH INCREMENTED REFERENCE COUNT */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
638
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
639 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
640 load_compiled_module(char *name, char *cpathname, FILE *fp)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 {
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
642 long magic;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
643 PyCodeObject *co;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
644 PyObject *m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
645
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
646 magic = PyMarshal_ReadLongFromFile(fp);
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
647 if (magic != pyc_magic) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
648 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
649 "Bad magic number in %.200s", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
650 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
651 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
652 (void) PyMarshal_ReadLongFromFile(fp);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
653 co = read_compiled_module(cpathname, fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
654 if (co == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
655 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
656 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
657 PySys_WriteStderr("import %s # precompiled from %s\n",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
658 name, cpathname);
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
659 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
660 Py_DECREF(co);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
661
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
662 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
663 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
664
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
665 /* Parse a source file and return the corresponding code object */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
666
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
667 static PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
668 parse_source_module(char *pathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
669 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
670 PyCodeObject *co;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
671 node *n;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
672
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5375
diff changeset
673 n = PyParser_SimpleParseFile(fp, pathname, Py_file_input);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
674 if (n == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
675 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
676 co = PyNode_Compile(n, pathname);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
677 PyNode_Free(n);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
678
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
679 return co;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
680 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
681
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
682
14708
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
683 /* Helper to open a bytecode file for writing in exclusive mode */
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
684
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
685 static FILE *
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
686 open_exclusive(char *filename)
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
687 {
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
688 #if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
689 /* Use O_EXCL to avoid a race condition when another process tries to
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
690 write the same file. When that happens, our open() call fails,
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
691 which is just fine (since it's only a cache).
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
692 XXX If the file exists and is writable but the directory is not
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
693 writable, the file will never be written. Oh well.
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
694 */
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
695 int fd;
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
696 (void) unlink(filename);
14921
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
697 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
698 #ifdef O_BINARY
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
699 |O_BINARY /* necessary for Windows */
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
700 #endif
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
701
14921
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
702 , 0666);
14708
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
703 if (fd < 0)
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
704 return NULL;
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
705 return fdopen(fd, "wb");
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
706 #else
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
707 /* Best we can do -- on Windows this can't happen anyway */
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
708 return fopen(filename, "wb");
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
709 #endif
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
710 }
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
711
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
712
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
713 /* Write a compiled module to a file, placing the time of last
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
714 modification of its source into the header.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
715 Errors are ignored, if a write error occurs an attempt is made to
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
716 remove the file. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
717
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
718 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
719 write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
720 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
721 FILE *fp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
722
23623
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
723 if (CANT_WRITE(co->co_argcount) ||
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
724 CANT_WRITE(co->co_nlocals) ||
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
725 CANT_WRITE(co->co_stacksize) ||
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
726 CANT_WRITE(co->co_flags) ||
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
727 CANT_WRITE(co->co_firstlineno)) {
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
728 if (Py_VerboseFlag)
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
729 PySys_WriteStderr(
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
730 "# code too large: can't write %s\n",
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
731 cpathname);
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
732 return;
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
733 }
c00febbe0929 Fix SF #561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 21713
diff changeset
734
14708
89b2aee43e0b On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
735 fp = open_exclusive(cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
736 if (fp == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
737 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
738 PySys_WriteStderr(
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
739 "# can't create %s\n", cpathname);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
740 return;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
741 }
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
742 PyMarshal_WriteLongToFile(pyc_magic, fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
743 /* First write a 0 for mtime */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
744 PyMarshal_WriteLongToFile(0L, fp);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
745 PyMarshal_WriteObjectToFile((PyObject *)co, fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
746 if (ferror(fp)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
747 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
748 PySys_WriteStderr("# can't write %s\n", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
749 /* Don't keep partial file */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
750 fclose(fp);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
751 (void) unlink(cpathname);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
752 return;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
753 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
754 /* Now write the true mtime */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
755 fseek(fp, 4L, 0);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
756 PyMarshal_WriteLongToFile(mtime, fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
757 fflush(fp);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
758 fclose(fp);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
759 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
760 PySys_WriteStderr("# wrote %s\n", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
761 #ifdef macintosh
13552
dd2b5218e069 Include macglue.h for some function prototypes, and renamed a few
Jack Jansen <jack.jansen@cwi.nl>
parents: 13447
diff changeset
762 PyMac_setfiletype(cpathname, 'Pyth', 'PYC ');
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
763 #endif
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
764 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
765
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
766
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
767 /* Load a source module from a given file and return its module
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
768 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
769 byte-compiled file, use that instead. */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
770
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
771 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
772 load_source_module(char *name, char *pathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
773 {
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
774 time_t mtime;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
775 FILE *fpc;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
776 char buf[MAXPATHLEN+1];
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
777 char *cpathname;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
778 PyCodeObject *co;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
779 PyObject *m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
780
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
781 mtime = PyOS_GetLastModificationTime(pathname, fp);
16893
f1c8ea92ee85 Suppress a compiler warning under OpenVMS; time_t is unsigned on (at least)
Fred Drake <fdrake@acm.org>
parents: 16881
diff changeset
782 if (mtime == (time_t)(-1))
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
783 return NULL;
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
784 #if SIZEOF_TIME_T > 4
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
785 /* Python's .pyc timestamp handling presumes that the timestamp fits
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
786 in 4 bytes. This will be fine until sometime in the year 2038,
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
787 when a 4-byte signed time_t will overflow.
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
788 */
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
789 if (mtime >> 32) {
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
790 PyErr_SetString(PyExc_OverflowError,
16893
f1c8ea92ee85 Suppress a compiler warning under OpenVMS; time_t is unsigned on (at least)
Fred Drake <fdrake@acm.org>
parents: 16881
diff changeset
791 "modification time overflows a 4 byte field");
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
792 return NULL;
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
793 }
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
794 #endif
21010
4a9a9cc041de Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents: 20768
diff changeset
795 cpathname = make_compiled_pathname(pathname, buf,
17502
c5bab794dcde split long line
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17090
diff changeset
796 (size_t)MAXPATHLEN + 1);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
797 if (cpathname != NULL &&
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
798 (fpc = check_compiled_module(pathname, mtime, cpathname))) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
799 co = read_compiled_module(cpathname, fpc);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
800 fclose(fpc);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
801 if (co == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
802 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
803 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
804 PySys_WriteStderr("import %s # precompiled from %s\n",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
805 name, cpathname);
9050
f3ebdb2274e4 __file__ used to be always set to the .pyc (or .pyo) file, even if
Guido van Rossum <guido@python.org>
parents: 8934
diff changeset
806 pathname = cpathname;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
807 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
808 else {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
809 co = parse_source_module(pathname, fp);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
810 if (co == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
811 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
812 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
813 PySys_WriteStderr("import %s # from %s\n",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
814 name, pathname);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
815 write_compiled_module(co, cpathname, mtime);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
816 }
9050
f3ebdb2274e4 __file__ used to be always set to the .pyc (or .pyo) file, even if
Guido van Rossum <guido@python.org>
parents: 8934
diff changeset
817 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
818 Py_DECREF(co);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
819
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
820 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
821 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
822
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
823
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
824 /* Forward */
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
825 static PyObject *load_module(char *, FILE *, char *, int);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
826 static struct filedescr *find_module(char *, PyObject *,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
827 char *, size_t, FILE **);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
828 static struct _frozen *find_frozen(char *name);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
829
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
830 /* Load a package and return its module object WITH INCREMENTED
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
831 REFERENCE COUNT */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
832
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
833 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
834 load_package(char *name, char *pathname)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
835 {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
836 PyObject *m, *d, *file, *path;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
837 int err;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
838 char buf[MAXPATHLEN+1];
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
839 FILE *fp = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
840 struct filedescr *fdp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
841
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
842 m = PyImport_AddModule(name);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
843 if (m == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
844 return NULL;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
845 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
846 PySys_WriteStderr("import %s # directory %s\n",
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
847 name, pathname);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
848 d = PyModule_GetDict(m);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
849 file = PyString_FromString(pathname);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
850 if (file == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
851 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
852 path = Py_BuildValue("[O]", file);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
853 if (path == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
854 Py_DECREF(file);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
855 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
856 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
857 err = PyDict_SetItemString(d, "__file__", file);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
858 if (err == 0)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
859 err = PyDict_SetItemString(d, "__path__", path);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
860 if (err != 0) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
861 m = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
862 goto cleanup;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
863 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
864 buf[0] = '\0';
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
865 fdp = find_module("__init__", path, buf, sizeof(buf), &fp);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
866 if (fdp == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
867 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
868 PyErr_Clear();
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
869 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
870 else
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
871 m = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
872 goto cleanup;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
873 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
874 m = load_module(name, fp, buf, fdp->type);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
875 if (fp != NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
876 fclose(fp);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
877 cleanup:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
878 Py_XDECREF(path);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
879 Py_XDECREF(file);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
880 return m;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
881 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
882
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
883
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
884 /* Helper to test for built-in module */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
885
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
886 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
887 is_builtin(char *name)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
888 {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
889 int i;
6541
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
890 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
891 if (strcmp(name, PyImport_Inittab[i].name) == 0) {
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
892 if (PyImport_Inittab[i].initfunc == NULL)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
893 return -1;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
894 else
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
895 return 1;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
896 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
897 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
898 return 0;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
899 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
900
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
901
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
902 /* Search the path (default sys.path) for a module. Return the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
903 corresponding filedescr struct, and (via return arguments) the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
904 pathname and an open file. Return NULL if the module is not found. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
905
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
906 #ifdef MS_COREDLL
13663
29da35543833 ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
907 extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
29da35543833 ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
908 char *, int);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
909 #endif
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
910
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
911 static int case_ok(char *, int, int, char *);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
912 static int find_init_module(char *); /* Forward */
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
913
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
914 static struct filedescr *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
915 find_module(char *realname, PyObject *path, char *buf, size_t buflen,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
916 FILE **p_fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
917 {
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
918 int i, npath;
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
919 size_t len, namelen;
4596
4fa19659591e Keep gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
920 struct filedescr *fdp = NULL;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
921 FILE *fp = NULL;
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
922 #ifndef RISCOS
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
923 struct stat statbuf;
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
924 #endif
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
925 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
926 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
927 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
8934
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
928 char name[MAXPATHLEN+1];
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
929
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
930 if (strlen(realname) > MAXPATHLEN) {
20527
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
931 PyErr_SetString(PyExc_OverflowError,
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
932 "module name is too long");
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
933 return NULL;
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
934 }
8934
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
935 strcpy(name, realname);
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
936
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
937 if (path != NULL && PyString_Check(path)) {
20527
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
938 /* The only type of submodule allowed inside a "frozen"
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
939 package are other frozen modules or packages. */
8934
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
940 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) {
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
941 PyErr_SetString(PyExc_ImportError,
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
942 "full frozen module name too long");
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
943 return NULL;
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
944 }
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
945 strcpy(buf, PyString_AsString(path));
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
946 strcat(buf, ".");
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
947 strcat(buf, name);
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
948 strcpy(name, buf);
20768
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
949 #ifdef macintosh
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
950 /* Freezing on the mac works different, and the modules are
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
951 ** actually on sys.path. So we don't take the quick exit but
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
952 ** continue with the normal flow.
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
953 */
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
954 path = NULL;
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
955 #else
20527
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
956 if (find_frozen(name) != NULL) {
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
957 strcpy(buf, name);
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
958 return &fd_frozen;
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
959 }
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
960 PyErr_Format(PyExc_ImportError,
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
961 "No frozen submodule named %.200s", name);
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
962 return NULL;
20768
7b0546ee4789 On the macintosh don't take a quick exit in find_module() for frozen submodule imports: the frozen import goes through a different mechanism.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20671
diff changeset
963 #endif
8934
20b83ca06ce8 Patch by Just van Rossum that changes how we search for submodules of
Guido van Rossum <guido@python.org>
parents: 8845
diff changeset
964 }
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
965 if (path == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
966 if (is_builtin(name)) {
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
967 strcpy(buf, name);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
968 return &fd_builtin;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
969 }
20249
1acecc908ee8 Remove a couple of unused local variables (bug #445960, compiler warnings
Greg Ward <gward@python.net>
parents: 19596
diff changeset
970 if ((find_frozen(name)) != NULL) {
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
971 strcpy(buf, name);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
972 return &fd_frozen;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
973 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
974
4111
90216e907345 PYTHONWIN -> MS_COREDLL
Guido van Rossum <guido@python.org>
parents: 3964
diff changeset
975 #ifdef MS_COREDLL
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
976 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
977 if (fp != NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
978 *p_fp = fp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
979 return fdp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
980 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
981 #endif
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
982 path = PySys_GetObject("path");
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
983 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
984 if (path == NULL || !PyList_Check(path)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
985 PyErr_SetString(PyExc_ImportError,
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
986 "sys.path must be a list of directory names");
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
987 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
988 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
989 npath = PyList_Size(path);
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
990 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
991 for (i = 0; i < npath; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
992 PyObject *v = PyList_GetItem(path, i);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
993 if (!PyString_Check(v))
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
994 continue;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
995 len = PyString_Size(v);
5894
e2df95b7be78 Removed some variables that are used to exchange data between import.c and
Guido van Rossum <guido@python.org>
parents: 5758
diff changeset
996 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
997 continue; /* Too long */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
998 strcpy(buf, PyString_AsString(v));
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
999 if (strlen(buf) != len)
1905
61c3c1a2fdb4 Fix various potential buffer overrun problems.
Guido van Rossum <guido@python.org>
parents: 1886
diff changeset
1000 continue; /* v contains '\0' */
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1001 #ifdef macintosh
5980
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1002 #ifdef INTERN_STRINGS
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1003 /*
5980
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1004 ** Speedup: each sys.path item is interned, and
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1005 ** FindResourceModule remembers which items refer to
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1006 ** folders (so we don't have to bother trying to look
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1007 ** into them for resources).
5980
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1008 */
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1009 PyString_InternInPlace(&PyList_GET_ITEM(path, i));
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1010 v = PyList_GET_ITEM(path, i);
2894bb49e2ee Use string interning and caching to get speedups on the mac (Jack).
Guido van Rossum <guido@python.org>
parents: 5938
diff changeset
1011 #endif
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1012 if (PyMac_FindResourceModule((PyStringObject *)v, name, buf)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1013 static struct filedescr resfiledescr =
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1014 {"", "", PY_RESOURCE};
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1015
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1016 return &resfiledescr;
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1017 }
8845
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1018 if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1019 static struct filedescr resfiledescr =
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1020 {"", "", PY_CODERESOURCE};
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1021
8845
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1022 return &resfiledescr;
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1023 }
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1024 #endif
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1025 if (len > 0 && buf[len-1] != SEP
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1026 #ifdef ALTSEP
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1027 && buf[len-1] != ALTSEP
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1028 #endif
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1029 )
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1030 buf[len++] = SEP;
15401
c45c5080c844 Rip out DOS-8x3 support.
Guido van Rossum <guido@python.org>
parents: 14991
diff changeset
1031 strcpy(buf+len, name);
c45c5080c844 Rip out DOS-8x3 support.
Guido van Rossum <guido@python.org>
parents: 14991
diff changeset
1032 len += namelen;
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1033
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1034 /* Check for package import (buf holds a directory name,
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1035 and there's an __init__ module in that directory */
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1036 #ifdef HAVE_STAT
17642
e06c36c13f12 SF bug #417093: Case sensitive import: dir and .py file w/ same name
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
1037 if (stat(buf, &statbuf) == 0 && /* it exists */
e06c36c13f12 SF bug #417093: Case sensitive import: dir and .py file w/ same name
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
1038 S_ISDIR(statbuf.st_mode) && /* it's a directory */
e06c36c13f12 SF bug #417093: Case sensitive import: dir and .py file w/ same name
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
1039 find_init_module(buf) && /* it has __init__.py */
e06c36c13f12 SF bug #417093: Case sensitive import: dir and .py file w/ same name
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
1040 case_ok(buf, len, namelen, name)) /* and case matches */
e06c36c13f12 SF bug #417093: Case sensitive import: dir and .py file w/ same name
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
1041 return &fd_package;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1042 #else
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1043 /* XXX How are you going to test for directories? */
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1044 #ifdef RISCOS
20654
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1045 if (isdir(buf) &&
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1046 find_init_module(buf) &&
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1047 case_ok(buf, len, namelen, name))
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1048 return &fd_package;
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1049 #endif
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1050 #endif
6454
b5b35a0cf1aa Moved mac-specific speedup to a different place (Jack)
Guido van Rossum <guido@python.org>
parents: 6375
diff changeset
1051 #ifdef macintosh
b5b35a0cf1aa Moved mac-specific speedup to a different place (Jack)
Guido van Rossum <guido@python.org>
parents: 6375
diff changeset
1052 fdp = PyMac_FindModuleExtension(buf, &len, name);
17090
7e938f0e9a49 Case-checking was broken on the Macintosh. Fixed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 16986
diff changeset
1053 if (fdp) {
6454
b5b35a0cf1aa Moved mac-specific speedup to a different place (Jack)
Guido van Rossum <guido@python.org>
parents: 6375
diff changeset
1054 #else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1055 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1056 strcpy(buf+len, fdp->suffix);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1057 if (Py_VerboseFlag > 1)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
1058 PySys_WriteStderr("# trying %s\n", buf);
17090
7e938f0e9a49 Case-checking was broken on the Macintosh. Fixed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 16986
diff changeset
1059 #endif /* !macintosh */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1060 fp = fopen(buf, fdp->mode);
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1061 if (fp != NULL) {
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1062 if (case_ok(buf, len, namelen, name))
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1063 break;
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1064 else { /* continue search */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1065 fclose(fp);
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1066 fp = NULL;
16423
5c40113409c3 Steve Majewski's patch #103495, MatchFilename() and find_module()
Barry Warsaw <barry@python.org>
parents: 16311
diff changeset
1067 }
5c40113409c3 Steve Majewski's patch #103495, MatchFilename() and find_module()
Barry Warsaw <barry@python.org>
parents: 16311
diff changeset
1068 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1069 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1070 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
1071 break;
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1072 }
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1073 if (fp == NULL) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1074 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1075 "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
1076 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
1077 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1078 *p_fp = fp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1079 return fdp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1080 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1081
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1082 /* case_ok(char* buf, int len, int namelen, char* name)
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1083 * The arguments here are tricky, best shown by example:
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1084 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1085 * ^ ^ ^ ^
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1086 * |--------------------- buf ---------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1087 * |------------------- len ------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1088 * |------ name -------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1089 * |----- namelen -----|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1090 * buf is the full path, but len only counts up to (& exclusive of) the
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1091 * extension. name is the module name, also exclusive of extension.
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1092 *
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1093 * We've already done a successful stat() or fopen() on buf, so know that
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1094 * there's some match, possibly case-insensitive.
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1095 *
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1096 * case_ok() is to return 1 if there's a case-sensitive match for
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1097 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1098 * exists.
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1099 *
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1100 * case_ok() is used to implement case-sensitive import semantics even
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1101 * on platforms with case-insensitive filesystems. It's trivial to implement
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1102 * for case-sensitive filesystems. It's pretty much a cross-platform
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1103 * nightmare for systems with case-insensitive filesystems.
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1104 */
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1105
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1106 /* First we may need a pile of platform-specific header files; the sequence
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1107 * of #if's here should match the sequence in the body of case_ok().
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1108 */
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1109 #if defined(MS_WIN32) || defined(__CYGWIN__)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1110 #include <windows.h>
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1111 #ifdef __CYGWIN__
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1112 #include <sys/cygwin.h>
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1113 #endif
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1114
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1115 #elif defined(DJGPP)
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1116 #include <dir.h>
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1117
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1118 #elif defined(macintosh)
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1119 #include <TextUtils.h>
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1120 #ifdef USE_GUSI1
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1121 #include "TFileSpec.h" /* for Path2FSSpec() */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1122 #endif
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1123
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1124 #elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1125 #include <sys/types.h>
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1126 #include <dirent.h>
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1127
20654
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1128 #elif defined(RISCOS)
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1129 #include "oslib/osfscontrol.h"
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1130 #endif
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1131
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1132 static int
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1133 case_ok(char *buf, int len, int namelen, char *name)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1134 {
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1135 /* Pick a platform-specific implementation; the sequence of #if's here should
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1136 * match the sequence just above.
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1137 */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1138
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1139 /* MS_WIN32 || __CYGWIN__ */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1140 #if defined(MS_WIN32) || defined(__CYGWIN__)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1141 WIN32_FIND_DATA data;
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1142 HANDLE h;
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1143 #ifdef __CYGWIN__
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1144 char tempbuf[MAX_PATH];
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1145 #endif
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1146
18808
a8b1acc7a21f Add -E command line switch (ignore environment variables like PYTHONHOME
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 18803
diff changeset
1147 if (Py_GETENV("PYTHONCASEOK") != NULL)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1148 return 1;
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1149
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1150 #ifdef __CYGWIN__
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1151 cygwin32_conv_to_win32_path(buf, tempbuf);
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1152 h = FindFirstFile(tempbuf, &data);
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1153 #else
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1154 h = FindFirstFile(buf, &data);
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
1155 #endif
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1156 if (h == INVALID_HANDLE_VALUE) {
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1157 PyErr_Format(PyExc_NameError,
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1158 "Can't find file for module %.100s\n(filename %.300s)",
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1159 name, buf);
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1160 return 0;
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1161 }
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1162 FindClose(h);
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1163 return strncmp(data.cFileName, name, namelen) == 0;
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1164
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1165 /* DJGPP */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1166 #elif defined(DJGPP)
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1167 struct ffblk ffblk;
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1168 int done;
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1169
18808
a8b1acc7a21f Add -E command line switch (ignore environment variables like PYTHONHOME
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 18803
diff changeset
1170 if (Py_GETENV("PYTHONCASEOK") != NULL)
8544
35a2151fb1c3 Ignore Windows case check for ALL CAPS 8.3 files
Guido van Rossum <guido@python.org>
parents: 8374
diff changeset
1171 return 1;
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1172
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1173 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1174 if (done) {
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1175 PyErr_Format(PyExc_NameError,
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1176 "Can't find file for module %.100s\n(filename %.300s)",
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1177 name, buf);
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1178 return 0;
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1179 }
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1180 return strncmp(ffblk.ff_name, name, namelen) == 0;
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1181
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1182 /* macintosh */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1183 #elif defined(macintosh)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1184 FSSpec fss;
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1185 OSErr err;
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1186
18808
a8b1acc7a21f Add -E command line switch (ignore environment variables like PYTHONHOME
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 18803
diff changeset
1187 if (Py_GETENV("PYTHONCASEOK") != NULL)
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1188 return 1;
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1189
12476
3500c4350f62 Jack Jansen: The new version of the GUSI i/o library on the Macintosh
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
1190 #ifndef USE_GUSI1
9096
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1191 err = FSMakeFSSpec(0, 0, Pstring(buf), &fss);
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1192 #else
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1193 /* GUSI's Path2FSSpec() resolves all possible aliases nicely on
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1194 the way, which is fine for all directories, but here we need
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1195 the original name of the alias file (say, Dlg.ppc.slb, not
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1196 toolboxmodules.ppc.slb). */
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1197 char *colon;
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1198 err = Path2FSSpec(buf, &fss);
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1199 if (err == noErr) {
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1200 colon = strrchr(buf, ':'); /* find filename */
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1201 if (colon != NULL)
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1202 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1203 Pstring(colon+1), &fss);
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1204 else
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1205 err = FSMakeFSSpec(fss.vRefNum, fss.parID,
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1206 fss.name, &fss);
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1207 }
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1208 #endif
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1209 if (err) {
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1210 PyErr_Format(PyExc_NameError,
9096
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1211 "Can't find file for module %.100s\n(filename %.300s)",
2088f80253db Mac-specific mod to enable aliases on import paths.
Guido van Rossum <guido@python.org>
parents: 9050
diff changeset
1212 name, buf);
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1213 return 0;
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1214 }
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1215 return fss.name[0] >= namelen &&
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1216 strncmp(name, (char *)fss.name+1, namelen) == 0;
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
1217
16932
abc8c6c025ce Thanks to Steven Majewski, finally putting MacOS X imports to bed for 2.1b1.
Tim Peters <tim.peters@gmail.com>
parents: 16902
diff changeset
1218 /* new-fangled macintosh (macosx) */
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1219 #elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1220 DIR *dirp;
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1221 struct dirent *dp;
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1222 char dirname[MAXPATHLEN + 1];
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1223 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1224
18808
a8b1acc7a21f Add -E command line switch (ignore environment variables like PYTHONHOME
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 18803
diff changeset
1225 if (Py_GETENV("PYTHONCASEOK") != NULL)
16896
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1226 return 1;
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1227
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1228 /* Copy the dir component into dirname; substitute "." if empty */
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1229 if (dirlen <= 0) {
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1230 dirname[0] = '.';
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1231 dirname[1] = '\0';
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1232 }
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1233 else {
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1234 assert(dirlen <= MAXPATHLEN);
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1235 memcpy(dirname, buf, dirlen);
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1236 dirname[dirlen] = '\0';
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1237 }
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1238 /* Open the directory and search the entries for an exact match. */
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1239 dirp = opendir(dirname);
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1240 if (dirp) {
16932
abc8c6c025ce Thanks to Steven Majewski, finally putting MacOS X imports to bed for 2.1b1.
Tim Peters <tim.peters@gmail.com>
parents: 16902
diff changeset
1241 char *nameWithExt = buf + len - namelen;
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1242 while ((dp = readdir(dirp)) != NULL) {
16896
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1243 const int thislen =
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1244 #ifdef _DIRENT_HAVE_D_NAMELEN
16896
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1245 dp->d_namlen;
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1246 #else
16896
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1247 strlen(dp->d_name);
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1248 #endif
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
1249 if (thislen >= namelen &&
16932
abc8c6c025ce Thanks to Steven Majewski, finally putting MacOS X imports to bed for 2.1b1.
Tim Peters <tim.peters@gmail.com>
parents: 16902
diff changeset
1250 strcmp(dp->d_name, nameWithExt) == 0) {
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1251 (void)closedir(dirp);
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1252 return 1; /* Found */
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1253 }
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1254 }
16896
fa84f9f41092 More fiddling w/ the new-fangled Mac import code.
Tim Peters <tim.peters@gmail.com>
parents: 16893
diff changeset
1255 (void)closedir(dirp);
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1256 }
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1257 return 0 ; /* Not found */
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
1258
20654
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1259 /* RISC OS */
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1260 #elif defined(RISCOS)
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1261 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1262 char buf2[MAXPATHLEN+2];
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1263 char *nameWithExt = buf+len-namelen;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1264 int canonlen;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1265 os_error *e;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1266
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1267 if (Py_GETENV("PYTHONCASEOK") != NULL)
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1268 return 1;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1269
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1270 /* workaround:
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1271 append wildcard, otherwise case of filename wouldn't be touched */
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1272 strcpy(buf2, buf);
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1273 strcat(buf2, "*");
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1274
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1275 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen);
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1276 canonlen = MAXPATHLEN+1-canonlen;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1277 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) )
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1278 return 0;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1279 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0)
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1280 return 1; /* match */
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1281
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1282 return 0;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20527
diff changeset
1283
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1284 /* assuming it's a case-sensitive filesystem, so there's nothing to do! */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1285 #else
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1286 return 1;
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
1287
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1288 #endif
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
1289 }
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
1290
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
1291
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1292 #ifdef HAVE_STAT
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1293 /* Helper to look for __init__.py or __init__.py[co] in potential package */
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1294 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1295 find_init_module(char *buf)
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1296 {
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1297 const size_t save_len = strlen(buf);
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
1298 size_t i = save_len;
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1299 char *pname; /* pointer to start of __init__ */
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1300 struct stat statbuf;
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1301
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1302 /* For calling case_ok(buf, len, namelen, name):
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1303 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1304 * ^ ^ ^ ^
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1305 * |--------------------- buf ---------------------|
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1306 * |------------------- len ------------------|
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1307 * |------ name -------|
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1308 * |----- namelen -----|
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1309 */
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1310 if (save_len + 13 >= MAXPATHLEN)
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1311 return 0;
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1312 buf[i++] = SEP;
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1313 pname = buf + i;
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1314 strcpy(pname, "__init__.py");
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1315 if (stat(buf, &statbuf) == 0) {
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1316 if (case_ok(buf,
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1317 save_len + 9, /* len("/__init__") */
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1318 8, /* len("__init__") */
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1319 pname)) {
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1320 buf[save_len] = '\0';
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1321 return 1;
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1322 }
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1323 }
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1324 i += strlen(pname);
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1325 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1326 if (stat(buf, &statbuf) == 0) {
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1327 if (case_ok(buf,
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1328 save_len + 9, /* len("/__init__") */
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1329 8, /* len("__init__") */
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1330 pname)) {
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1331 buf[save_len] = '\0';
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1332 return 1;
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
1333 }
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1334 }
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1335 buf[save_len] = '\0';
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1336 return 0;
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1337 }
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1338
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1339 #else
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1340
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1341 #ifdef RISCOS
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1342 static int
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1343 find_init_module(buf)
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1344 char *buf;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1345 {
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1346 int save_len = strlen(buf);
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1347 int i = save_len;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1348
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1349 if (save_len + 13 >= MAXPATHLEN)
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1350 return 0;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1351 buf[i++] = SEP;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1352 strcpy(buf+i, "__init__/py");
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1353 if (isfile(buf)) {
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1354 buf[save_len] = '\0';
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1355 return 1;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1356 }
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1357
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1358 if (Py_OptimizeFlag)
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1359 strcpy(buf+i, "o");
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1360 else
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1361 strcpy(buf+i, "c");
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1362 if (isfile(buf)) {
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1363 buf[save_len] = '\0';
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1364 return 1;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1365 }
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1366 buf[save_len] = '\0';
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1367 return 0;
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1368 }
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1369 #endif /*RISCOS*/
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
1370
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1371 #endif /* HAVE_STAT */
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1372
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1373
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1374 static int init_builtin(char *); /* Forward */
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1375
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1376 /* Load an external module using the default search path and return
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1377 its module object WITH INCREMENTED REFERENCE COUNT */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
1378
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1379 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1380 load_module(char *name, FILE *fp, char *buf, int type)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
1381 {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1382 PyObject *modules;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1383 PyObject *m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1384 int err;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1385
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1386 /* First check that there's an open file (if we need one) */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1387 switch (type) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1388 case PY_SOURCE:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1389 case PY_COMPILED:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1390 if (fp == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1391 PyErr_Format(PyExc_ValueError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1392 "file object required for import (type code %d)",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1393 type);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1394 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1395 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1396 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1397
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1398 switch (type) {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1399
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1400 case PY_SOURCE:
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1401 m = load_source_module(name, buf, fp);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1402 break;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1403
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1404 case PY_COMPILED:
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1405 m = load_compiled_module(name, buf, fp);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1406 break;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1407
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1408 #ifdef HAVE_DYNAMIC_LOADING
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1409 case C_EXTENSION:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1410 m = _PyImport_LoadDynamicModule(name, buf, fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1411 break;
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1412 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1413
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1414 #ifdef macintosh
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1415 case PY_RESOURCE:
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1416 m = PyMac_LoadResourceModule(name, buf);
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1417 break;
8845
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1418 case PY_CODERESOURCE:
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1419 m = PyMac_LoadCodeResourceModule(name, buf);
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
1420 break;
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1421 #endif
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
1422
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1423 case PKG_DIRECTORY:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1424 m = load_package(name, buf);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1425 break;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1426
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1427 case C_BUILTIN:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1428 case PY_FROZEN:
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1429 if (buf != NULL && buf[0] != '\0')
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1430 name = buf;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1431 if (type == C_BUILTIN)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1432 err = init_builtin(name);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1433 else
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1434 err = PyImport_ImportFrozenModule(name);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1435 if (err < 0)
6299
0054a3840a75 Crrected a flow control error that caused the wrong error message when
Guido van Rossum <guido@python.org>
parents: 6285
diff changeset
1436 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1437 if (err == 0) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1438 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1439 "Purported %s module %.200s not found",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1440 type == C_BUILTIN ?
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1441 "builtin" : "frozen",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1442 name);
6299
0054a3840a75 Crrected a flow control error that caused the wrong error message when
Guido van Rossum <guido@python.org>
parents: 6285
diff changeset
1443 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1444 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1445 modules = PyImport_GetModuleDict();
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1446 m = PyDict_GetItemString(modules, name);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1447 if (m == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1448 PyErr_Format(
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1449 PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1450 "%s module %.200s not properly initialized",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1451 type == C_BUILTIN ?
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1452 "builtin" : "frozen",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1453 name);
6299
0054a3840a75 Crrected a flow control error that caused the wrong error message when
Guido van Rossum <guido@python.org>
parents: 6285
diff changeset
1454 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1455 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1456 Py_INCREF(m);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1457 break;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1458
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1459 default:
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1460 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1461 "Don't know how to import %.200s (type code %d)",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1462 name, type);
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1463 m = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1464
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1465 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1466
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1467 return m;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1468 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
1469
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
1470
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1471 /* Initialize a built-in module.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1472 Return 1 for succes, 0 if the module is not found, and -1 with
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1473 an exception set if the initialization failed. */
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1474
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1475 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1476 init_builtin(char *name)
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1477 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1478 struct _inittab *p;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1479
20249
1acecc908ee8 Remove a couple of unused local variables (bug #445960, compiler warnings
Greg Ward <gward@python.net>
parents: 19596
diff changeset
1480 if (_PyImport_FindExtension(name, name) != NULL)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1481 return 1;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1482
6541
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
1483 for (p = PyImport_Inittab; p->name != NULL; p++) {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1484 if (strcmp(name, p->name) == 0) {
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1485 if (p->initfunc == NULL) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1486 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1487 "Cannot re-init internal module %.200s",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1488 name);
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1489 return -1;
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1490 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1491 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
1492 PySys_WriteStderr("import %s # builtin\n", name);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1493 (*p->initfunc)();
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1494 if (PyErr_Occurred())
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1495 return -1;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1496 if (_PyImport_FixupExtension(name, name) == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1497 return -1;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1498 return 1;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1499 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1500 }
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1501 return 0;
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1502 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1503
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1504
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1505 /* Frozen modules */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1506
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
1507 static struct _frozen *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1508 find_frozen(char *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1509 {
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
1510 struct _frozen *p;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1511
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1512 for (p = PyImport_FrozenModules; ; p++) {
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1513 if (p->name == NULL)
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1514 return NULL;
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1515 if (strcmp(p->name, name) == 0)
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1516 break;
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1517 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1518 return p;
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1519 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1520
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1521 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1522 get_frozen_object(char *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1523 {
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
1524 struct _frozen *p = find_frozen(name);
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1525 int size;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1526
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1527 if (p == NULL) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1528 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1529 "No such frozen object named %.200s",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1530 name);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1531 return NULL;
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1532 }
20527
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1533 if (p->code == NULL) {
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1534 PyErr_Format(PyExc_ImportError,
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1535 "Excluded frozen object named %.200s",
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1536 name);
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1537 return NULL;
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1538 }
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1539 size = p->size;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1540 if (size < 0)
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1541 size = -size;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1542 return PyMarshal_ReadObjectFromString((char *)p->code, size);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1543 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1544
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1545 /* Initialize a frozen module.
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1546 Return 1 for succes, 0 if the module is not found, and -1 with
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1547 an exception set if the initialization failed.
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1548 This function is also used from frozenmain.c */
2294
6263e2fd9398 init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents: 2270
diff changeset
1549
6263e2fd9398 init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents: 2270
diff changeset
1550 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1551 PyImport_ImportFrozenModule(char *name)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1552 {
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
1553 struct _frozen *p = find_frozen(name);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1554 PyObject *co;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1555 PyObject *m;
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1556 int ispackage;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1557 int size;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1558
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1559 if (p == NULL)
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1560 return 0;
20527
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1561 if (p->code == NULL) {
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1562 PyErr_Format(PyExc_ImportError,
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1563 "Excluded frozen object named %.200s",
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1564 name);
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1565 return -1;
3d3b6b4cb79f First part of SF patch #416704: More robust freeze, by Toby Dickenson.
Guido van Rossum <guido@python.org>
parents: 20249
diff changeset
1566 }
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1567 size = p->size;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1568 ispackage = (size < 0);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1569 if (ispackage)
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1570 size = -size;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1571 if (Py_VerboseFlag)
9329
7f242f29a45f Replace fprintf(stderr, ...) with PySys_WriteStderr(...).
Guido van Rossum <guido@python.org>
parents: 9203
diff changeset
1572 PySys_WriteStderr("import %s # frozen%s\n",
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1573 name, ispackage ? " package" : "");
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1574 co = PyMarshal_ReadObjectFromString((char *)p->code, size);
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1575 if (co == NULL)
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1576 return -1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1577 if (!PyCode_Check(co)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1578 Py_DECREF(co);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1579 PyErr_Format(PyExc_TypeError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1580 "frozen object %.200s is not a code object",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1581 name);
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1582 return -1;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1583 }
7552
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1584 if (ispackage) {
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1585 /* Set __path__ to the package name */
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1586 PyObject *d, *s;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1587 int err;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1588 m = PyImport_AddModule(name);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1589 if (m == NULL)
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1590 return -1;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1591 d = PyModule_GetDict(m);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1592 s = PyString_InternFromString(name);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1593 if (s == NULL)
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1594 return -1;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1595 err = PyDict_SetItemString(d, "__path__", s);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1596 Py_DECREF(s);
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1597 if (err != 0)
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1598 return err;
c8e5f704623d Support for frozen packages, matching the revamped Tools/freeze.
Guido van Rossum <guido@python.org>
parents: 7535
diff changeset
1599 }
7232
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
1600 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1601 Py_DECREF(co);
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1602 if (m == NULL)
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1603 return -1;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1604 Py_DECREF(m);
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1605 return 1;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1606 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1607
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1608
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1609 /* Import a module, either built-in, frozen, or external, and return
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1610 its module object WITH INCREMENTED REFERENCE COUNT */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1611
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1612 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1613 PyImport_ImportModule(char *name)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1614 {
16534
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1615 PyObject *pname;
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1616 PyObject *result;
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1617
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1618 pname = PyString_FromString(name);
28394
bc9076b01694 Backport 2.220,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27867
diff changeset
1619 if (pname == NULL)
bc9076b01694 Backport 2.220,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27867
diff changeset
1620 return NULL;
16534
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1621 result = PyImport_Import(pname);
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1622 Py_DECREF(pname);
b59f3a1eb123 This modified version of a patch by Thomas Heller allows __import__
Marc-André Lemburg <mal@egenix.com>
parents: 16433
diff changeset
1623 return result;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1624 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1625
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1626 /* Forward declarations for helper routines */
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1627 static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1628 static PyObject *load_next(PyObject *mod, PyObject *altmod,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1629 char **p_name, char *buf, int *p_buflen);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1630 static int mark_miss(char *name);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1631 static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1632 char *buf, int buflen, int recursive);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1633 static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1634
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1635 /* The Magnum Opus of dotted-name import :-) */
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1636
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1637 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1638 import_module_ex(char *name, PyObject *globals, PyObject *locals,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1639 PyObject *fromlist)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1640 {
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1641 char buf[MAXPATHLEN+1];
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1642 int buflen = 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1643 PyObject *parent, *head, *next, *tail;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1644
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1645 parent = get_parent(globals, buf, &buflen);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1646 if (parent == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1647 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1648
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1649 head = load_next(parent, Py_None, &name, buf, &buflen);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1650 if (head == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1651 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1652
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1653 tail = head;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1654 Py_INCREF(tail);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1655 while (name) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1656 next = load_next(tail, tail, &name, buf, &buflen);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1657 Py_DECREF(tail);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1658 if (next == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1659 Py_DECREF(head);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1660 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1661 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1662 tail = next;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1663 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1664
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1665 if (fromlist != NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1666 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1667 fromlist = NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1668 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1669
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1670 if (fromlist == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1671 Py_DECREF(tail);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1672 return head;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1673 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1674
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1675 Py_DECREF(head);
6285
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1676 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1677 Py_DECREF(tail);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1678 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1679 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1680
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1681 return tail;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1682 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1683
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1684 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1685 PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1686 PyObject *fromlist)
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1687 {
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1688 PyObject *result;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1689 lock_import();
7535
13b60abdb70d Oops -- overuse of dabbrev-expand introduced a strange bug, where
Guido van Rossum <guido@python.org>
parents: 7533
diff changeset
1690 result = import_module_ex(name, globals, locals, fromlist);
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1691 if (unlock_import() < 0) {
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1692 Py_XDECREF(result);
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1693 PyErr_SetString(PyExc_RuntimeError,
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1694 "not holding the import lock");
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1695 return NULL;
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
1696 }
7533
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1697 return result;
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1698 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1699
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1700 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1701 get_parent(PyObject *globals, char *buf, int *p_buflen)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1702 {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1703 static PyObject *namestr = NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1704 static PyObject *pathstr = NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1705 PyObject *modname, *modpath, *modules, *parent;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1706
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1707 if (globals == NULL || !PyDict_Check(globals))
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1708 return Py_None;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1709
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1710 if (namestr == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1711 namestr = PyString_InternFromString("__name__");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1712 if (namestr == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1713 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1714 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1715 if (pathstr == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1716 pathstr = PyString_InternFromString("__path__");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1717 if (pathstr == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1718 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1719 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1720
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1721 *buf = '\0';
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1722 *p_buflen = 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1723 modname = PyDict_GetItem(globals, namestr);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1724 if (modname == NULL || !PyString_Check(modname))
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1725 return Py_None;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1726
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1727 modpath = PyDict_GetItem(globals, pathstr);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1728 if (modpath != NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1729 int len = PyString_GET_SIZE(modname);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1730 if (len > MAXPATHLEN) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1731 PyErr_SetString(PyExc_ValueError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1732 "Module name too long");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1733 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1734 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1735 strcpy(buf, PyString_AS_STRING(modname));
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1736 *p_buflen = len;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1737 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1738 else {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1739 char *start = PyString_AS_STRING(modname);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1740 char *lastdot = strrchr(start, '.');
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
1741 size_t len;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1742 if (lastdot == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1743 return Py_None;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1744 len = lastdot - start;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1745 if (len >= MAXPATHLEN) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1746 PyErr_SetString(PyExc_ValueError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1747 "Module name too long");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1748 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1749 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1750 strncpy(buf, start, len);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1751 buf[len] = '\0';
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1752 *p_buflen = len;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1753 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1754
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1755 modules = PyImport_GetModuleDict();
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1756 parent = PyDict_GetItemString(modules, buf);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1757 if (parent == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1758 parent = Py_None;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1759 return parent;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1760 /* We expect, but can't guarantee, if parent != None, that:
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1761 - parent.__name__ == buf
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1762 - parent.__dict__ is globals
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1763 If this is violated... Who cares? */
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1764 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1765
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1766 /* altmod is either None or same as mod */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1767 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1768 load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1769 int *p_buflen)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1770 {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1771 char *name = *p_name;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1772 char *dot = strchr(name, '.');
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
1773 size_t len;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1774 char *p;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1775 PyObject *result;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1776
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1777 if (dot == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1778 *p_name = NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1779 len = strlen(name);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1780 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1781 else {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1782 *p_name = dot+1;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1783 len = dot-name;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1784 }
8012
2b09a5d26368 Reject empty module names -- otherwise __import__("") does something
Guido van Rossum <guido@python.org>
parents: 7987
diff changeset
1785 if (len == 0) {
2b09a5d26368 Reject empty module names -- otherwise __import__("") does something
Guido van Rossum <guido@python.org>
parents: 7987
diff changeset
1786 PyErr_SetString(PyExc_ValueError,
2b09a5d26368 Reject empty module names -- otherwise __import__("") does something
Guido van Rossum <guido@python.org>
parents: 7987
diff changeset
1787 "Empty module name");
2b09a5d26368 Reject empty module names -- otherwise __import__("") does something
Guido van Rossum <guido@python.org>
parents: 7987
diff changeset
1788 return NULL;
2b09a5d26368 Reject empty module names -- otherwise __import__("") does something
Guido van Rossum <guido@python.org>
parents: 7987
diff changeset
1789 }
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1790
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1791 p = buf + *p_buflen;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1792 if (p != buf)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1793 *p++ = '.';
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1794 if (p+len-buf >= MAXPATHLEN) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1795 PyErr_SetString(PyExc_ValueError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1796 "Module name too long");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1797 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1798 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1799 strncpy(p, name, len);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1800 p[len] = '\0';
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1801 *p_buflen = p+len-buf;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1802
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1803 result = import_submodule(mod, p, buf);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1804 if (result == Py_None && altmod != mod) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1805 Py_DECREF(result);
6252
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1806 /* Here, altmod must be None and mod must not be None */
6256
ce2092714484 Bugfix: import A.B from inside package was busted by mark_miss optimization.
Guido van Rossum <guido@python.org>
parents: 6252
diff changeset
1807 result = import_submodule(altmod, p, p);
6252
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1808 if (result != NULL && result != Py_None) {
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1809 if (mark_miss(buf) != 0) {
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1810 Py_DECREF(result);
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1811 return NULL;
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1812 }
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1813 strncpy(buf, name, len);
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1814 buf[len] = '\0';
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1815 *p_buflen = len;
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1816 }
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1817 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1818 if (result == NULL)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1819 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1820
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1821 if (result == Py_None) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1822 Py_DECREF(result);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1823 PyErr_Format(PyExc_ImportError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1824 "No module named %.200s", name);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1825 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1826 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1827
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1828 return result;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1829 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1830
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1831 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1832 mark_miss(char *name)
6252
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1833 {
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1834 PyObject *modules = PyImport_GetModuleDict();
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1835 return PyDict_SetItemString(modules, name, Py_None);
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1836 }
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1837
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
1838 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1839 ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen,
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1840 int recursive)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1841 {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1842 int i;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1843
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1844 if (!PyObject_HasAttrString(mod, "__path__"))
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1845 return 1;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1846
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1847 for (i = 0; ; i++) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1848 PyObject *item = PySequence_GetItem(fromlist, i);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1849 int hasit;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1850 if (item == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1851 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1852 PyErr_Clear();
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1853 return 1;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1854 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1855 return 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1856 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1857 if (!PyString_Check(item)) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1858 PyErr_SetString(PyExc_TypeError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1859 "Item in ``from list'' not a string");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1860 Py_DECREF(item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1861 return 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1862 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1863 if (PyString_AS_STRING(item)[0] == '*') {
6285
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1864 PyObject *all;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1865 Py_DECREF(item);
6285
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1866 /* See if the package defines __all__ */
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1867 if (recursive)
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1868 continue; /* Avoid endless recursion */
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1869 all = PyObject_GetAttrString(mod, "__all__");
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1870 if (all == NULL)
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1871 PyErr_Clear();
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1872 else {
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1873 if (!ensure_fromlist(mod, all, buf, buflen, 1))
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1874 return 0;
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1875 Py_DECREF(all);
337054e9d4fa Added support for __all__, which should be a list of modules to be
Guido van Rossum <guido@python.org>
parents: 6256
diff changeset
1876 }
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1877 continue;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1878 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1879 hasit = PyObject_HasAttr(mod, item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1880 if (!hasit) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1881 char *subname = PyString_AS_STRING(item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1882 PyObject *submod;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1883 char *p;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1884 if (buflen + strlen(subname) >= MAXPATHLEN) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1885 PyErr_SetString(PyExc_ValueError,
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1886 "Module name too long");
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1887 Py_DECREF(item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1888 return 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1889 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1890 p = buf + buflen;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1891 *p++ = '.';
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1892 strcpy(p, subname);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1893 submod = import_submodule(mod, subname, buf);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1894 Py_XDECREF(submod);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1895 if (submod == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1896 Py_DECREF(item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1897 return 0;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1898 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1899 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1900 Py_DECREF(item);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1901 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1902
6375
b68185d94777 Remove unreachable "return 1" at end of ensure_fromlist().
Guido van Rossum <guido@python.org>
parents: 6305
diff changeset
1903 /* NOTREACHED */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1904 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1905
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1906 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1907 import_submodule(PyObject *mod, char *subname, char *fullname)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1908 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1909 PyObject *modules = PyImport_GetModuleDict();
18803
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1910 PyObject *m, *res = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1911
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1912 /* Require:
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1913 if mod == None: subname == fullname
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1914 else: mod.__name__ + "." + subname == fullname
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1915 */
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1916
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
1917 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1918 Py_INCREF(m);
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1919 }
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1920 else {
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1921 PyObject *path;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1922 char buf[MAXPATHLEN+1];
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1923 struct filedescr *fdp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1924 FILE *fp = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1925
8374
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1926 if (mod == Py_None)
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1927 path = NULL;
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1928 else {
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1929 path = PyObject_GetAttrString(mod, "__path__");
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1930 if (path == NULL) {
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1931 PyErr_Clear();
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1932 Py_INCREF(Py_None);
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1933 return Py_None;
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1934 }
a1bfe5bc6d8e Fix a curious bug: statements like "import sys.time" would succeed,
Guido van Rossum <guido@python.org>
parents: 8330
diff changeset
1935 }
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1936
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1937 buf[0] = '\0';
8613
e3d3bbbd93f3 Fix two smal memory leaks discovered by Vadim Chugunov.
Guido van Rossum <guido@python.org>
parents: 8544
diff changeset
1938 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
e3d3bbbd93f3 Fix two smal memory leaks discovered by Vadim Chugunov.
Guido van Rossum <guido@python.org>
parents: 8544
diff changeset
1939 Py_XDECREF(path);
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1940 if (fdp == NULL) {
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1941 if (!PyErr_ExceptionMatches(PyExc_ImportError))
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1942 return NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1943 PyErr_Clear();
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1944 Py_INCREF(Py_None);
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1945 return Py_None;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1946 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1947 m = load_module(fullname, fp, buf, fdp->type);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1948 if (fp)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1949 fclose(fp);
18803
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1950 if (mod != Py_None) {
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1951 /* Irrespective of the success of this load, make a
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1952 reference to it in the parent package module.
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1953 A copy gets saved in the modules dictionary
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1954 under the full name, so get a reference from
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1955 there, if need be. (The exception is when
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1956 the load failed with a SyntaxError -- then
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1957 there's no trace in sys.modules. In that case,
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1958 of course, do nothing extra.) */
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1959 res = m;
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1960 if (res == NULL)
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1961 res = PyDict_GetItemString(modules, fullname);
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1962 if (res != NULL &&
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1963 PyObject_SetAttrString(mod, subname, res) < 0) {
763bb6fae280 SF Patch #441791, with changes: when "import foo.bar" fails with an
Guido van Rossum <guido@python.org>
parents: 18388
diff changeset
1964 Py_XDECREF(m);
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1965 m = NULL;
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1966 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
1967 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1968 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1969
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1970 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1971 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1972
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1973
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1974 /* Re-import a module of any kind and return its module object, WITH
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1975 INCREMENTED REFERENCE COUNT */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1976
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1977 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1978 PyImport_ReloadModule(PyObject *m)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1979 {
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1980 PyObject *modules = PyImport_GetModuleDict();
6250
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
1981 PyObject *path = NULL;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
1982 char *name, *subname;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1983 char buf[MAXPATHLEN+1];
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1984 struct filedescr *fdp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1985 FILE *fp = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1986
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1987 if (m == NULL || !PyModule_Check(m)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1988 PyErr_SetString(PyExc_TypeError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1989 "reload() argument must be module");
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1990 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1991 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1992 name = PyModule_GetName(m);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1993 if (name == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1994 return NULL;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
1995 if (m != PyDict_GetItemString(modules, name)) {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1996 PyErr_Format(PyExc_ImportError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1997 "reload(): module %.200s not in sys.modules",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1998 name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1999 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2000 }
6250
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2001 subname = strrchr(name, '.');
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2002 if (subname == NULL)
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2003 subname = name;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2004 else {
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2005 PyObject *parentname, *parent;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2006 parentname = PyString_FromStringAndSize(name, (subname-name));
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2007 if (parentname == NULL)
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2008 return NULL;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2009 parent = PyDict_GetItem(modules, parentname);
9971
0390af6acf7f PyImport_ReloadModule(): Nailed a small memory leak. In the
Barry Warsaw <barry@python.org>
parents: 9680
diff changeset
2010 Py_DECREF(parentname);
6250
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2011 if (parent == NULL) {
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2012 PyErr_Format(PyExc_ImportError,
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2013 "reload(): parent %.200s not in sys.modules",
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2014 name);
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2015 return NULL;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2016 }
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2017 subname++;
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2018 path = PyObject_GetAttrString(parent, "__path__");
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2019 if (path == NULL)
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2020 PyErr_Clear();
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2021 }
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2022 buf[0] = '\0';
6250
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2023 fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp);
3fa4b7ae0e6b Fix reload() for package submodules.
Guido van Rossum <guido@python.org>
parents: 6249
diff changeset
2024 Py_XDECREF(path);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2025 if (fdp == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2026 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2027 m = load_module(name, fp, buf, fdp->type);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2028 if (fp)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2029 fclose(fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2030 return m;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2031 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2032
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2033
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2034 /* Higher-level import emulator which emulates the "import" statement
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2035 more accurately -- it invokes the __import__() function from the
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2036 builtins of the current globals. This means that the import is
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2037 done using whatever import hooks are installed in the current
9680
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
2038 environment, e.g. by "rexec".
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
2039 A dummy list ["__doc__"] is passed as the 4th argument so that
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
2040 e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
2041 will return <module "gencache"> instead of <module "win32com">. */
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2042
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2043 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2044 PyImport_Import(PyObject *module_name)
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2045 {
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2046 static PyObject *silly_list = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2047 static PyObject *builtins_str = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2048 static PyObject *import_str = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2049 PyObject *globals = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2050 PyObject *import = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2051 PyObject *builtins = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2052 PyObject *r = NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2053
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2054 /* Initialize constant string objects */
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2055 if (silly_list == NULL) {
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2056 import_str = PyString_InternFromString("__import__");
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2057 if (import_str == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2058 return NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2059 builtins_str = PyString_InternFromString("__builtins__");
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2060 if (builtins_str == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2061 return NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2062 silly_list = Py_BuildValue("[s]", "__doc__");
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2063 if (silly_list == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2064 return NULL;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2065 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2066
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2067 /* Get the builtins from current globals */
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2068 globals = PyEval_GetGlobals();
16712
6341f8d909ac The code in PyImport_Import() tried to save itself a bit of work and
Guido van Rossum <guido@python.org>
parents: 16534
diff changeset
2069 if (globals != NULL) {
9431
87b9554c51d4 Jim Fulton writes:
Guido van Rossum <guido@python.org>
parents: 9329
diff changeset
2070 Py_INCREF(globals);
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2071 builtins = PyObject_GetItem(globals, builtins_str);
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2072 if (builtins == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2073 goto err;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2074 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2075 else {
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2076 /* No globals -- use standard builtins, and fake globals */
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2077 PyErr_Clear();
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2078
16712
6341f8d909ac The code in PyImport_Import() tried to save itself a bit of work and
Guido van Rossum <guido@python.org>
parents: 16534
diff changeset
2079 builtins = PyImport_ImportModuleEx("__builtin__",
6341f8d909ac The code in PyImport_Import() tried to save itself a bit of work and
Guido van Rossum <guido@python.org>
parents: 16534
diff changeset
2080 NULL, NULL, NULL);
6341f8d909ac The code in PyImport_Import() tried to save itself a bit of work and
Guido van Rossum <guido@python.org>
parents: 16534
diff changeset
2081 if (builtins == NULL)
6341f8d909ac The code in PyImport_Import() tried to save itself a bit of work and
Guido van Rossum <guido@python.org>
parents: 16534
diff changeset
2082 return NULL;
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2083 globals = Py_BuildValue("{OO}", builtins_str, builtins);
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2084 if (globals == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2085 goto err;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2086 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2087
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2088 /* Get the __import__ function from the builtins */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18808
diff changeset
2089 if (PyDict_Check(builtins)) {
16986
c5a417e8d84c Add some spaces around the "=" in assignments.
Fred Drake <fdrake@acm.org>
parents: 16947
diff changeset
2090 import = PyObject_GetItem(builtins, import_str);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18808
diff changeset
2091 if (import == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18808
diff changeset
2092 PyErr_SetObject(PyExc_KeyError, import_str);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18808
diff changeset
2093 }
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2094 else
16986
c5a417e8d84c Add some spaces around the "=" in assignments.
Fred Drake <fdrake@acm.org>
parents: 16947
diff changeset
2095 import = PyObject_GetAttr(builtins, import_str);
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2096 if (import == NULL)
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2097 goto err;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2098
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2099 /* Call the _import__ function with the proper argument list */
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2100 r = PyObject_CallFunction(import, "OOOO",
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2101 module_name, globals, globals, silly_list);
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2102
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2103 err:
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2104 Py_XDECREF(globals);
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2105 Py_XDECREF(builtins);
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2106 Py_XDECREF(import);
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2107
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2108 return r;
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2109 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2110
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
2111
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2112 /* Module 'imp' provides Python access to the primitives used for
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2113 importing modules.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2114 */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2115
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2116 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2117 imp_get_magic(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2118 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2119 char buf[4];
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2120
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2121 if (!PyArg_ParseTuple(args, ":get_magic"))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2122 return NULL;
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
2123 buf[0] = (char) ((pyc_magic >> 0) & 0xff);
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
2124 buf[1] = (char) ((pyc_magic >> 8) & 0xff);
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
2125 buf[2] = (char) ((pyc_magic >> 16) & 0xff);
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
2126 buf[3] = (char) ((pyc_magic >> 24) & 0xff);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2127
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2128 return PyString_FromStringAndSize(buf, 4);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2129 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2130
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2131 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2132 imp_get_suffixes(PyObject *self, PyObject *args)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2133 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2134 PyObject *list;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2135 struct filedescr *fdp;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2136
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2137 if (!PyArg_ParseTuple(args, ":get_suffixes"))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2138 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2139 list = PyList_New(0);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2140 if (list == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2141 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2142 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2143 PyObject *item = Py_BuildValue("ssi",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2144 fdp->suffix, fdp->mode, fdp->type);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2145 if (item == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2146 Py_DECREF(list);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2147 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2148 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2149 if (PyList_Append(list, item) < 0) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2150 Py_DECREF(list);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2151 Py_DECREF(item);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2152 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2153 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2154 Py_DECREF(item);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2155 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2156 return list;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2157 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2158
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2159 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2160 call_find_module(char *name, PyObject *path)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2161 {
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
2162 extern int fclose(FILE *);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2163 PyObject *fob, *ret;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2164 struct filedescr *fdp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2165 char pathname[MAXPATHLEN+1];
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2166 FILE *fp = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2167
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2168 pathname[0] = '\0';
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2169 if (path == Py_None)
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2170 path = NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2171 fdp = find_module(name, path, pathname, MAXPATHLEN+1, &fp);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2172 if (fdp == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2173 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2174 if (fp != NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2175 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2176 if (fob == NULL) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2177 fclose(fp);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2178 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2179 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2180 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2181 else {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2182 fob = Py_None;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2183 Py_INCREF(fob);
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2184 }
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2185 ret = Py_BuildValue("Os(ssi)",
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2186 fob, pathname, fdp->suffix, fdp->mode, fdp->type);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2187 Py_DECREF(fob);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2188 return ret;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2189 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2190
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2191 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2192 imp_find_module(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2193 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2194 char *name;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2195 PyObject *path = NULL;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2196 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2197 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2198 return call_find_module(name, path);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2199 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2200
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2201 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2202 imp_init_builtin(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2203 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2204 char *name;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2205 int ret;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2206 PyObject *m;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2207 if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2208 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2209 ret = init_builtin(name);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2210 if (ret < 0)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2211 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2212 if (ret == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2213 Py_INCREF(Py_None);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2214 return Py_None;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2215 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2216 m = PyImport_AddModule(name);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2217 Py_XINCREF(m);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2218 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2219 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2220
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2221 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2222 imp_init_frozen(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2223 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2224 char *name;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2225 int ret;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2226 PyObject *m;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2227 if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2228 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2229 ret = PyImport_ImportFrozenModule(name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2230 if (ret < 0)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2231 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2232 if (ret == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2233 Py_INCREF(Py_None);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2234 return Py_None;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2235 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2236 m = PyImport_AddModule(name);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2237 Py_XINCREF(m);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2238 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2239 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2240
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2241 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2242 imp_get_frozen_object(PyObject *self, PyObject *args)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2243 {
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2244 char *name;
3139
df07f28711fd Removed unused variables
Jack Jansen <jack.jansen@cwi.nl>
parents: 2891
diff changeset
2245
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2246 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2247 return NULL;
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2248 return get_frozen_object(name);
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2249 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2250
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2251 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2252 imp_is_builtin(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2253 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2254 char *name;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2255 if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2256 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2257 return PyInt_FromLong(is_builtin(name));
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2258 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
2259
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2260 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2261 imp_is_frozen(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2262 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2263 char *name;
8544
35a2151fb1c3 Ignore Windows case check for ALL CAPS 8.3 files
Guido van Rossum <guido@python.org>
parents: 8374
diff changeset
2264 struct _frozen *p;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2265 if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2266 return NULL;
8544
35a2151fb1c3 Ignore Windows case check for ALL CAPS 8.3 files
Guido van Rossum <guido@python.org>
parents: 8374
diff changeset
2267 p = find_frozen(name);
35a2151fb1c3 Ignore Windows case check for ALL CAPS 8.3 files
Guido van Rossum <guido@python.org>
parents: 8374
diff changeset
2268 return PyInt_FromLong((long) (p == NULL ? 0 : p->size));
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2269 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2270
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2271 static FILE *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2272 get_file(char *pathname, PyObject *fob, char *mode)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2273 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2274 FILE *fp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2275 if (fob == NULL) {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2276 fp = fopen(pathname, mode);
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2277 if (fp == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2278 PyErr_SetFromErrno(PyExc_IOError);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2279 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2280 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2281 fp = PyFile_AsFile(fob);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2282 if (fp == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2283 PyErr_SetString(PyExc_ValueError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2284 "bad/closed file object");
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2285 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2286 return fp;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2287 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2288
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2289 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2290 imp_load_compiled(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2291 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2292 char *name;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2293 char *pathname;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2294 PyObject *fob = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2295 PyObject *m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2296 FILE *fp;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2297 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2298 &PyFile_Type, &fob))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2299 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2300 fp = get_file(pathname, fob, "rb");
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2301 if (fp == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2302 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2303 m = load_compiled_module(name, pathname, fp);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2304 if (fob == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2305 fclose(fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2306 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2307 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2308
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2309 #ifdef HAVE_DYNAMIC_LOADING
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2310
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2311 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2312 imp_load_dynamic(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2313 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2314 char *name;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2315 char *pathname;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2316 PyObject *fob = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2317 PyObject *m;
2812
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
2318 FILE *fp = NULL;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2319 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2320 &PyFile_Type, &fob))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2321 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2322 if (fob) {
2812
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
2323 fp = get_file(pathname, fob, "r");
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2324 if (fp == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2325 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2326 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2327 m = _PyImport_LoadDynamicModule(name, pathname, fp);
2812
fb3daf9b2456 new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents: 2749
diff changeset
2328 return m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2329 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2330
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2331 #endif /* HAVE_DYNAMIC_LOADING */
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2332
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2333 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2334 imp_load_source(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2335 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2336 char *name;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2337 char *pathname;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2338 PyObject *fob = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2339 PyObject *m;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2340 FILE *fp;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2341 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2342 &PyFile_Type, &fob))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2343 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2344 fp = get_file(pathname, fob, "r");
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2345 if (fp == NULL)
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2346 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2347 m = load_source_module(name, pathname, fp);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2348 if (fob == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2349 fclose(fp);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2350 return m;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2351 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2352
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2353 #ifdef macintosh
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2354 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2355 imp_load_resource(PyObject *self, PyObject *args)
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2356 {
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2357 char *name;
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2358 char *pathname;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2359 PyObject *m;
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2360
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2361 if (!PyArg_ParseTuple(args, "ss:load_resource", &name, &pathname))
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2362 return NULL;
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2363 m = PyMac_LoadResourceModule(name, pathname);
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2364 return m;
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2365 }
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2366 #endif /* macintosh */
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2367
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2368 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2369 imp_load_module(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2370 {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2371 char *name;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2372 PyObject *fob;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2373 char *pathname;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2374 char *suffix; /* Unused */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2375 char *mode;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2376 int type;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2377 FILE *fp;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2378
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2379 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module",
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2380 &name, &fob, &pathname,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2381 &suffix, &mode, &type))
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2382 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2383 if (*mode && (*mode != 'r' || strchr(mode, '+') != NULL)) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2384 PyErr_Format(PyExc_ValueError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2385 "invalid file open mode %.200s", mode);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2386 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2387 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2388 if (fob == Py_None)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2389 fp = NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2390 else {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2391 if (!PyFile_Check(fob)) {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2392 PyErr_SetString(PyExc_ValueError,
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2393 "load_module arg#2 should be a file or None");
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2394 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2395 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2396 fp = get_file(pathname, fob, mode);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2397 if (fp == NULL)
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2398 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2399 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2400 return load_module(name, fp, pathname, type);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2401 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2402
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2403 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2404 imp_load_package(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2405 {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2406 char *name;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2407 char *pathname;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2408 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname))
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2409 return NULL;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2410 return load_package(name, pathname);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2411 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2412
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2413 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2414 imp_new_module(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2415 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2416 char *name;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11618
diff changeset
2417 if (!PyArg_ParseTuple(args, "s:new_module", &name))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2418 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2419 return PyModule_New(name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2420 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2421
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2422 /* Doc strings */
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2423
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2424 static char doc_imp[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2425 This module provides the components needed to build your own\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2426 __import__ function. Undocumented functions are obsolete.\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2427 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2428
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2429 static char doc_find_module[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2430 find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2431 Search for a module. If path is omitted or None, search for a\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2432 built-in, frozen or special module and continue search in sys.path.\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2433 The module name cannot contain '.'; to search for a submodule of a\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2434 package, pass the submodule name and the package's __path__.\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2435 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2436
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2437 static char doc_load_module[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2438 load_module(name, file, filename, (suffix, mode, type)) -> module\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2439 Load a module, given information returned by find_module().\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2440 The module name must include the full package name, if any.\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2441 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2442
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2443 static char doc_get_magic[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2444 get_magic() -> string\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2445 Return the magic number for .pyc or .pyo files.\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2446 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2447
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2448 static char doc_get_suffixes[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2449 get_suffixes() -> [(suffix, mode, type), ...]\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2450 Return a list of (suffix, mode, type) tuples describing the files\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2451 that find_module() looks for.\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2452 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2453
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2454 static char doc_new_module[] = "\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2455 new_module(name) -> module\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2456 Create a new module. Do not enter it in sys.modules.\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2457 The module name must include the full package name, if any.\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2458 ";
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2459
19596
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2460 static char doc_lock_held[] = "\
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2461 lock_held() -> 0 or 1\n\
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2462 Return 1 if the import lock is currently held.\n\
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2463 On platforms without threads, return 0.\
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2464 ";
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2465
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2466 static char doc_acquire_lock[] = "\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2467 acquire_lock() -> None\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2468 Acquires the interpreter's import lock for the current thread.\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2469 This lock should be used by import hooks to ensure thread-safety\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2470 when importing modules.\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2471 On platforms without threads, this function does nothing.";
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2472
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2473 static char doc_release_lock[] = "\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2474 release_lock() -> None\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2475 Release the interpreter's import lock.\n\
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2476 On platforms without threads, this function does nothing.";
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2477
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2478 static PyMethodDef imp_methods[] = {
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2479 {"find_module", imp_find_module, 1, doc_find_module},
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2480 {"get_magic", imp_get_magic, 1, doc_get_magic},
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2481 {"get_suffixes", imp_get_suffixes, 1, doc_get_suffixes},
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2482 {"load_module", imp_load_module, 1, doc_load_module},
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2483 {"new_module", imp_new_module, 1, doc_new_module},
19596
1be18ef869a4 Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents: 19238
diff changeset
2484 {"lock_held", imp_lock_held, 1, doc_lock_held},
27867
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2485 {"acquire_lock", imp_acquire_lock, 1, doc_acquire_lock},
e6cf9557de42 Backport 2.217 and 2.218:
Guido van Rossum <guido@python.org>
parents: 23623
diff changeset
2486 {"release_lock", imp_release_lock, 1, doc_release_lock},
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2487 /* The rest are obsolete */
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2488 {"get_frozen_object", imp_get_frozen_object, 1},
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2489 {"init_builtin", imp_init_builtin, 1},
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2490 {"init_frozen", imp_init_frozen, 1},
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2491 {"is_builtin", imp_is_builtin, 1},
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2492 {"is_frozen", imp_is_frozen, 1},
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2493 {"load_compiled", imp_load_compiled, 1},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2494 #ifdef HAVE_DYNAMIC_LOADING
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2495 {"load_dynamic", imp_load_dynamic, 1},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2496 #endif
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2497 {"load_package", imp_load_package, 1},
2349
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2498 #ifdef macintosh
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2499 {"load_resource", imp_load_resource, 1},
d65c485e0ad8 Added hooks to support importing pyc code from a resource on the mac.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2294
diff changeset
2500 #endif
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2501 {"load_source", imp_load_source, 1},
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2502 {NULL, NULL} /* sentinel */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2503 };
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2504
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8613
diff changeset
2505 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2506 setint(PyObject *d, char *name, int value)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2507 {
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2508 PyObject *v;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2509 int err;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2510
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2511 v = PyInt_FromLong((long)value);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2512 err = PyDict_SetItemString(d, name, v);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2513 Py_XDECREF(v);
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2514 return err;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2515 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2516
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2517 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2518 initimp(void)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2519 {
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2520 PyObject *m, *d;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2521
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2522 m = Py_InitModule4("imp", imp_methods, doc_imp,
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
2523 NULL, PYTHON_API_VERSION);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2524 d = PyModule_GetDict(m);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2525
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2526 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2527 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2528 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2529 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2530 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2531 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2532 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2533 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
8845
b933f584a26d Added handling for Mac code resource modules (Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
2534 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2535
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2536 failure:
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2537 ;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2538 }
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2539
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2540
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2541 /* API for embedding applications that want to add their own entries
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2542 to the table of built-in modules. This should normally be called
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2543 *before* Py_Initialize(). When the table resize fails, -1 is
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2544 returned and the existing table is unchanged.
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2545
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2546 After a similar function by Just van Rossum. */
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2547
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2548 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2549 PyImport_ExtendInittab(struct _inittab *newtab)
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2550 {
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2551 static struct _inittab *our_copy = NULL;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2552 struct _inittab *p;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2553 int i, n;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2554
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2555 /* Count the number of entries in both tables */
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2556 for (n = 0; newtab[n].name != NULL; n++)
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2557 ;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2558 if (n == 0)
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2559 return 0; /* Nothing to do */
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2560 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2561 ;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2562
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2563 /* Allocate new memory for the combined table */
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2564 p = our_copy;
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
2565 PyMem_RESIZE(p, struct _inittab, i+n+1);
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2566 if (p == NULL)
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2567 return -1;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2568
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2569 /* Copy the tables into the new memory */
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2570 if (our_copy != PyImport_Inittab)
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2571 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2572 PyImport_Inittab = our_copy = p;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2573 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab));
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2574
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2575 return 0;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2576 }
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2577
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2578 /* Shorthand to add a single entry given a name and a function */
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2579
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2580 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2581 PyImport_AppendInittab(char *name, void (*initfunc)(void))
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2582 {
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2583 struct _inittab newtab[2];
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2584
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2585 memset(newtab, '\0', sizeof newtab);
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2586
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2587 newtab[0].name = name;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2588 newtab[0].initfunc = initfunc;
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2589
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2590 return PyImport_ExtendInittab(newtab);
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
2591 }