Mercurial > cpython-lru_cache-weakref
annotate Python/frozenmain.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 | e408e821d6c8 |
| children |
| rev | line source |
|---|---|
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* Python interpreter main program for frozen scripts */ |
|
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
| 2624 | 4 #include "Python.h" |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
24071
diff
changeset
|
5 #include <locale.h> |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
7 #ifdef MS_WINDOWS |
|
13663
29da35543833
ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
8 extern void PyWinFreeze_ExeInit(void); |
|
29da35543833
ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
9 extern void PyWinFreeze_ExeTerm(void); |
|
29da35543833
ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
10 extern int PyInitFrozenExtensions(void); |
|
7846
6c6a48bc5817
Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents:
7210
diff
changeset
|
11 #endif |
|
6c6a48bc5817
Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents:
7210
diff
changeset
|
12 |
|
2892
33b154b6c61b
moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents:
2624
diff
changeset
|
13 /* Main program */ |
|
33b154b6c61b
moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents:
2624
diff
changeset
|
14 |
|
33b154b6c61b
moved stuff around to resemble main.c
Guido van Rossum <guido@python.org>
parents:
2624
diff
changeset
|
15 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
16 Py_FrozenMain(int argc, char **argv) |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
18 char *p; |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
19 int i, n, sts = 1; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
20 int inspect = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
21 int unbuffered = 0; |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
22 char *oldloc = NULL; |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
23 wchar_t **argv_copy = NULL; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
24 /* We need a second copies, as Python might modify the first one. */ |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
25 wchar_t **argv_copy2 = NULL; |
|
84857
ab8121466785
Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
61466
diff
changeset
|
26 |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
27 argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc); |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
28 argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc); |
|
84857
ab8121466785
Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
61466
diff
changeset
|
29 if (!argv_copy || !argv_copy2) { |
|
ab8121466785
Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
61466
diff
changeset
|
30 fprintf(stderr, "out of memory\n"); |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
31 goto error; |
|
84857
ab8121466785
Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
61466
diff
changeset
|
32 } |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1396
diff
changeset
|
33 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
34 Py_FrozenFlag = 1; /* Suppress errors from getpath.c */ |
|
7210
bccdeca81669
Set Py_FrozenFlag, to suppress error messages from getpath.c.
Guido van Rossum <guido@python.org>
parents:
7116
diff
changeset
|
35 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
36 if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
37 inspect = 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
38 if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
39 unbuffered = 1; |
|
1318
92e6a8cf14be
* pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents:
1270
diff
changeset
|
40 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
41 if (unbuffered) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
42 setbuf(stdin, (char *)NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
43 setbuf(stdout, (char *)NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
44 setbuf(stderr, (char *)NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
45 } |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1396
diff
changeset
|
46 |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
47 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
48 if (!oldloc) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
49 fprintf(stderr, "out of memory\n"); |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
50 goto error; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
51 } |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
24071
diff
changeset
|
52 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
53 setlocale(LC_ALL, ""); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
54 for (i = 0; i < argc; i++) { |
|
84860
0001c4100823
Py_FrozenMain() now uses _Py_char2wchar() to decode command line arguments, as
Victor Stinner <victor.stinner@gmail.com>
parents:
84859
diff
changeset
|
55 argv_copy[i] = _Py_char2wchar(argv[i], NULL); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
56 argv_copy2[i] = argv_copy[i]; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
57 if (!argv_copy[i]) { |
|
84860
0001c4100823
Py_FrozenMain() now uses _Py_char2wchar() to decode command line arguments, as
Victor Stinner <victor.stinner@gmail.com>
parents:
84859
diff
changeset
|
58 fprintf(stderr, "Unable to decode the command line argument #%i\n", |
|
0001c4100823
Py_FrozenMain() now uses _Py_char2wchar() to decode command line arguments, as
Victor Stinner <victor.stinner@gmail.com>
parents:
84859
diff
changeset
|
59 i + 1); |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
60 argc = i; |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
61 goto error; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
62 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
63 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
64 setlocale(LC_ALL, oldloc); |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
65 PyMem_RawFree(oldloc); |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
66 oldloc = NULL; |
|
46318
22a74eaf6b22
Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
24071
diff
changeset
|
67 |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
68 #ifdef MS_WINDOWS |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
69 PyInitFrozenExtensions(); |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
70 #endif /* MS_WINDOWS */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
71 Py_SetProgramName(argv_copy[0]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
72 Py_Initialize(); |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
73 #ifdef MS_WINDOWS |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
74 PyWinFreeze_ExeInit(); |
|
7846
6c6a48bc5817
Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents:
7210
diff
changeset
|
75 #endif |
|
5852
4a4778e61c14
Tracking changes to Py_Main():
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
76 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
77 if (Py_VerboseFlag) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
78 fprintf(stderr, "Python %s\n%s\n", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
79 Py_GetVersion(), Py_GetCopyright()); |
|
5852
4a4778e61c14
Tracking changes to Py_Main():
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
80 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
81 PySys_SetArgv(argc, argv_copy); |
|
1318
92e6a8cf14be
* pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents:
1270
diff
changeset
|
82 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
83 n = PyImport_ImportFrozenModule("__main__"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
84 if (n == 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
85 Py_FatalError("__main__ not frozen"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
86 if (n < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
87 PyErr_Print(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
88 sts = 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
89 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
90 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
91 sts = 0; |
|
1318
92e6a8cf14be
* pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents:
1270
diff
changeset
|
92 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
93 if (inspect && isatty((int)fileno(stdin))) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
94 sts = PyRun_AnyFile(stdin, "<stdin>") != 0; |
|
1318
92e6a8cf14be
* pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents:
1270
diff
changeset
|
95 |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
96 #ifdef MS_WINDOWS |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
97 PyWinFreeze_ExeTerm(); |
|
7846
6c6a48bc5817
Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents:
7210
diff
changeset
|
98 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
99 Py_Finalize(); |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
100 |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
101 error: |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
102 PyMem_RawFree(argv_copy); |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
103 if (argv_copy2) { |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
104 for (i = 0; i < argc; i++) |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
105 PyMem_RawFree(argv_copy2[i]); |
|
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
106 PyMem_RawFree(argv_copy2); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
107 } |
|
84861
47c6aa17fd90
Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents:
84860
diff
changeset
|
108 PyMem_RawFree(oldloc); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49467
diff
changeset
|
109 return sts; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 } |
