annotate Python/frozenmain.c @ 76451:ea46ebba8a0f

Issue #13959: Re-implement imp.source_from_cache() in Lib/imp.py.
author Brett Cannon <brett@python.org>
date Sat, 21 Apr 2012 18:52:52 -0400
parents cab14be0ada1
children ab8121466785
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;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
19 int i, n, sts;
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;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
22 char *oldloc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
23 wchar_t **argv_copy = PyMem_Malloc(sizeof(wchar_t*)*argc);
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. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
25 wchar_t **argv_copy2 = PyMem_Malloc(sizeof(wchar_t*)*argc);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1396
diff changeset
26
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
27 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
28
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
29 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
30 inspect = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
31 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
32 unbuffered = 1;
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
33
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
34 if (unbuffered) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
35 setbuf(stdin, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
36 setbuf(stdout, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
37 setbuf(stderr, (char *)NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
38 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1396
diff changeset
39
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
40 if (!argv_copy) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
41 fprintf(stderr, "out of memory\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
42 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
43 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 24071
diff changeset
44
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
45 oldloc = setlocale(LC_ALL, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
46 setlocale(LC_ALL, "");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
47 for (i = 0; i < argc; i++) {
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
48 #ifdef HAVE_BROKEN_MBSTOWCS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
49 size_t argsize = strlen(argv[i]);
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
50 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
51 size_t argsize = mbstowcs(NULL, argv[i], 0);
48987
f83dccf417f0 Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.
Antoine Pitrou <solipsis@pitrou.net>
parents: 46318
diff changeset
52 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
53 size_t count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
54 if (argsize == (size_t)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
55 fprintf(stderr, "Could not convert argument %d to string\n", i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
56 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
57 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
58 argv_copy[i] = PyMem_Malloc((argsize+1)*sizeof(wchar_t));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
59 argv_copy2[i] = argv_copy[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
60 if (!argv_copy[i]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
61 fprintf(stderr, "out of memory\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
62 return 1;
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 count = mbstowcs(argv_copy[i], argv[i], argsize+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
65 if (count == (size_t)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
66 fprintf(stderr, "Could not convert argument %d to string\n", i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
67 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
68 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
69 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
70 setlocale(LC_ALL, oldloc);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 24071
diff changeset
71
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
72 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
73 PyInitFrozenExtensions();
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
74 #endif /* MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
75 Py_SetProgramName(argv_copy[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
76 Py_Initialize();
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
77 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
78 PyWinFreeze_ExeInit();
7846
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
79 #endif
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 if (Py_VerboseFlag)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
82 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
83 Py_GetVersion(), Py_GetCopyright());
5852
4a4778e61c14 Tracking changes to Py_Main():
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
84
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
85 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
86
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
87 n = PyImport_ImportFrozenModule("__main__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
88 if (n == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
89 Py_FatalError("__main__ not frozen");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
90 if (n < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
91 PyErr_Print();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
92 sts = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
93 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
94 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
95 sts = 0;
1318
92e6a8cf14be * pythonmain.c: -k option, usage message, more environment flags.
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
96
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
97 if (inspect && isatty((int)fileno(stdin)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
98 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
99
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
100 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
101 PyWinFreeze_ExeTerm();
7846
6c6a48bc5817 Make calls into ../PC/frozen_dllmain.c on MS_WIN32.
Guido van Rossum <guido@python.org>
parents: 7210
diff changeset
102 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
103 Py_Finalize();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
104 for (i = 0; i < argc; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
105 PyMem_Free(argv_copy2[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
106 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
107 PyMem_Free(argv_copy);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49467
diff changeset
108 PyMem_Free(argv_copy2);
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 }