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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
6341a4c0082b renaming phase 3
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
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 }