annotate Modules/python.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 47c6aa17fd90
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Minimal main program -- everything is loaded from the library */
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
8894
764de731c806 Now include Python.h
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3 #include "Python.h"
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
4 #include <locale.h>
8894
764de731c806 Now include Python.h
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
5
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
6 #ifdef __FreeBSD__
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
7 #include <floatingpoint.h>
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
8 #endif
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
9
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
10 #ifdef MS_WINDOWS
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
11 int
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
12 wmain(int argc, wchar_t **argv)
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
13 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
14 return Py_Main(argc, argv);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
15 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
16 #else
53767
ac209f132b17 Issue #5915: Implement PEP 383, Non-decodable Bytes in
Martin v. Löwis <martin@v.loewis.de>
parents: 51902
diff changeset
17
6055
72d004971b26 Keep gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5853
diff changeset
18 int
13481
3abecb34737f - ANSI-fication
Fredrik Lundh <fredrik@pythonware.com>
parents: 9601
diff changeset
19 main(int argc, char **argv)
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 {
84857
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
21 wchar_t **argv_copy;
84530
c02656962b9c #18399: fix comment typo.
R David Murray <rdmurray@bitdance.com>
parents: 80703
diff changeset
22 /* We need a second copy, as Python might modify the first one. */
84857
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
23 wchar_t **argv_copy2;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
24 int i, res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
25 char *oldloc;
84708
4c1945554edb Fix a compiler warning on FreeBSD
Victor Stinner <victor.stinner@gmail.com>
parents: 84531
diff changeset
26 #ifdef __FreeBSD__
4c1945554edb Fix a compiler warning on FreeBSD
Victor Stinner <victor.stinner@gmail.com>
parents: 84531
diff changeset
27 fp_except_t m;
4c1945554edb Fix a compiler warning on FreeBSD
Victor Stinner <victor.stinner@gmail.com>
parents: 84531
diff changeset
28 #endif
84857
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
29
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
30 argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
31 argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
84857
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
32 if (!argv_copy || !argv_copy2) {
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
33 fprintf(stderr, "out of memory\n");
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
34 return 1;
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
35 }
ab8121466785 Issue #15893: frozenmain.c now handles PyMem_Malloc() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84530
diff changeset
36
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
37 /* 754 requires that FP exceptions run in "no stop" mode by default,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
38 * and until C vendors implement C99's ways to control FP exceptions,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
39 * Python requires non-stop mode. Alas, some platforms enable FP
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
40 * exceptions by default. Here we disable them.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
41 */
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
42 #ifdef __FreeBSD__
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
43 m = fpgetmask();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
44 fpsetmask(m & ~FP_X_OFL);
26815
8eccfae04bb4 Apparently FreeBSD enables some HW floating-point exceptions by default.
Tim Peters <tim.peters@gmail.com>
parents: 24471
diff changeset
45 #endif
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
46
84502
65f2c92ed079 Issue #18203: Add _PyMem_RawStrdup() and _PyMem_Strdup()
Victor Stinner <victor.stinner@gmail.com>
parents: 84490
diff changeset
47 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
84861
47c6aa17fd90 Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents: 84858
diff changeset
48 if (!oldloc) {
47c6aa17fd90 Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents: 84858
diff changeset
49 fprintf(stderr, "out of memory\n");
47c6aa17fd90 Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents: 84858
diff changeset
50 return 1;
47c6aa17fd90 Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents: 84858
diff changeset
51 }
47c6aa17fd90 Issue #15893: Improve error handling in main() and Py_FrozenMain()
Victor Stinner <victor.stinner@gmail.com>
parents: 84858
diff changeset
52
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
53 setlocale(LC_ALL, "");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
54 for (i = 0; i < argc; i++) {
65412
3794c9b50824 Add an optional size argument to _Py_char2wchar()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65277
diff changeset
55 argv_copy[i] = _Py_char2wchar(argv[i], NULL);
74000
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
56 if (!argv_copy[i]) {
84502
65f2c92ed079 Issue #18203: Add _PyMem_RawStrdup() and _PyMem_Strdup()
Victor Stinner <victor.stinner@gmail.com>
parents: 84490
diff changeset
57 PyMem_RawFree(oldloc);
74000
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
58 fprintf(stderr, "Fatal Python error: "
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
59 "unable to decode the command line argument #%i\n",
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
60 i + 1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
61 return 1;
74000
3b17210f34d9 main() now displays an error message before exiting if a command line argument
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
62 }
65277
49df778889e6 Revert r85435 (and r85440): decode command line arguments from utf-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65275
diff changeset
63 argv_copy2[i] = argv_copy[i];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
64 }
75944
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
65 argv_copy2[argc] = argv_copy[argc] = NULL;
c0900fd6e4b3 Issue #3367: NULL-terminate argv[] copies to prevent an invalid access
Stefan Krah <skrah@bytereef.org>
parents: 74000
diff changeset
66
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
67 setlocale(LC_ALL, oldloc);
84502
65f2c92ed079 Issue #18203: Add _PyMem_RawStrdup() and _PyMem_Strdup()
Victor Stinner <victor.stinner@gmail.com>
parents: 84490
diff changeset
68 PyMem_RawFree(oldloc);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
69 res = Py_Main(argc, argv_copy);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
70 for (i = 0; i < argc; i++) {
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
71 PyMem_RawFree(argv_copy2[i]);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
72 }
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
73 PyMem_RawFree(argv_copy);
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 80706
diff changeset
74 PyMem_RawFree(argv_copy2);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54427
diff changeset
75 return res;
5853
92bcf4cc9421 This is now the "real" main program -- it calls Py_Main(argc, argv)
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 26815
diff changeset
77 #endif