Mercurial > cpython-lru_cache-weakref
annotate Mac/Tools/pythonw.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | b79d276041a8 |
| children |
| rev | line source |
|---|---|
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
1 /* |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
2 * This wrapper program executes a python executable hidden inside an |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
3 * application bundle inside the Python framework. This is needed to run |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
4 * GUI code: some GUI API's don't work unless the program is inside an |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
5 * application bundle. |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
6 * |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
7 * This program uses posix_spawn rather than plain execv because we need |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
8 * slightly more control over how the "real" interpreter is executed. |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
9 * |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
10 * On OSX 10.4 (and earlier) this falls back to using exec because the |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
11 * posix_spawnv functions aren't available there. |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
12 */ |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
13 |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
14 #pragma weak_import posix_spawnattr_init |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
15 #pragma weak_import posix_spawnattr_setbinpref_np |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
16 #pragma weak_import posix_spawnattr_setflags |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
17 #pragma weak_import posix_spawn |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
18 |
|
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
19 #include <Python.h> |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
20 #include <unistd.h> |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
21 #ifdef HAVE_SPAWN_H |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
22 #include <spawn.h> |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
23 #endif |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
24 #include <stdio.h> |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
25 #include <string.h> |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
26 #include <errno.h> |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
27 #include <err.h> |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
28 #include <dlfcn.h> |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
29 #include <stdlib.h> |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
30 #include <Python.h> |
|
78160
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
31 #include <mach-o/dyld.h> |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
32 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
33 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
34 extern char** environ; |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
35 |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
36 /* |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
37 * Locate the python framework by looking for the |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
38 * library that contains Py_Initialize. |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
39 * |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
40 * In a regular framework the structure is: |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
41 * |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
42 * Python.framework/Versions/2.7 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
43 * /Python |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
44 * /Resources/Python.app/Contents/MacOS/Python |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
45 * |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
46 * In a virtualenv style structure the expected |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
47 * structure is: |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
48 * |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
49 * ROOT |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
50 * /bin/pythonw |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
51 * /.Python <- the dylib |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
52 * /.Resources/Python.app/Contents/MacOS/Python |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
53 * |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
54 * NOTE: virtualenv's are not an officially supported |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
55 * feature, support for that structure is provided as |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
56 * a convenience. |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
57 */ |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
58 static char* get_python_path(void) |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
59 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
60 size_t len; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
61 Dl_info info; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
62 char* end; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
63 char* g_path; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
64 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
65 if (dladdr(Py_Initialize, &info) == 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
66 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
67 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
68 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
69 len = strlen(info.dli_fname); |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
70 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
71 g_path = malloc(len+60); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
72 if (g_path == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
73 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
74 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
75 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
76 strcpy(g_path, info.dli_fname); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
77 end = g_path + len - 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
78 while (end != g_path && *end != '/') { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
79 end --; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
80 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
81 end++; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
82 if (*end == '.') { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
83 end++; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
84 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
85 strcpy(end, "Resources/Python.app/Contents/MacOS/" PYTHONFRAMEWORK); |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
86 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
87 return g_path; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
88 } |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
89 |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
90 #ifdef HAVE_SPAWN_H |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
91 static void |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
92 setup_spawnattr(posix_spawnattr_t* spawnattr) |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
93 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
94 size_t ocount; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
95 size_t count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
96 cpu_type_t cpu_types[1]; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
97 short flags = 0; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
98 #ifdef __LP64__ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
99 int ch; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
100 #endif |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
101 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
102 if ((errno = posix_spawnattr_init(spawnattr)) != 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
103 err(2, "posix_spawnattr_int"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
104 /* NOTREACHTED */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
105 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
106 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
107 count = 1; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
108 |
|
68489
81d7f78a633a
#11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
62027
diff
changeset
|
109 /* Run the real python executable using the same architecture as this |
|
81d7f78a633a
#11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
62027
diff
changeset
|
110 * executable, this allows users to control the architecture using |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
111 * "arch -ppc python" |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
112 */ |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
113 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
114 #if defined(__ppc64__) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
115 cpu_types[0] = CPU_TYPE_POWERPC64; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
116 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
117 #elif defined(__x86_64__) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
118 cpu_types[0] = CPU_TYPE_X86_64; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
119 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
120 #elif defined(__ppc__) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
121 cpu_types[0] = CPU_TYPE_POWERPC; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
122 #elif defined(__i386__) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
123 cpu_types[0] = CPU_TYPE_X86; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
124 #else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
125 # error "Unknown CPU" |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
126 #endif |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
127 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
128 if (posix_spawnattr_setbinpref_np(spawnattr, count, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
129 cpu_types, &ocount) == -1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
130 err(1, "posix_spawnattr_setbinpref"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
131 /* NOTREACHTED */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
132 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
133 if (count != ocount) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
134 fprintf(stderr, "posix_spawnattr_setbinpref failed to copy\n"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
135 exit(1); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
136 /* NOTREACHTED */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
137 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
138 |
|
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
139 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
140 /* |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
141 * Set flag that causes posix_spawn to behave like execv |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
142 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
143 flags |= POSIX_SPAWN_SETEXEC; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
144 if ((errno = posix_spawnattr_setflags(spawnattr, flags)) != 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
145 err(1, "posix_spawnattr_setflags"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
146 /* NOTREACHTED */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
147 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
148 } |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
149 #endif |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
150 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
151 int |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
152 main(int argc, char **argv) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
153 char* exec_path = get_python_path(); |
|
77154
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
154 static char path[PATH_MAX * 2]; |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
155 static char real_path[PATH_MAX * 2]; |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
156 int status; |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
157 uint32_t size = PATH_MAX * 2; |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
158 |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
159 /* Set the original executable path in the environment. */ |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
160 status = _NSGetExecutablePath(path, &size); |
|
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
161 if (status == 0) { |
|
78160
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
162 /* |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
163 * Note: don't call 'realpath', that will |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
164 * erase symlink information, and that |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
165 * breaks "pyvenv --symlink" |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
166 * |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
167 * It is nice to have the directory name |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
168 * as a cleaned up absolute path though, |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
169 * therefore call realpath on dirname(path) |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
170 */ |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
171 char* slash = strrchr(path, '/'); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
172 if (slash) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
173 char replaced; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
174 replaced = slash[1]; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
175 slash[1] = 0; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
176 if (realpath(path, real_path) == NULL) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
177 err(1, "realpath: %s", path); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
178 } |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
179 slash[1] = replaced; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
180 if (strlcat(real_path, slash, sizeof(real_path)) > sizeof(real_path)) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
181 errno = EINVAL; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
182 err(1, "realpath: %s", path); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
183 } |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
184 |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
185 } else { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
186 if (realpath(".", real_path) == NULL) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
187 err(1, "realpath: %s", path); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
188 } |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
189 if (strlcat(real_path, "/", sizeof(real_path)) > sizeof(real_path)) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
190 errno = EINVAL; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
191 err(1, "realpath: %s", path); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
192 } |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
193 if (strlcat(real_path, path, sizeof(real_path)) > sizeof(real_path)) { |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
194 errno = EINVAL; |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
195 err(1, "realpath: %s", path); |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
196 } |
|
77154
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
197 } |
|
78160
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
198 |
|
b79d276041a8
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
77758
diff
changeset
|
199 setenv("__PYVENV_LAUNCHER__", real_path, 1); |
|
77154
294f8aeb4d4b
Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68489
diff
changeset
|
200 } |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
201 |
|
62027
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
202 /* |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
203 * Let argv[0] refer to the new interpreter. This is needed to |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
204 * get the effect we want on OSX 10.5 or earlier. That is, without |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
205 * changing argv[0] the real interpreter won't have access to |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
206 * the Window Server. |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
207 */ |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
208 argv[0] = exec_path; |
|
34a637bfd4be
Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
61466
diff
changeset
|
209 |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
210 #ifdef HAVE_SPAWN_H |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
211 /* We're weak-linking to posix-spawnv to ensure that |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
212 * an executable build on 10.5 can work on 10.4. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
213 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
214 if (posix_spawn != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
215 posix_spawnattr_t spawnattr = NULL; |
|
57914
94e957cfda38
Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
38673
diff
changeset
|
216 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
217 setup_spawnattr(&spawnattr); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
218 posix_spawn(NULL, exec_path, NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
219 &spawnattr, argv, environ); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
220 err(1, "posix_spawn: %s", exec_path); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
221 } |
|
58819
b834c8ee8e7c
Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
57914
diff
changeset
|
222 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
223 execve(exec_path, argv, environ); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
224 err(1, "execve: %s", argv[0]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60523
diff
changeset
|
225 /* NOTREACHED */ |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
226 } |
