Mercurial > cpython-lru_cache-weakref
annotate Python/ceval.c @ 84172:e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
UnicodeDecodeError as ImportError. That was over-reaching the point of
raising ImportError in get_source() (which is to signal the source
code was not found when it should have). Conflating the two exceptions
with ImportError could lead to masking errors with the source which
should be known outside of whether there was an error simply getting
the source to begin with.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Sun, 16 Jun 2013 18:05:54 -0400 |
| parents | 8a0ed9f63c6e |
| children | ee9662d77ebb |
| rev | line source |
|---|---|
|
145
853b736a6a9e
Added copyright notice.
Guido van Rossum <guido@python.org>
parents:
119
diff
changeset
|
1 |
| 86 | 2 /* Execute compiled code */ |
| 69 | 3 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
4 /* XXX TO DO: |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
5 XXX speed up searching for keywords by using a dictionary |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
6 XXX document it! |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
7 */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
8 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
9 /* enable more aggressive intra-module optimizations, where available */ |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
10 #define PY_LOCAL_AGGRESSIVE |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
11 |
| 5368 | 12 #include "Python.h" |
| 86 | 13 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
14 #include "code.h" |
| 86 | 15 #include "frameobject.h" |
| 69 | 16 #include "opcode.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
17 #include "structmember.h" |
| 69 | 18 |
|
1400
aac8231a715c
* mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents:
1391
diff
changeset
|
19 #include <ctype.h> |
|
aac8231a715c
* mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents:
1391
diff
changeset
|
20 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
21 #ifndef WITH_TSC |
|
34442
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
22 |
|
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
23 #define READ_TIMESTAMP(var) |
|
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
24 |
|
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
25 #else |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
26 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
27 typedef unsigned long long uint64; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
28 |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
67414
diff
changeset
|
29 /* PowerPC support. |
|
67414
7e7fc94fd0d4
Merged revisions 87796 via svnmerge from
David Malcolm <dmalcolm@redhat.com>
parents:
62462
diff
changeset
|
30 "__ppc__" appears to be the preprocessor definition to detect on OS X, whereas |
|
7e7fc94fd0d4
Merged revisions 87796 via svnmerge from
David Malcolm <dmalcolm@redhat.com>
parents:
62462
diff
changeset
|
31 "__powerpc__" appears to be the correct one for Linux with GCC |
|
7e7fc94fd0d4
Merged revisions 87796 via svnmerge from
David Malcolm <dmalcolm@redhat.com>
parents:
62462
diff
changeset
|
32 */ |
|
7e7fc94fd0d4
Merged revisions 87796 via svnmerge from
David Malcolm <dmalcolm@redhat.com>
parents:
62462
diff
changeset
|
33 #if defined(__ppc__) || defined (__powerpc__) |
| 33104 | 34 |
|
34442
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
35 #define READ_TIMESTAMP(var) ppc_getcounter(&var) |
| 33104 | 36 |
| 37 static void | |
| 38 ppc_getcounter(uint64 *v) | |
| 39 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
40 register unsigned long tbu, tb, tbu2; |
| 33104 | 41 |
| 42 loop: | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
43 asm volatile ("mftbu %0" : "=r" (tbu) ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
44 asm volatile ("mftb %0" : "=r" (tb) ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
45 asm volatile ("mftbu %0" : "=r" (tbu2)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
46 if (__builtin_expect(tbu != tbu2, 0)) goto loop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
47 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
48 /* The slightly peculiar way of writing the next lines is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
49 compiled better by GCC than any other way I tried. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
50 ((long*)(v))[0] = tbu; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
51 ((long*)(v))[1] = tb; |
| 33104 | 52 } |
| 53 | |
|
57005
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
54 #elif defined(__i386__) |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
55 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
56 /* this is for linux/x86 (and probably any other GCC/x86 combo) */ |
|
34442
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
57 |
|
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
58 #define READ_TIMESTAMP(val) \ |
|
683719e04218
Change the name of the macro used by --with-tsc builds to the less
Michael W. Hudson <mwh@python.net>
parents:
34371
diff
changeset
|
59 __asm__ __volatile__("rdtsc" : "=A" (val)) |
| 33104 | 60 |
|
57005
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
61 #elif defined(__x86_64__) |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
62 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
63 /* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx; |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
64 not edx:eax as it does for i386. Since rdtsc puts its result in edx:eax |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
65 even in 64-bit mode, we need to use "a" and "d" for the lower and upper |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
66 32-bit pieces of the result. */ |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
67 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
68 #define READ_TIMESTAMP(val) \ |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
69 __asm__ __volatile__("rdtsc" : \ |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
70 "=a" (((int*)&(val))[0]), "=d" (((int*)&(val))[1])); |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
71 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
72 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
73 #else |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
74 |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
75 #error "Don't know how to implement timestamp counter for this architecture" |
|
264a735a8af7
Merged revisions 75984 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54459
diff
changeset
|
76 |
| 33104 | 77 #endif |
| 78 | |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
79 void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
80 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1) |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
81 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
82 uint64 intr, inst, loop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
83 PyThreadState *tstate = PyThreadState_Get(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
84 if (!tstate->interp->tscdump) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
85 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
86 intr = intr1 - intr0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
87 inst = inst1 - inst0 - intr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
88 loop = loop1 - loop0 - intr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
89 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n", |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
90 opcode, ticked, inst, loop); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
91 } |
| 33104 | 92 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
93 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
94 |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
95 /* Turn this on if your compiler chokes on the big switch: */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
96 /* #define CASE_TOO_BIG 1 */ |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
97 |
|
4839
4567e158d20c
Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents:
4667
diff
changeset
|
98 #ifdef Py_DEBUG |
| 567 | 99 /* For debugging the interpreter: */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
100 #define LLTRACE 1 /* Low-level trace feature */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
101 #define CHECKEXC 1 /* Double-check exception checking */ |
| 69 | 102 #endif |
| 103 | |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
104 typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *); |
|
1263
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
105 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
106 /* Forward declarations */ |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
107 #ifdef WITH_TSC |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
108 static PyObject * call_function(PyObject ***, int, uint64*, uint64*); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
109 #else |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
110 static PyObject * call_function(PyObject ***, int); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
111 #endif |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
112 static PyObject * fast_function(PyObject *, PyObject ***, int, int, int); |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
113 static PyObject * do_call(PyObject *, PyObject ***, int, int); |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
114 static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int); |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
115 static PyObject * update_keyword_args(PyObject *, int, PyObject ***, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
116 PyObject *); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
117 static PyObject * update_star_args(int, int, PyObject *, PyObject ***); |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
118 static PyObject * load_args(PyObject ***, int); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
119 #define CALL_FLAG_VAR 1 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
120 #define CALL_FLAG_KW 2 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
121 |
|
746
6c0f16008bd9
lint (added prototypes for all static fns)
Guido van Rossum <guido@python.org>
parents:
708
diff
changeset
|
122 #ifdef LLTRACE |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
123 static int lltrace; |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13256
diff
changeset
|
124 static int prtrace(PyObject *, char *); |
|
746
6c0f16008bd9
lint (added prototypes for all static fns)
Guido van Rossum <guido@python.org>
parents:
708
diff
changeset
|
125 #endif |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
126 static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
127 int, PyObject *); |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
128 static int call_trace_protected(Py_tracefunc, PyObject *, |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
129 PyFrameObject *, int, PyObject *); |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
130 static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *); |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
131 static int maybe_call_line_trace(Py_tracefunc, PyObject *, |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
132 PyFrameObject *, int *, int *, int *); |
| 24844 | 133 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
134 static PyObject * cmp_outcome(int, PyObject *, PyObject *); |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
135 static PyObject * import_from(PyObject *, PyObject *); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
136 static int import_all_from(PyObject *, PyObject *); |
| 42860 | 137 static void format_exc_check_arg(PyObject *, const char *, PyObject *); |
|
64620
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
138 static void format_exc_unbound(PyCodeObject *co, int oparg); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
139 static PyObject * unicode_concatenate(PyObject *, PyObject *, |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
140 PyFrameObject *, unsigned char *); |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
141 static PyObject * special_lookup(PyObject *, _Py_Identifier *); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
142 |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
143 #define NAME_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
144 "name '%.200s' is not defined" |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
145 #define UNBOUNDLOCAL_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
146 "local variable '%.200s' referenced before assignment" |
|
17494
a34293ced63b
Change error message raised when free variable is not yet bound. It
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17490
diff
changeset
|
147 #define UNBOUNDFREE_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
148 "free variable '%.200s' referenced before assignment" \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
149 " in enclosing scope" |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
150 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
151 /* Dynamic execution profile */ |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
152 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
153 #ifdef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
154 static long dxpairs[257][256]; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
155 #define dxp dxpairs[256] |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
156 #else |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
157 static long dxp[256]; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
158 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
159 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
160 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
161 /* Function call profile */ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
162 #ifdef CALL_PROFILE |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
163 #define PCALL_NUM 11 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
164 static int pcall[PCALL_NUM]; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
165 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
166 #define PCALL_ALL 0 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
167 #define PCALL_FUNCTION 1 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
168 #define PCALL_FAST_FUNCTION 2 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
169 #define PCALL_FASTER_FUNCTION 3 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
170 #define PCALL_METHOD 4 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
171 #define PCALL_BOUND_METHOD 5 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
172 #define PCALL_CFUNCTION 6 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
173 #define PCALL_TYPE 7 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
174 #define PCALL_GENERATOR 8 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
175 #define PCALL_OTHER 9 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
176 #define PCALL_POP 10 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
177 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
178 /* Notes about the statistics |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
179 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
180 PCALL_FAST stats |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
181 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
182 FAST_FUNCTION means no argument tuple needs to be created. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
183 FASTER_FUNCTION means that the fast-path frame setup code is used. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
184 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
185 If there is a method call where the call can be optimized by changing |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
186 the argument tuple and calling the function directly, it gets recorded |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
187 twice. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
188 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
189 As a result, the relationship among the statistics appears to be |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
190 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD + |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
191 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
192 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
193 PCALL_METHOD > PCALL_BOUND_METHOD |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
194 */ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
195 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
196 #define PCALL(POS) pcall[POS]++ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
197 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
198 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
199 PyEval_GetCallStats(PyObject *self) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
200 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
201 return Py_BuildValue("iiiiiiiiiii", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
202 pcall[0], pcall[1], pcall[2], pcall[3], |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
203 pcall[4], pcall[5], pcall[6], pcall[7], |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
204 pcall[8], pcall[9], pcall[10]); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
205 } |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
206 #else |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
207 #define PCALL(O) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
208 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
209 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
210 PyEval_GetCallStats(PyObject *self) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
211 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
212 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
213 return Py_None; |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
214 } |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
215 #endif |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
216 |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
217 |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
218 #ifdef WITH_THREAD |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
219 #define GIL_REQUEST _Py_atomic_load_relaxed(&gil_drop_request) |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
220 #else |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
221 #define GIL_REQUEST 0 |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
222 #endif |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
223 |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
224 /* This can set eval_breaker to 0 even though gil_drop_request became |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
225 1. We believe this is all right because the eval loop will release |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
226 the GIL eventually anyway. */ |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
227 #define COMPUTE_EVAL_BREAKER() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
228 _Py_atomic_store_relaxed( \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
229 &eval_breaker, \ |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
230 GIL_REQUEST | \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
231 _Py_atomic_load_relaxed(&pendingcalls_to_do) | \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
232 pending_async_exc) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
233 |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
234 #ifdef WITH_THREAD |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
235 |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
236 #define SET_GIL_DROP_REQUEST() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
237 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
238 _Py_atomic_store_relaxed(&gil_drop_request, 1); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
239 _Py_atomic_store_relaxed(&eval_breaker, 1); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
240 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
241 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
242 #define RESET_GIL_DROP_REQUEST() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
243 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
244 _Py_atomic_store_relaxed(&gil_drop_request, 0); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
245 COMPUTE_EVAL_BREAKER(); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
246 } while (0) |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
247 |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
248 #endif |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
249 |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
250 /* Pending calls are only modified under pending_lock */ |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
251 #define SIGNAL_PENDING_CALLS() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
252 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
253 _Py_atomic_store_relaxed(&pendingcalls_to_do, 1); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
254 _Py_atomic_store_relaxed(&eval_breaker, 1); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
255 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
256 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
257 #define UNSIGNAL_PENDING_CALLS() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
258 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
259 _Py_atomic_store_relaxed(&pendingcalls_to_do, 0); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
260 COMPUTE_EVAL_BREAKER(); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
261 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
262 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
263 #define SIGNAL_ASYNC_EXC() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
264 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
265 pending_async_exc = 1; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
266 _Py_atomic_store_relaxed(&eval_breaker, 1); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
267 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
268 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
269 #define UNSIGNAL_ASYNC_EXC() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
270 do { pending_async_exc = 0; COMPUTE_EVAL_BREAKER(); } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
271 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
272 |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
273 #ifdef WITH_THREAD |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
274 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
275 #ifdef HAVE_ERRNO_H |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
276 #include <errno.h> |
|
10530
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
10363
diff
changeset
|
277 #endif |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9048
diff
changeset
|
278 #include "pythread.h" |
| 926 | 279 |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
280 static PyThread_type_lock pending_lock = 0; /* for pending calls */ |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
281 static long main_thread = 0; |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
282 /* This single variable consolidates all requests to break out of the fast path |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
283 in the eval loop. */ |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
284 static _Py_atomic_int eval_breaker = {0}; |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
285 /* Request for dropping the GIL */ |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
286 static _Py_atomic_int gil_drop_request = {0}; |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
287 /* Request for running pending calls. */ |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
288 static _Py_atomic_int pendingcalls_to_do = {0}; |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
289 /* Request for looking at the `async_exc` field of the current thread state. |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
290 Guarded by the GIL. */ |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
291 static int pending_async_exc = 0; |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
292 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
293 #include "ceval_gil.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
294 |
|
33715
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
295 int |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
296 PyEval_ThreadsInitialized(void) |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
297 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
298 return gil_created(); |
|
33715
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
299 } |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
300 |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
301 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
302 PyEval_InitThreads(void) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
303 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
304 if (gil_created()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
305 return; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
306 create_gil(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
307 take_gil(PyThreadState_GET()); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
308 main_thread = PyThread_get_thread_ident(); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
309 if (!pending_lock) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
310 pending_lock = PyThread_allocate_lock(); |
| 926 | 311 } |
| 312 | |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
313 void |
|
64709
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
314 _PyEval_FiniThreads(void) |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
315 { |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
316 if (!gil_created()) |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
317 return; |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
318 destroy_gil(); |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
319 assert(!gil_created()); |
| 926 | 320 } |
| 321 | |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
322 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
323 PyEval_AcquireLock(void) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
324 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
325 PyThreadState *tstate = PyThreadState_GET(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
326 if (tstate == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
327 Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
328 take_gil(tstate); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
329 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
330 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
331 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
332 PyEval_ReleaseLock(void) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
333 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
334 /* This function must succeed when the current thread state is NULL. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
335 We therefore avoid PyThreadState_GET() which dumps a fatal error |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
336 in debug mode. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
337 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
338 drop_gil((PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
339 &_PyThreadState_Current)); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
340 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
341 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
342 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
343 PyEval_AcquireThread(PyThreadState *tstate) |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
344 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
345 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
346 Py_FatalError("PyEval_AcquireThread: NULL new thread state"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
347 /* Check someone has called PyEval_InitThreads() to create the lock */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
348 assert(gil_created()); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
349 take_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
350 if (PyThreadState_Swap(tstate) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
351 Py_FatalError( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
352 "PyEval_AcquireThread: non-NULL old thread state"); |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
353 } |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
354 |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
355 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
356 PyEval_ReleaseThread(PyThreadState *tstate) |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
357 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
358 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
359 Py_FatalError("PyEval_ReleaseThread: NULL thread state"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
360 if (PyThreadState_Swap(NULL) != tstate) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
361 Py_FatalError("PyEval_ReleaseThread: wrong thread state"); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
362 drop_gil(tstate); |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
363 } |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
364 |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
365 /* This function is called from PyOS_AfterFork to destroy all threads which are |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
366 * not running in the child process, and clear internal locks which might be |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
367 * held by those threads. (This could also be done using pthread_atfork |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
368 * mechanism, at least for the pthreads implementation.) */ |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
369 |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
370 void |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
371 PyEval_ReInitThreads(void) |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
372 { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
373 _Py_IDENTIFIER(_after_fork); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
374 PyObject *threading, *result; |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
375 PyThreadState *current_tstate = PyThreadState_GET(); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
376 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
377 if (!gil_created()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
378 return; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
379 recreate_gil(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
380 pending_lock = PyThread_allocate_lock(); |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
381 take_gil(current_tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
382 main_thread = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
383 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
384 /* Update the threading module with the new state. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
385 */ |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
386 threading = PyMapping_GetItemString(current_tstate->interp->modules, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
387 "threading"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
388 if (threading == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
389 /* threading not imported */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
390 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
391 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
392 } |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72605
diff
changeset
|
393 result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
394 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
395 PyErr_WriteUnraisable(threading); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
396 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
397 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
398 Py_DECREF(threading); |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
399 |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
400 /* Destroy all threads except the current one */ |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
83572
diff
changeset
|
401 _PyThreadState_DeleteExcept(current_tstate); |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
402 } |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
403 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
404 #else |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
405 static _Py_atomic_int eval_breaker = {0}; |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
406 static int pending_async_exc = 0; |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
407 #endif /* WITH_THREAD */ |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
408 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
409 /* This function is used to signal that async exceptions are waiting to be |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
410 raised, therefore it is also useful in non-threaded builds. */ |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
411 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
412 void |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
413 _PyEval_SignalAsyncExc(void) |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
414 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
415 SIGNAL_ASYNC_EXC(); |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
416 } |
| 926 | 417 |
| 418 /* Functions save_thread and restore_thread are always defined so | |
| 419 dynamically loaded modules needn't be compiled separately for use | |
| 420 with and without threads: */ | |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
421 |
|
5846
852a1fa62a7c
PyEval_SaveThread() and PyEval_RestoreThread() now return/take a
Guido van Rossum <guido@python.org>
parents:
5829
diff
changeset
|
422 PyThreadState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
423 PyEval_SaveThread(void) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
424 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
425 PyThreadState *tstate = PyThreadState_Swap(NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
426 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
427 Py_FatalError("PyEval_SaveThread: NULL tstate"); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
428 #ifdef WITH_THREAD |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
429 if (gil_created()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
430 drop_gil(tstate); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
431 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
432 return tstate; |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
433 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
434 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
435 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
436 PyEval_RestoreThread(PyThreadState *tstate) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
437 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
438 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
439 Py_FatalError("PyEval_RestoreThread: NULL tstate"); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
440 #ifdef WITH_THREAD |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
441 if (gil_created()) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
442 int err = errno; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
443 take_gil(tstate); |
|
69832
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
444 /* _Py_Finalizing is protected by the GIL */ |
|
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
445 if (_Py_Finalizing && tstate != _Py_Finalizing) { |
|
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
446 drop_gil(tstate); |
|
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
447 PyThread_exit_thread(); |
|
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
448 assert(0); /* unreachable */ |
|
2a19d09b08f8
Issue #1856: Avoid crashes and lockups when daemon threads run while the
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
449 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
450 errno = err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
451 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
452 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
453 PyThreadState_Swap(tstate); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
454 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
455 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
456 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
457 /* Mechanism whereby asynchronously executing callbacks (e.g. UNIX |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
458 signal handlers or Mac I/O completion routines) can schedule calls |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
459 to a function to be called synchronously. |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
460 The synchronous function is called with one void* argument. |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
461 It should return 0 for success or -1 for failure -- failure should |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
462 be accompanied by an exception. |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
463 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
464 If registry succeeds, the registry function returns 0; if it fails |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
465 (e.g. due to too many pending calls) it returns -1 (without setting |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
466 an exception condition). |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
467 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
468 Note that because registry may occur from within signal handlers, |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
469 or other asynchronous events, calling malloc() is unsafe! |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
470 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
471 #ifdef WITH_THREAD |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
472 Any thread can schedule pending calls, but only the main thread |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
473 will execute them. |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
474 There is no facility to schedule calls to a particular thread, but |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
475 that should be easy to change, should that ever be required. In |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
476 that case, the static variables here should go into the python |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
477 threadstate. |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
478 #endif |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
479 */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
480 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
481 #ifdef WITH_THREAD |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
482 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
483 /* The WITH_THREAD implementation is thread-safe. It allows |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
484 scheduling to be made from any thread, and even from an executing |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
485 callback. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
486 */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
487 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
488 #define NPENDINGCALLS 32 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
489 static struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
490 int (*func)(void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
491 void *arg; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
492 } pendingcalls[NPENDINGCALLS]; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
493 static int pendingfirst = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
494 static int pendinglast = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
495 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
496 int |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
497 Py_AddPendingCall(int (*func)(void *), void *arg) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
498 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
499 int i, j, result=0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
500 PyThread_type_lock lock = pending_lock; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
501 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
502 /* try a few times for the lock. Since this mechanism is used |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
503 * for signal handling (on the main thread), there is a (slim) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
504 * chance that a signal is delivered on the same thread while we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
505 * hold the lock during the Py_MakePendingCalls() function. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
506 * This avoids a deadlock in that case. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
507 * Note that signals can be delivered on any thread. In particular, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
508 * on Windows, a SIGINT is delivered on a system-created worker |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
509 * thread. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
510 * We also check for lock being NULL, in the unlikely case that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
511 * this function is called before any bytecode evaluation takes place. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
512 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
513 if (lock != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
514 for (i = 0; i<100; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
515 if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
516 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
517 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
518 if (i == 100) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
519 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
520 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
521 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
522 i = pendinglast; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
523 j = (i + 1) % NPENDINGCALLS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
524 if (j == pendingfirst) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
525 result = -1; /* Queue full */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
526 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
527 pendingcalls[i].func = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
528 pendingcalls[i].arg = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
529 pendinglast = j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
530 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
531 /* signal main loop */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
532 SIGNAL_PENDING_CALLS(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
533 if (lock != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
534 PyThread_release_lock(lock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
535 return result; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
536 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
537 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
538 int |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
539 Py_MakePendingCalls(void) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
540 { |
|
71481
cda93720c06d
Issue 12620: Make pendingbusy flag static to Py_MakePendingCalls().
Charles-François Natali <neologix@free.fr>
parents:
71402
diff
changeset
|
541 static int busy = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
542 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
543 int r = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
544 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
545 if (!pending_lock) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
546 /* initial allocation of the lock */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
547 pending_lock = PyThread_allocate_lock(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
548 if (pending_lock == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
549 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
550 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
551 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
552 /* only service pending calls on main thread */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
553 if (main_thread && PyThread_get_thread_ident() != main_thread) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
554 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
555 /* don't perform recursive pending calls */ |
|
71481
cda93720c06d
Issue 12620: Make pendingbusy flag static to Py_MakePendingCalls().
Charles-François Natali <neologix@free.fr>
parents:
71402
diff
changeset
|
556 if (busy) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
557 return 0; |
|
71481
cda93720c06d
Issue 12620: Make pendingbusy flag static to Py_MakePendingCalls().
Charles-François Natali <neologix@free.fr>
parents:
71402
diff
changeset
|
558 busy = 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
559 /* perform a bounded number of calls, in case of recursion */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
560 for (i=0; i<NPENDINGCALLS; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
561 int j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
562 int (*func)(void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
563 void *arg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
564 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
565 /* pop one item off the queue while holding the lock */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
566 PyThread_acquire_lock(pending_lock, WAIT_LOCK); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
567 j = pendingfirst; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
568 if (j == pendinglast) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
569 func = NULL; /* Queue empty */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
570 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
571 func = pendingcalls[j].func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
572 arg = pendingcalls[j].arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
573 pendingfirst = (j + 1) % NPENDINGCALLS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
574 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
575 if (pendingfirst != pendinglast) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
576 SIGNAL_PENDING_CALLS(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
577 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
578 UNSIGNAL_PENDING_CALLS(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
579 PyThread_release_lock(pending_lock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
580 /* having released the lock, perform the callback */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
581 if (func == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
582 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
583 r = func(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
584 if (r) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
585 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
586 } |
|
71481
cda93720c06d
Issue 12620: Make pendingbusy flag static to Py_MakePendingCalls().
Charles-François Natali <neologix@free.fr>
parents:
71402
diff
changeset
|
587 busy = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
588 return r; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
589 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
590 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
591 #else /* if ! defined WITH_THREAD */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
592 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
593 /* |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
594 WARNING! ASYNCHRONOUSLY EXECUTING CODE! |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
595 This code is used for signal handling in python that isn't built |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
596 with WITH_THREAD. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
597 Don't use this implementation when Py_AddPendingCalls() can happen |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
598 on a different thread! |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
599 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
600 There are two possible race conditions: |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
601 (1) nested asynchronous calls to Py_AddPendingCall() |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
602 (2) AddPendingCall() calls made while pending calls are being processed. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
603 |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
604 (1) is very unlikely because typically signal delivery |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
605 is blocked during signal handling. So it should be impossible. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
606 (2) is a real possibility. |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
607 The current code is safe against (2), but not against (1). |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
608 The safety against (2) is derived from the fact that only one |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
609 thread is present, interrupted by signals, and that the critical |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
610 section is protected with the "busy" variable. On Windows, which |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
611 delivers SIGINT on a system thread, this does not hold and therefore |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
612 Windows really shouldn't use this version. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
613 The two threads could theoretically wiggle around the "busy" variable. |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
614 */ |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
615 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
616 #define NPENDINGCALLS 32 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
617 static struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
618 int (*func)(void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
619 void *arg; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
620 } pendingcalls[NPENDINGCALLS]; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
621 static volatile int pendingfirst = 0; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
622 static volatile int pendinglast = 0; |
|
61993
e766c0d86cff
use atomic structures in non-thread version
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
623 static _Py_atomic_int pendingcalls_to_do = {0}; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
624 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
625 int |
|
13709
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
626 Py_AddPendingCall(int (*func)(void *), void *arg) |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
627 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
628 static volatile int busy = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
629 int i, j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
630 /* XXX Begin critical section */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
631 if (busy) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
632 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
633 busy = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
634 i = pendinglast; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
635 j = (i + 1) % NPENDINGCALLS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
636 if (j == pendingfirst) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
637 busy = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
638 return -1; /* Queue full */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
639 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
640 pendingcalls[i].func = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
641 pendingcalls[i].arg = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
642 pendinglast = j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
643 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
644 SIGNAL_PENDING_CALLS(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
645 busy = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
646 /* XXX End critical section */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
647 return 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
648 } |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
649 |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
650 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
651 Py_MakePendingCalls(void) |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
652 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
653 static int busy = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
654 if (busy) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
655 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
656 busy = 1; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
657 UNSIGNAL_PENDING_CALLS(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
658 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
659 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
660 int (*func)(void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
661 void *arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
662 i = pendingfirst; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
663 if (i == pendinglast) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
664 break; /* Queue empty */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
665 func = pendingcalls[i].func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
666 arg = pendingcalls[i].arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
667 pendingfirst = (i + 1) % NPENDINGCALLS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
668 if (func(arg) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
669 busy = 0; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
670 SIGNAL_PENDING_CALLS(); /* We're not done yet */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
671 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
672 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
673 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
674 busy = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
675 return 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
676 } |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
677 |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
678 #endif /* WITH_THREAD */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
679 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
680 |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
681 /* The interpreter's recursion limit */ |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
682 |
|
34863
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
683 #ifndef Py_DEFAULT_RECURSION_LIMIT |
|
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
684 #define Py_DEFAULT_RECURSION_LIMIT 1000 |
|
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
685 #endif |
|
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
686 static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT; |
|
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
687 int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
688 |
|
14348
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
689 int |
|
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
690 Py_GetRecursionLimit(void) |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
691 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
692 return recursion_limit; |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
693 } |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
694 |
|
14348
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
695 void |
|
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
696 Py_SetRecursionLimit(int new_limit) |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
697 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
698 recursion_limit = new_limit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
699 _Py_CheckRecursionLimit = recursion_limit; |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
700 } |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
701 |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
702 /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
703 if the recursion_depth reaches _Py_CheckRecursionLimit. |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
704 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
705 to guarantee that _Py_CheckRecursiveCall() is regularly called. |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
706 Without USE_STACKCHECK, there is no need for this. */ |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
707 int |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
708 _Py_CheckRecursiveCall(char *where) |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
709 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
710 PyThreadState *tstate = PyThreadState_GET(); |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
711 |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
712 #ifdef USE_STACKCHECK |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
713 if (PyOS_CheckStack()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
714 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
715 PyErr_SetString(PyExc_MemoryError, "Stack overflow"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
716 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
717 } |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
718 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
719 _Py_CheckRecursionLimit = recursion_limit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
720 if (tstate->recursion_critical) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
721 /* Somebody asked that we don't check for recursion. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
722 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
723 if (tstate->overflowed) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
724 if (tstate->recursion_depth > recursion_limit + 50) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
725 /* Overflowing while handling an overflow. Give up. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
726 Py_FatalError("Cannot recover from stack overflow."); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
727 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
728 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
729 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
730 if (tstate->recursion_depth > recursion_limit) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
731 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
732 tstate->overflowed = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
733 PyErr_Format(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
734 "maximum recursion depth exceeded%s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
735 where); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
736 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
737 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
738 return 0; |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
739 } |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
740 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
741 /* Status code for main loop (reason for stack unwind) */ |
|
31875
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
742 enum why_code { |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
743 WHY_NOT = 0x0001, /* No error */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
744 WHY_EXCEPTION = 0x0002, /* Exception occurred */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
745 WHY_RETURN = 0x0008, /* 'return' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
746 WHY_BREAK = 0x0010, /* 'break' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
747 WHY_CONTINUE = 0x0020, /* 'continue' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
748 WHY_YIELD = 0x0040, /* 'yield' operator */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
749 WHY_SILENCED = 0x0080 /* Exception silenced by 'with' */ |
|
31875
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
750 }; |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
751 |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
752 static void save_exc_state(PyThreadState *, PyFrameObject *); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
753 static void swap_exc_state(PyThreadState *, PyFrameObject *); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
754 static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *); |
| 79693 | 755 static int do_raise(PyObject *, PyObject *); |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
756 static int unpack_iterable(PyObject *, int, int, PyObject **); |
| 5018 | 757 |
|
50045
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
758 /* Records whether tracing is on for any thread. Counts the number of |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
759 threads for which tstate->c_tracefunc is non-NULL, so if the value |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
760 is 0, we know we don't have to check this thread's c_tracefunc. |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
761 This speeds up the if statement in PyEval_EvalFrameEx() after |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
762 fast_next_opcode*/ |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
763 static int _Py_TracingPossible = 0; |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
764 |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
765 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
766 |
| 5368 | 767 PyObject * |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
768 PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
769 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
770 return PyEval_EvalCodeEx(co, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
771 globals, locals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
772 (PyObject **)NULL, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
773 (PyObject **)NULL, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
774 (PyObject **)NULL, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
775 NULL, NULL); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
776 } |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
777 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
778 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
779 /* Interpreter main loop */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
780 |
|
32421
485d2ef43419
Patch #966493: Cleanup generator/eval_frame exposure.
Martin v. Löwis <martin@v.loewis.de>
parents:
32412
diff
changeset
|
781 PyObject * |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
782 PyEval_EvalFrame(PyFrameObject *f) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
783 /* This is for backward compatibility with extension modules that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
784 used this API; core interpreter code should call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
785 PyEval_EvalFrameEx() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
786 return PyEval_EvalFrameEx(f, 0); |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
787 } |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
788 |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
789 PyObject * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
790 PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
791 { |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
792 #ifdef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
793 int lastopcode = 0; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
794 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
795 register PyObject **stack_pointer; /* Next free slot in value stack */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
796 register unsigned char *next_instr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
797 register int opcode; /* Current opcode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
798 register int oparg; /* Current opcode argument, if any */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
799 register enum why_code why; /* Reason for block stack unwind */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
800 register PyObject **fastlocals, **freevars; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
801 PyObject *retval = NULL; /* Return value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
802 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
803 PyCodeObject *co; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
804 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
805 /* when tracing we set things up so that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
806 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
807 not (instr_lb <= current_bytecode_offset < instr_ub) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
808 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
809 is true when the line being executed has changed. The |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
810 initial values are such as to make this false the first |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
811 time it is tested. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
812 int instr_ub = -1, instr_lb = 0, instr_prev = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
813 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
814 unsigned char *first_instr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
815 PyObject *names; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
816 PyObject *consts; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
817 |
|
76072
bac033e488b4
Guard an LLTRACE variable to silence an unused variable warning.
Brett Cannon <brett@python.org>
parents:
75959
diff
changeset
|
818 #ifdef LLTRACE |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
819 _Py_IDENTIFIER(__ltrace__); |
|
76072
bac033e488b4
Guard an LLTRACE variable to silence an unused variable warning.
Brett Cannon <brett@python.org>
parents:
75959
diff
changeset
|
820 #endif |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
821 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
822 /* Computed GOTOs, or |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
823 the-optimization-commonly-but-improperly-known-as-"threaded code" |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
824 using gcc's labels-as-values extension |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
825 (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
826 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
827 The traditional bytecode evaluation loop uses a "switch" statement, which |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
828 decent compilers will optimize as a single indirect branch instruction |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
829 combined with a lookup table of jump addresses. However, since the |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
830 indirect jump instruction is shared by all opcodes, the CPU will have a |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
831 hard time making the right prediction for where to jump next (actually, |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
832 it will be always wrong except in the uncommon case of a sequence of |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
833 several identical opcodes). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
834 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
835 "Threaded code" in contrast, uses an explicit jump table and an explicit |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
836 indirect jump instruction at the end of each opcode. Since the jump |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
837 instruction is at a different address for each opcode, the CPU will make a |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
838 separate prediction for each of these instructions, which is equivalent to |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
839 predicting the second opcode of each opcode pair. These predictions have |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
840 a much better chance to turn out valid, especially in small bytecode loops. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
841 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
842 A mispredicted branch on a modern CPU flushes the whole pipeline and |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
843 can cost several CPU cycles (depending on the pipeline depth), |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
844 and potentially many more instructions (depending on the pipeline width). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
845 A correctly predicted branch, however, is nearly free. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
846 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
847 At the time of this writing, the "threaded code" version is up to 15-20% |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
848 faster than the normal "switch" version, depending on the compiler and the |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
849 CPU architecture. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
850 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
851 We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined, |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
852 because it would render the measurements invalid. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
853 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
854 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
855 NOTE: care must be taken that the compiler doesn't try to "optimize" the |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
856 indirect jumps by sharing them between all opcodes. Such optimizations |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
857 can be disabled on gcc by using the -fno-gcse flag (or possibly |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
858 -fno-crossjumping). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
859 */ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
860 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
861 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
862 #undef USE_COMPUTED_GOTOS |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
863 #define USE_COMPUTED_GOTOS 0 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
864 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
865 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
866 #ifdef HAVE_COMPUTED_GOTOS |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
867 #ifndef USE_COMPUTED_GOTOS |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
868 #define USE_COMPUTED_GOTOS 1 |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
869 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
870 #else |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
871 #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
872 #error "Computed gotos are not supported on this compiler." |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
873 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
874 #undef USE_COMPUTED_GOTOS |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
875 #define USE_COMPUTED_GOTOS 0 |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
876 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
877 |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
878 #if USE_COMPUTED_GOTOS |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
879 /* Import the static jump table */ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
880 #include "opcode_targets.h" |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
881 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
882 /* This macro is used when several opcodes defer to the same implementation |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
883 (e.g. SETUP_LOOP, SETUP_FINALLY) */ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
884 #define TARGET_WITH_IMPL(op, impl) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
885 TARGET_##op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
886 opcode = op; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
887 if (HAS_ARG(op)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
888 oparg = NEXTARG(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
889 case op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
890 goto impl; \ |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
891 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
892 #define TARGET(op) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
893 TARGET_##op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
894 opcode = op; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
895 if (HAS_ARG(op)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
896 oparg = NEXTARG(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
897 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
898 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
899 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
900 #define DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
901 { \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
902 if (!_Py_atomic_load_relaxed(&eval_breaker)) { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
903 FAST_DISPATCH(); \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
904 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
905 continue; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
906 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
907 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
908 #ifdef LLTRACE |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
909 #define FAST_DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
910 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
911 if (!lltrace && !_Py_TracingPossible) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
912 f->f_lasti = INSTR_OFFSET(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
913 goto *opcode_targets[*next_instr++]; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
914 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
915 goto fast_next_opcode; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
916 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
917 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
918 #define FAST_DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
919 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
920 if (!_Py_TracingPossible) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
921 f->f_lasti = INSTR_OFFSET(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
922 goto *opcode_targets[*next_instr++]; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
923 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
924 goto fast_next_opcode; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
925 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
926 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
927 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
928 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
929 #define TARGET(op) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
930 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
931 #define TARGET_WITH_IMPL(op, impl) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
932 /* silence compiler warnings about `impl` unused */ \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
933 if (0) goto impl; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
934 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
935 #define DISPATCH() continue |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
936 #define FAST_DISPATCH() goto fast_next_opcode |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
937 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
938 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
939 |
|
24232
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
940 /* Tuple access macros */ |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
941 |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
942 #ifndef Py_DEBUG |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
943 #define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i)) |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
944 #else |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
945 #define GETITEM(v, i) PyTuple_GetItem((v), (i)) |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
946 #endif |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
947 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
948 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
949 /* Use Pentium timestamp counter to mark certain events: |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
950 inst0 -- beginning of switch statement for opcode dispatch |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
951 inst1 -- end of switch statement (may be skipped) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
952 loop0 -- the top of the mainloop |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
953 loop1 -- place where control returns again to top of mainloop |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
954 (may be skipped) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
955 intr1 -- beginning of long interruption |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
956 intr2 -- end of long interruption |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
957 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
958 Many opcodes call out to helper C functions. In some cases, the |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
959 time in those functions should be counted towards the time for the |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
960 opcode, but not in all cases. For example, a CALL_FUNCTION opcode |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
961 calls another Python function; there's no point in charge all the |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
962 bytecode executed by the called function to the caller. |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
963 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
964 It's hard to make a useful judgement statically. In the presence |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
965 of operator overloading, it's impossible to tell if a call will |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
966 execute new Python code or not. |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
967 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
968 It's a case-by-case judgement. I'll use intr1 for the following |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
969 cases: |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
970 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
971 IMPORT_STAR |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
972 IMPORT_FROM |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
973 CALL_FUNCTION (and friends) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
974 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
975 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
976 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
977 int ticked = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
978 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
979 READ_TIMESTAMP(inst0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
980 READ_TIMESTAMP(inst1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
981 READ_TIMESTAMP(loop0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
982 READ_TIMESTAMP(loop1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
983 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
984 /* shut up the compiler */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
985 opcode = 0; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
986 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
987 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
988 /* Code access macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
989 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
990 #define INSTR_OFFSET() ((int)(next_instr - first_instr)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
991 #define NEXTOP() (*next_instr++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
992 #define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
993 #define PEEKARG() ((next_instr[2]<<8) + next_instr[1]) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
994 #define JUMPTO(x) (next_instr = first_instr + (x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
995 #define JUMPBY(x) (next_instr += (x)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
996 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
997 /* OpCode prediction macros |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
998 Some opcodes tend to come in pairs thus making it possible to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
999 predict the second code when the first is run. For example, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1000 COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1001 those opcodes are often followed by a POP_TOP. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1002 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1003 Verifying the prediction costs a single high-speed test of a register |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1004 variable against a constant. If the pairing was good, then the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1005 processor's own internal branch predication has a high likelihood of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1006 success, resulting in a nearly zero-overhead transition to the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1007 next opcode. A successful prediction saves a trip through the eval-loop |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1008 including its two unpredictable branches, the HAS_ARG test and the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1009 switch-case. Combined with the processor's internal branch prediction, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1010 a successful PREDICT has the effect of making the two opcodes run as if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1011 they were a single new opcode with the bodies combined. |
|
48494
aca5b2e6a66f
Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47729
diff
changeset
|
1012 |
|
aca5b2e6a66f
Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47729
diff
changeset
|
1013 If collecting opcode statistics, your choices are to either keep the |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1014 predictions turned-on and interpret the results as if some opcodes |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1015 had been combined or turn-off predictions so that the opcode frequency |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1016 counter updates for both opcodes. |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1017 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1018 Opcode prediction is disabled with threaded code, since the latter allows |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1019 the CPU to record separate branch prediction information for each |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1020 opcode. |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1021 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1022 */ |
|
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1023 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
1024 #if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1025 #define PREDICT(op) if (0) goto PRED_##op |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1026 #define PREDICTED(op) PRED_##op: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1027 #define PREDICTED_WITH_ARG(op) PRED_##op: |
|
31487
f57f5ce22c8d
SF patch #884022: dynamic execution profiling vs opcode prediction
Raymond Hettinger <python@rcn.com>
parents:
31462
diff
changeset
|
1028 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1029 #define PREDICT(op) if (*next_instr == op) goto PRED_##op |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1030 #define PREDICTED(op) PRED_##op: next_instr++ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1031 #define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1032 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1033 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1034 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1035 /* Stack manipulation macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1036 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
1037 /* The stack can grow at most MAXINT deep, as co_nlocals and |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
1038 co_stacksize are ints. */ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1039 #define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1040 #define EMPTY() (STACK_LEVEL() == 0) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1041 #define TOP() (stack_pointer[-1]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1042 #define SECOND() (stack_pointer[-2]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1043 #define THIRD() (stack_pointer[-3]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1044 #define FOURTH() (stack_pointer[-4]) |
|
62461
c8d5d1205fe8
Issue #8930: Remaining indentation fixes after the Grand Unified Indenting.
Stefan Krah <stefan@bytereef.org>
parents:
61993
diff
changeset
|
1045 #define PEEK(n) (stack_pointer[-(n)]) |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1046 #define SET_TOP(v) (stack_pointer[-1] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1047 #define SET_SECOND(v) (stack_pointer[-2] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1048 #define SET_THIRD(v) (stack_pointer[-3] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1049 #define SET_FOURTH(v) (stack_pointer[-4] = (v)) |
|
62461
c8d5d1205fe8
Issue #8930: Remaining indentation fixes after the Grand Unified Indenting.
Stefan Krah <stefan@bytereef.org>
parents:
61993
diff
changeset
|
1050 #define SET_VALUE(n, v) (stack_pointer[-(n)] = (v)) |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1051 #define BASIC_STACKADJ(n) (stack_pointer += n) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1052 #define BASIC_PUSH(v) (*stack_pointer++ = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1053 #define BASIC_POP() (*--stack_pointer) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1054 |
| 567 | 1055 #ifdef LLTRACE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1056 #define PUSH(v) { (void)(BASIC_PUSH(v), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1057 lltrace && prtrace(TOP(), "push")); \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1058 assert(STACK_LEVEL() <= co->co_stacksize); } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1059 #define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1060 BASIC_POP()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1061 #define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1062 lltrace && prtrace(TOP(), "stackadj")); \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1063 assert(STACK_LEVEL() <= co->co_stacksize); } |
|
44310
e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44187
diff
changeset
|
1064 #define EXT_POP(STACK_POINTER) ((void)(lltrace && \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1065 prtrace((STACK_POINTER)[-1], "ext_pop")), \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1066 *--(STACK_POINTER)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1067 #else |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1068 #define PUSH(v) BASIC_PUSH(v) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1069 #define POP() BASIC_POP() |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1070 #define STACKADJ(n) BASIC_STACKADJ(n) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
1071 #define EXT_POP(STACK_POINTER) (*--(STACK_POINTER)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1072 #endif |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1073 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1074 /* Local variable macros */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1075 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1076 #define GETLOCAL(i) (fastlocals[i]) |
|
22621
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1077 |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1078 /* The SETLOCAL() macro must not DECREF the local variable in-place and |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1079 then store the new value; it must copy the old value to a temporary |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1080 value, then store the new value, and then DECREF the temporary value. |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1081 This is because it is possible that during the DECREF the frame is |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1082 accessed by other code (e.g. a __del__ method or gc.collect()) and the |
|
830c829a7eb2
Fix an issue that was reported in but unrelated to the main problem of
Guido van Rossum <guido@python.org>
parents:
22499
diff
changeset
|
1083 variable would be pointing to already-freed memory. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1084 #define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1085 GETLOCAL(i) = value; \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1086 Py_XDECREF(tmp); } while (0) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1087 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1088 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1089 #define UNWIND_BLOCK(b) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1090 while (STACK_LEVEL() > (b)->b_level) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1091 PyObject *v = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1092 Py_XDECREF(v); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1093 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1094 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1095 #define UNWIND_EXCEPT_HANDLER(b) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1096 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1097 PyObject *type, *value, *traceback; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1098 assert(STACK_LEVEL() >= (b)->b_level + 3); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1099 while (STACK_LEVEL() > (b)->b_level + 3) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1100 value = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1101 Py_XDECREF(value); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1102 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1103 type = tstate->exc_type; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1104 value = tstate->exc_value; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1105 traceback = tstate->exc_traceback; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1106 tstate->exc_type = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1107 tstate->exc_value = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1108 tstate->exc_traceback = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1109 Py_XDECREF(type); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1110 Py_XDECREF(value); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1111 Py_XDECREF(traceback); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1112 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1113 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1114 /* Start of code */ |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1115 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1116 /* push frame */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1117 if (Py_EnterRecursiveCall("")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1118 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1119 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1120 tstate->frame = f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1121 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1122 if (tstate->use_tracing) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1123 if (tstate->c_tracefunc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1124 /* tstate->c_tracefunc, if defined, is a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1125 function that will be called on *every* entry |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1126 to a code block. Its return value, if not |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1127 None, is a function that will be called at |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1128 the start of each executed line of code. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1129 (Actually, the function must return itself |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1130 in order to continue tracing.) The trace |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1131 functions are called with three arguments: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1132 a pointer to the current frame, a string |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1133 indicating why the function is called, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1134 an argument which depends on the situation. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1135 The global trace function is also called |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1136 whenever an exception is detected. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1137 if (call_trace_protected(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1138 tstate->c_traceobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1139 f, PyTrace_CALL, Py_None)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1140 /* Trace function raised an error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1141 goto exit_eval_frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1142 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1143 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1144 if (tstate->c_profilefunc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1145 /* Similar for c_profilefunc, except it needn't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1146 return itself and isn't called for "line" events */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1147 if (call_trace_protected(tstate->c_profilefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1148 tstate->c_profileobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1149 f, PyTrace_CALL, Py_None)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1150 /* Profile function raised an error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1151 goto exit_eval_frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1152 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1153 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1154 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1155 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1156 co = f->f_code; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1157 names = co->co_names; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1158 consts = co->co_consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1159 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1160 freevars = f->f_localsplus + co->co_nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1161 first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1162 /* An explanation is in order for the next line. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1163 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1164 f->f_lasti now refers to the index of the last instruction |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1165 executed. You might think this was obvious from the name, but |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1166 this wasn't always true before 2.3! PyFrame_New now sets |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1167 f->f_lasti to -1 (i.e. the index *before* the first instruction) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1168 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1169 does work. Promise. |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1170 YIELD_FROM sets f_lasti to itself, in order to repeated yield |
|
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1171 multiple values. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1172 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1173 When the PREDICT() macros are enabled, some opcode pairs follow in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1174 direct succession without updating f->f_lasti. A successful |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1175 prediction effectively links the two codes together as if they |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1176 were a single new opcode; accordingly,f->f_lasti will point to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1177 the first code in the pair (for instance, GET_ITER followed by |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1178 FOR_ITER is effectively a single opcode and f->f_lasti will point |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1179 at to the beginning of the combined pair.) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1180 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1181 next_instr = first_instr + f->f_lasti + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1182 stack_pointer = f->f_stacktop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1183 assert(stack_pointer != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1184 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1185 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1186 if (co->co_flags & CO_GENERATOR && !throwflag) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1187 if (f->f_exc_type != NULL && f->f_exc_type != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1188 /* We were in an except handler when we left, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1189 restore the exception state which was put aside |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1190 (see YIELD_VALUE). */ |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1191 swap_exc_state(tstate, f); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1192 } |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1193 else |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1194 save_exc_state(tstate, f); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1195 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1196 |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
1197 #ifdef LLTRACE |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
1198 lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL; |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
1199 #endif |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1200 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1201 why = WHY_NOT; |
| 79693 | 1202 |
| 1203 if (throwflag) /* support for generator.throw() */ | |
| 1204 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1205 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1206 for (;;) { |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1207 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1208 if (inst1 == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1209 /* Almost surely, the opcode executed a break |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1210 or a continue, preventing inst1 from being set |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1211 on the way out of the loop. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1212 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1213 READ_TIMESTAMP(inst1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1214 loop1 = inst1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1216 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1217 intr0, intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1218 ticked = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1219 inst1 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1220 intr0 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1221 intr1 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1222 READ_TIMESTAMP(loop0); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1223 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1224 assert(stack_pointer >= f->f_valuestack); /* else underflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1225 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1226 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1227 /* Do periodic things. Doing this every time through |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1228 the loop would add too much overhead, so we do it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1229 only every Nth instruction. We also do it if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1230 ``pendingcalls_to_do'' is set, i.e. when an asynchronous |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1231 event needs attention (e.g. a signal handler or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1232 async I/O handler); see Py_AddPendingCall() and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1233 Py_MakePendingCalls() above. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1234 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1235 if (_Py_atomic_load_relaxed(&eval_breaker)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1236 if (*next_instr == SETUP_FINALLY) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1237 /* Make the last opcode before |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
67414
diff
changeset
|
1238 a try: finally: block uninterruptible. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1239 goto fast_next_opcode; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1240 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1241 tstate->tick_counter++; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1242 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1243 ticked = 1; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1244 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1245 if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) { |
| 79693 | 1246 if (Py_MakePendingCalls() < 0) |
| 1247 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1248 } |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1249 #ifdef WITH_THREAD |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1250 if (_Py_atomic_load_relaxed(&gil_drop_request)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1251 /* Give another thread a chance */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1252 if (PyThreadState_Swap(NULL) != tstate) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1253 Py_FatalError("ceval: tstate mix-up"); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1254 drop_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1255 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1256 /* Other threads may run now */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1257 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1258 take_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1259 if (PyThreadState_Swap(tstate) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1260 Py_FatalError("ceval: orphan tstate"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1261 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1262 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1263 /* Check for asynchronous exceptions. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1264 if (tstate->async_exc != NULL) { |
| 79693 | 1265 PyObject *exc = tstate->async_exc; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1266 tstate->async_exc = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1267 UNSIGNAL_ASYNC_EXC(); |
| 79693 | 1268 PyErr_SetNone(exc); |
| 1269 Py_DECREF(exc); | |
| 1270 goto error; | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1271 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1272 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1273 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1274 fast_next_opcode: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1275 f->f_lasti = INSTR_OFFSET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1276 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1277 /* line-by-line tracing support */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1278 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1279 if (_Py_TracingPossible && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1280 tstate->c_tracefunc != NULL && !tstate->tracing) { |
| 79693 | 1281 int err; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1282 /* see maybe_call_line_trace |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1283 for expository comments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1284 f->f_stacktop = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1285 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1286 err = maybe_call_line_trace(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1287 tstate->c_traceobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1288 f, &instr_lb, &instr_ub, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1289 &instr_prev); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1290 /* Reload possibly changed frame fields */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1291 JUMPTO(f->f_lasti); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1292 if (f->f_stacktop != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1293 stack_pointer = f->f_stacktop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1294 f->f_stacktop = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1295 } |
| 79693 | 1296 if (err) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1297 /* trace function raised an exception */ |
| 79693 | 1298 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1299 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1300 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1301 /* Extract opcode and argument */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1302 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1303 opcode = NEXTOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1304 oparg = 0; /* allows oparg to be stored in a register because |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1305 it doesn't have to be remembered across a full loop */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1306 if (HAS_ARG(opcode)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1307 oparg = NEXTARG(); |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1308 dispatch_opcode: |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1309 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1310 #ifdef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1311 dxpairs[lastopcode][opcode]++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1312 lastopcode = opcode; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1313 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1314 dxp[opcode]++; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1315 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1316 |
| 567 | 1317 #ifdef LLTRACE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1318 /* Instruction tracing */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1319 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1320 if (lltrace) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1321 if (HAS_ARG(opcode)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1322 printf("%d: %d, %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1323 f->f_lasti, opcode, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1324 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1325 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1326 printf("%d: %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1327 f->f_lasti, opcode); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1328 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1329 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1330 #endif |
| 24844 | 1331 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1332 /* Main switch on opcode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1333 READ_TIMESTAMP(inst0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1334 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1335 switch (opcode) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1336 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1337 /* BEWARE! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1338 It is essential that any operation that fails sets either |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1339 x to NULL, err to nonzero, or why to anything but WHY_NOT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1340 and that no operation that succeeds does this! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1341 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1342 TARGET(NOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1343 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1344 |
| 79693 | 1345 TARGET(LOAD_FAST) { |
| 1346 PyObject *value = GETLOCAL(oparg); | |
| 1347 if (value == NULL) { | |
| 1348 format_exc_check_arg(PyExc_UnboundLocalError, | |
| 1349 UNBOUNDLOCAL_ERROR_MSG, | |
| 1350 PyTuple_GetItem(co->co_varnames, oparg)); | |
| 1351 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1352 } |
| 79693 | 1353 Py_INCREF(value); |
| 1354 PUSH(value); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1355 FAST_DISPATCH(); |
| 79693 | 1356 } |
| 1357 | |
| 1358 TARGET(LOAD_CONST) { | |
| 1359 PyObject *value = GETITEM(consts, oparg); | |
| 1360 Py_INCREF(value); | |
| 1361 PUSH(value); | |
| 1362 FAST_DISPATCH(); | |
| 1363 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1364 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1365 PREDICTED_WITH_ARG(STORE_FAST); |
| 79693 | 1366 TARGET(STORE_FAST) { |
| 1367 PyObject *value = POP(); | |
| 1368 SETLOCAL(oparg, value); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1369 FAST_DISPATCH(); |
| 79693 | 1370 } |
| 1371 | |
| 1372 TARGET(POP_TOP) { | |
| 1373 PyObject *value = POP(); | |
| 1374 Py_DECREF(value); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1375 FAST_DISPATCH(); |
| 79693 | 1376 } |
| 1377 | |
| 1378 TARGET(ROT_TWO) { | |
| 1379 PyObject *top = TOP(); | |
| 1380 PyObject *second = SECOND(); | |
| 1381 SET_TOP(second); | |
| 1382 SET_SECOND(top); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1383 FAST_DISPATCH(); |
| 79693 | 1384 } |
| 1385 | |
| 1386 TARGET(ROT_THREE) { | |
| 1387 PyObject *top = TOP(); | |
| 1388 PyObject *second = SECOND(); | |
| 1389 PyObject *third = THIRD(); | |
| 1390 SET_TOP(second); | |
| 1391 SET_SECOND(third); | |
| 1392 SET_THIRD(top); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1393 FAST_DISPATCH(); |
| 79693 | 1394 } |
| 1395 | |
| 1396 TARGET(DUP_TOP) { | |
| 1397 PyObject *top = TOP(); | |
| 1398 Py_INCREF(top); | |
| 1399 PUSH(top); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1400 FAST_DISPATCH(); |
| 79693 | 1401 } |
| 1402 | |
| 1403 TARGET(DUP_TOP_TWO) { | |
| 1404 PyObject *top = TOP(); | |
|
79694
6ca52f901fc1
move declaration to top of block
Benjamin Peterson <benjamin@python.org>
parents:
79693
diff
changeset
|
1405 PyObject *second = SECOND(); |
| 79693 | 1406 Py_INCREF(top); |
| 1407 Py_INCREF(second); | |
|
64439
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1408 STACKADJ(2); |
| 79693 | 1409 SET_TOP(top); |
| 1410 SET_SECOND(second); | |
|
64439
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1411 FAST_DISPATCH(); |
| 79693 | 1412 } |
| 1413 | |
| 1414 TARGET(UNARY_POSITIVE) { | |
| 1415 PyObject *value = TOP(); | |
| 1416 PyObject *res = PyNumber_Positive(value); | |
| 1417 Py_DECREF(value); | |
| 1418 SET_TOP(res); | |
| 1419 if (res == NULL) | |
| 1420 goto error; | |
| 1421 DISPATCH(); | |
| 1422 } | |
| 1423 | |
| 1424 TARGET(UNARY_NEGATIVE) { | |
| 1425 PyObject *value = TOP(); | |
| 1426 PyObject *res = PyNumber_Negative(value); | |
| 1427 Py_DECREF(value); | |
| 1428 SET_TOP(res); | |
| 1429 if (res == NULL) | |
| 1430 goto error; | |
| 1431 DISPATCH(); | |
| 1432 } | |
| 1433 | |
| 1434 TARGET(UNARY_NOT) { | |
| 1435 PyObject *value = TOP(); | |
| 1436 int err = PyObject_IsTrue(value); | |
| 1437 Py_DECREF(value); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1438 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1439 Py_INCREF(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1440 SET_TOP(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1441 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1442 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1443 else if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1444 Py_INCREF(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1445 SET_TOP(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1446 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1447 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1448 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1449 STACKADJ(-1); |
| 79693 | 1450 goto error; |
| 1451 } | |
| 1452 | |
| 1453 TARGET(UNARY_INVERT) { | |
| 1454 PyObject *value = TOP(); | |
| 1455 PyObject *res = PyNumber_Invert(value); | |
| 1456 Py_DECREF(value); | |
| 1457 SET_TOP(res); | |
| 1458 if (res == NULL) | |
| 1459 goto error; | |
| 1460 DISPATCH(); | |
| 1461 } | |
| 1462 | |
| 1463 TARGET(BINARY_POWER) { | |
| 1464 PyObject *exp = POP(); | |
| 1465 PyObject *base = TOP(); | |
| 1466 PyObject *res = PyNumber_Power(base, exp, Py_None); | |
| 1467 Py_DECREF(base); | |
| 1468 Py_DECREF(exp); | |
| 1469 SET_TOP(res); | |
| 1470 if (res == NULL) | |
| 1471 goto error; | |
| 1472 DISPATCH(); | |
| 1473 } | |
| 1474 | |
| 1475 TARGET(BINARY_MULTIPLY) { | |
| 1476 PyObject *right = POP(); | |
| 1477 PyObject *left = TOP(); | |
| 1478 PyObject *res = PyNumber_Multiply(left, right); | |
| 1479 Py_DECREF(left); | |
| 1480 Py_DECREF(right); | |
| 1481 SET_TOP(res); | |
| 1482 if (res == NULL) | |
| 1483 goto error; | |
| 1484 DISPATCH(); | |
| 1485 } | |
| 1486 | |
| 1487 TARGET(BINARY_TRUE_DIVIDE) { | |
| 1488 PyObject *divisor = POP(); | |
| 1489 PyObject *dividend = TOP(); | |
| 1490 PyObject *quotient = PyNumber_TrueDivide(dividend, divisor); | |
| 1491 Py_DECREF(dividend); | |
| 1492 Py_DECREF(divisor); | |
| 1493 SET_TOP(quotient); | |
| 1494 if (quotient == NULL) | |
| 1495 goto error; | |
| 1496 DISPATCH(); | |
| 1497 } | |
| 1498 | |
| 1499 TARGET(BINARY_FLOOR_DIVIDE) { | |
| 1500 PyObject *divisor = POP(); | |
| 1501 PyObject *dividend = TOP(); | |
| 1502 PyObject *quotient = PyNumber_FloorDivide(dividend, divisor); | |
| 1503 Py_DECREF(dividend); | |
| 1504 Py_DECREF(divisor); | |
| 1505 SET_TOP(quotient); | |
| 1506 if (quotient == NULL) | |
| 1507 goto error; | |
| 1508 DISPATCH(); | |
| 1509 } | |
| 1510 | |
| 1511 TARGET(BINARY_MODULO) { | |
| 1512 PyObject *divisor = POP(); | |
| 1513 PyObject *dividend = TOP(); | |
| 1514 PyObject *res = PyUnicode_CheckExact(dividend) ? | |
| 1515 PyUnicode_Format(dividend, divisor) : | |
| 1516 PyNumber_Remainder(dividend, divisor); | |
| 1517 Py_DECREF(divisor); | |
| 1518 Py_DECREF(dividend); | |
| 1519 SET_TOP(res); | |
| 1520 if (res == NULL) | |
| 1521 goto error; | |
| 1522 DISPATCH(); | |
| 1523 } | |
| 1524 | |
| 1525 TARGET(BINARY_ADD) { | |
| 1526 PyObject *right = POP(); | |
| 1527 PyObject *left = TOP(); | |
| 1528 PyObject *sum; | |
| 1529 if (PyUnicode_CheckExact(left) && | |
| 1530 PyUnicode_CheckExact(right)) { | |
| 1531 sum = unicode_concatenate(left, right, f, next_instr); | |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1532 /* unicode_concatenate consumed the ref to v */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1533 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1534 else { |
| 79693 | 1535 sum = PyNumber_Add(left, right); |
| 1536 Py_DECREF(left); | |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1537 } |
| 79693 | 1538 Py_DECREF(right); |
| 1539 SET_TOP(sum); | |
| 1540 if (sum == NULL) | |
| 1541 goto error; | |
| 1542 DISPATCH(); | |
| 1543 } | |
| 1544 | |
| 1545 TARGET(BINARY_SUBTRACT) { | |
| 1546 PyObject *right = POP(); | |
| 1547 PyObject *left = TOP(); | |
| 1548 PyObject *diff = PyNumber_Subtract(left, right); | |
| 1549 Py_DECREF(right); | |
| 1550 Py_DECREF(left); | |
| 1551 SET_TOP(diff); | |
| 1552 if (diff == NULL) | |
| 1553 goto error; | |
| 1554 DISPATCH(); | |
| 1555 } | |
| 1556 | |
| 1557 TARGET(BINARY_SUBSCR) { | |
| 1558 PyObject *sub = POP(); | |
| 1559 PyObject *container = TOP(); | |
| 1560 PyObject *res = PyObject_GetItem(container, sub); | |
| 1561 Py_DECREF(container); | |
| 1562 Py_DECREF(sub); | |
| 1563 SET_TOP(res); | |
| 1564 if (res == NULL) | |
| 1565 goto error; | |
| 1566 DISPATCH(); | |
| 1567 } | |
| 1568 | |
| 1569 TARGET(BINARY_LSHIFT) { | |
| 1570 PyObject *right = POP(); | |
| 1571 PyObject *left = TOP(); | |
| 1572 PyObject *res = PyNumber_Lshift(left, right); | |
| 1573 Py_DECREF(left); | |
| 1574 Py_DECREF(right); | |
| 1575 SET_TOP(res); | |
| 1576 if (res == NULL) | |
| 1577 goto error; | |
| 1578 DISPATCH(); | |
| 1579 } | |
| 1580 | |
| 1581 TARGET(BINARY_RSHIFT) { | |
| 1582 PyObject *right = POP(); | |
| 1583 PyObject *left = TOP(); | |
| 1584 PyObject *res = PyNumber_Rshift(left, right); | |
| 1585 Py_DECREF(left); | |
| 1586 Py_DECREF(right); | |
| 1587 SET_TOP(res); | |
| 1588 if (res == NULL) | |
| 1589 goto error; | |
| 1590 DISPATCH(); | |
| 1591 } | |
| 1592 | |
| 1593 TARGET(BINARY_AND) { | |
| 1594 PyObject *right = POP(); | |
| 1595 PyObject *left = TOP(); | |
| 1596 PyObject *res = PyNumber_And(left, right); | |
| 1597 Py_DECREF(left); | |
| 1598 Py_DECREF(right); | |
| 1599 SET_TOP(res); | |
| 1600 if (res == NULL) | |
| 1601 goto error; | |
| 1602 DISPATCH(); | |
| 1603 } | |
| 1604 | |
| 1605 TARGET(BINARY_XOR) { | |
| 1606 PyObject *right = POP(); | |
| 1607 PyObject *left = TOP(); | |
| 1608 PyObject *res = PyNumber_Xor(left, right); | |
| 1609 Py_DECREF(left); | |
| 1610 Py_DECREF(right); | |
| 1611 SET_TOP(res); | |
| 1612 if (res == NULL) | |
| 1613 goto error; | |
| 1614 DISPATCH(); | |
| 1615 } | |
| 1616 | |
| 1617 TARGET(BINARY_OR) { | |
| 1618 PyObject *right = POP(); | |
| 1619 PyObject *left = TOP(); | |
| 1620 PyObject *res = PyNumber_Or(left, right); | |
| 1621 Py_DECREF(left); | |
| 1622 Py_DECREF(right); | |
| 1623 SET_TOP(res); | |
| 1624 if (res == NULL) | |
| 1625 goto error; | |
| 1626 DISPATCH(); | |
| 1627 } | |
| 1628 | |
| 1629 TARGET(LIST_APPEND) { | |
| 1630 PyObject *v = POP(); | |
| 1631 PyObject *list = PEEK(oparg); | |
| 1632 int err; | |
| 1633 err = PyList_Append(list, v); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1634 Py_DECREF(v); |
| 79693 | 1635 if (err != 0) |
| 1636 goto error; | |
| 1637 PREDICT(JUMP_ABSOLUTE); | |
| 1638 DISPATCH(); | |
| 1639 } | |
| 1640 | |
| 1641 TARGET(SET_ADD) { | |
| 1642 PyObject *v = POP(); | |
| 1643 PyObject *set = stack_pointer[-oparg]; | |
| 1644 int err; | |
| 1645 err = PySet_Add(set, v); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1646 Py_DECREF(v); |
| 79693 | 1647 if (err != 0) |
| 1648 goto error; | |
| 1649 PREDICT(JUMP_ABSOLUTE); | |
| 1650 DISPATCH(); | |
| 1651 } | |
| 1652 | |
| 1653 TARGET(INPLACE_POWER) { | |
| 1654 PyObject *exp = POP(); | |
| 1655 PyObject *base = TOP(); | |
| 1656 PyObject *res = PyNumber_InPlacePower(base, exp, Py_None); | |
| 1657 Py_DECREF(base); | |
| 1658 Py_DECREF(exp); | |
| 1659 SET_TOP(res); | |
| 1660 if (res == NULL) | |
| 1661 goto error; | |
| 1662 DISPATCH(); | |
| 1663 } | |
| 1664 | |
| 1665 TARGET(INPLACE_MULTIPLY) { | |
| 1666 PyObject *right = POP(); | |
| 1667 PyObject *left = TOP(); | |
| 1668 PyObject *res = PyNumber_InPlaceMultiply(left, right); | |
| 1669 Py_DECREF(left); | |
| 1670 Py_DECREF(right); | |
| 1671 SET_TOP(res); | |
| 1672 if (res == NULL) | |
| 1673 goto error; | |
| 1674 DISPATCH(); | |
| 1675 } | |
| 1676 | |
| 1677 TARGET(INPLACE_TRUE_DIVIDE) { | |
| 1678 PyObject *divisor = POP(); | |
| 1679 PyObject *dividend = TOP(); | |
| 1680 PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor); | |
| 1681 Py_DECREF(dividend); | |
| 1682 Py_DECREF(divisor); | |
| 1683 SET_TOP(quotient); | |
| 1684 if (quotient == NULL) | |
| 1685 goto error; | |
| 1686 DISPATCH(); | |
| 1687 } | |
| 1688 | |
| 1689 TARGET(INPLACE_FLOOR_DIVIDE) { | |
| 1690 PyObject *divisor = POP(); | |
| 1691 PyObject *dividend = TOP(); | |
| 1692 PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor); | |
| 1693 Py_DECREF(dividend); | |
| 1694 Py_DECREF(divisor); | |
| 1695 SET_TOP(quotient); | |
| 1696 if (quotient == NULL) | |
| 1697 goto error; | |
| 1698 DISPATCH(); | |
| 1699 } | |
| 1700 | |
| 1701 TARGET(INPLACE_MODULO) { | |
| 1702 PyObject *right = POP(); | |
| 1703 PyObject *left = TOP(); | |
| 1704 PyObject *mod = PyNumber_InPlaceRemainder(left, right); | |
| 1705 Py_DECREF(left); | |
| 1706 Py_DECREF(right); | |
| 1707 SET_TOP(mod); | |
| 1708 if (mod == NULL) | |
| 1709 goto error; | |
| 1710 DISPATCH(); | |
| 1711 } | |
| 1712 | |
| 1713 TARGET(INPLACE_ADD) { | |
| 1714 PyObject *right = POP(); | |
| 1715 PyObject *left = TOP(); | |
| 1716 PyObject *sum; | |
| 1717 if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) { | |
| 1718 sum = unicode_concatenate(left, right, f, next_instr); | |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1719 /* unicode_concatenate consumed the ref to v */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1720 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1721 else { |
| 79693 | 1722 sum = PyNumber_InPlaceAdd(left, right); |
| 1723 Py_DECREF(left); | |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1724 } |
| 79693 | 1725 Py_DECREF(right); |
| 1726 SET_TOP(sum); | |
| 1727 if (sum == NULL) | |
| 1728 goto error; | |
| 1729 DISPATCH(); | |
| 1730 } | |
| 1731 | |
| 1732 TARGET(INPLACE_SUBTRACT) { | |
| 1733 PyObject *right = POP(); | |
| 1734 PyObject *left = TOP(); | |
| 1735 PyObject *diff = PyNumber_InPlaceSubtract(left, right); | |
| 1736 Py_DECREF(left); | |
| 1737 Py_DECREF(right); | |
| 1738 SET_TOP(diff); | |
| 1739 if (diff == NULL) | |
| 1740 goto error; | |
| 1741 DISPATCH(); | |
| 1742 } | |
| 1743 | |
| 1744 TARGET(INPLACE_LSHIFT) { | |
| 1745 PyObject *right = POP(); | |
| 1746 PyObject *left = TOP(); | |
| 1747 PyObject *res = PyNumber_InPlaceLshift(left, right); | |
| 1748 Py_DECREF(left); | |
| 1749 Py_DECREF(right); | |
| 1750 SET_TOP(res); | |
| 1751 if (res == NULL) | |
| 1752 goto error; | |
| 1753 DISPATCH(); | |
| 1754 } | |
| 1755 | |
| 1756 TARGET(INPLACE_RSHIFT) { | |
| 1757 PyObject *right = POP(); | |
| 1758 PyObject *left = TOP(); | |
| 1759 PyObject *res = PyNumber_InPlaceRshift(left, right); | |
| 1760 Py_DECREF(left); | |
| 1761 Py_DECREF(right); | |
| 1762 SET_TOP(res); | |
| 1763 if (res == NULL) | |
| 1764 goto error; | |
| 1765 DISPATCH(); | |
| 1766 } | |
| 1767 | |
| 1768 TARGET(INPLACE_AND) { | |
| 1769 PyObject *right = POP(); | |
| 1770 PyObject *left = TOP(); | |
| 1771 PyObject *res = PyNumber_InPlaceAnd(left, right); | |
| 1772 Py_DECREF(left); | |
| 1773 Py_DECREF(right); | |
| 1774 SET_TOP(res); | |
| 1775 if (res == NULL) | |
| 1776 goto error; | |
| 1777 DISPATCH(); | |
| 1778 } | |
| 1779 | |
| 1780 TARGET(INPLACE_XOR) { | |
| 1781 PyObject *right = POP(); | |
| 1782 PyObject *left = TOP(); | |
| 1783 PyObject *res = PyNumber_InPlaceXor(left, right); | |
| 1784 Py_DECREF(left); | |
| 1785 Py_DECREF(right); | |
| 1786 SET_TOP(res); | |
| 1787 if (res == NULL) | |
| 1788 goto error; | |
| 1789 DISPATCH(); | |
| 1790 } | |
| 1791 | |
| 1792 TARGET(INPLACE_OR) { | |
| 1793 PyObject *right = POP(); | |
| 1794 PyObject *left = TOP(); | |
| 1795 PyObject *res = PyNumber_InPlaceOr(left, right); | |
| 1796 Py_DECREF(left); | |
| 1797 Py_DECREF(right); | |
| 1798 SET_TOP(res); | |
| 1799 if (res == NULL) | |
| 1800 goto error; | |
| 1801 DISPATCH(); | |
| 1802 } | |
| 1803 | |
| 1804 TARGET(STORE_SUBSCR) { | |
| 1805 PyObject *sub = TOP(); | |
| 1806 PyObject *container = SECOND(); | |
| 1807 PyObject *v = THIRD(); | |
| 1808 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1809 STACKADJ(-3); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1810 /* v[w] = u */ |
| 79693 | 1811 err = PyObject_SetItem(container, sub, v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1812 Py_DECREF(v); |
| 79693 | 1813 Py_DECREF(container); |
| 1814 Py_DECREF(sub); | |
| 1815 if (err != 0) | |
| 1816 goto error; | |
| 1817 DISPATCH(); | |
| 1818 } | |
| 1819 | |
| 1820 TARGET(DELETE_SUBSCR) { | |
| 1821 PyObject *sub = TOP(); | |
| 1822 PyObject *container = SECOND(); | |
| 1823 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1824 STACKADJ(-2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1825 /* del v[w] */ |
| 79693 | 1826 err = PyObject_DelItem(container, sub); |
| 1827 Py_DECREF(container); | |
| 1828 Py_DECREF(sub); | |
| 1829 if (err != 0) | |
| 1830 goto error; | |
| 1831 DISPATCH(); | |
| 1832 } | |
| 1833 | |
| 1834 TARGET(PRINT_EXPR) { | |
| 1835 PyObject *value = POP(); | |
| 1836 PyObject *hook = PySys_GetObject("displayhook"); | |
|
79695
fb40d0ab0c77
move more variable declarations to the top of blocks
Benjamin Peterson <benjamin@python.org>
parents:
79694
diff
changeset
|
1837 PyObject *res; |
| 79693 | 1838 if (hook == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1839 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1840 "lost sys.displayhook"); |
| 79693 | 1841 Py_DECREF(value); |
| 1842 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1843 } |
|
79695
fb40d0ab0c77
move more variable declarations to the top of blocks
Benjamin Peterson <benjamin@python.org>
parents:
79694
diff
changeset
|
1844 res = PyObject_CallFunctionObjArgs(hook, value, NULL); |
| 79693 | 1845 Py_DECREF(value); |
| 1846 if (res == NULL) | |
| 1847 goto error; | |
| 1848 Py_DECREF(res); | |
| 1849 DISPATCH(); | |
| 1850 } | |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1851 |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1852 #ifdef CASE_TOO_BIG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1853 default: switch (opcode) { |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1854 #endif |
| 79693 | 1855 TARGET(RAISE_VARARGS) { |
| 1856 PyObject *cause = NULL, *exc = NULL; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1857 switch (oparg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1858 case 2: |
| 79693 | 1859 cause = POP(); /* cause */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1860 case 1: |
| 79693 | 1861 exc = POP(); /* exc */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1862 case 0: /* Fallthrough */ |
| 79693 | 1863 if (do_raise(exc, cause)) { |
| 1864 why = WHY_EXCEPTION; | |
| 1865 goto fast_block_end; | |
| 1866 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1867 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1868 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1869 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1870 "bad RAISE_VARARGS oparg"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1871 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1872 } |
| 79693 | 1873 goto error; |
| 1874 } | |
| 1875 | |
| 1876 TARGET(RETURN_VALUE) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1877 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1878 why = WHY_RETURN; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1879 goto fast_block_end; |
| 79693 | 1880 } |
| 1881 | |
| 1882 TARGET(YIELD_FROM) { | |
| 1883 PyObject *v = POP(); | |
| 1884 PyObject *reciever = TOP(); | |
| 1885 int err; | |
| 1886 if (PyGen_CheckExact(reciever)) { | |
| 1887 retval = _PyGen_Send((PyGenObject *)reciever, v); | |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1888 } else { |
|
75852
5fae5be91849
use identifier api
Benjamin Peterson <benjamin@python.org>
parents:
75714
diff
changeset
|
1889 _Py_IDENTIFIER(send); |
| 79693 | 1890 if (v == Py_None) |
| 1891 retval = Py_TYPE(reciever)->tp_iternext(reciever); | |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1892 else |
| 79693 | 1893 retval = _PyObject_CallMethodId(reciever, &PyId_send, "O", v); |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1894 } |
| 79693 | 1895 Py_DECREF(v); |
| 1896 if (retval == NULL) { | |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1897 PyObject *val; |
|
77476
cfbf6aa5c9e3
Issue #13783: the PEP 380 implementation no longer expands the public C API
Nick Coghlan <ncoghlan@gmail.com>
parents:
77283
diff
changeset
|
1898 err = _PyGen_FetchStopIterationValue(&val); |
| 79693 | 1899 if (err < 0) |
| 1900 goto error; | |
| 1901 Py_DECREF(reciever); | |
| 1902 SET_TOP(val); | |
| 1903 DISPATCH(); | |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
73738
diff
changeset
|
1904 } |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1905 /* x remains on stack, retval is value to be yielded */ |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
73738
diff
changeset
|
1906 f->f_stacktop = stack_pointer; |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
73738
diff
changeset
|
1907 why = WHY_YIELD; |
|
75714
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1908 /* and repeat... */ |
|
72556ff86828
perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
1909 f->f_lasti--; |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
73738
diff
changeset
|
1910 goto fast_yield; |
| 79693 | 1911 } |
| 1912 | |
| 1913 TARGET(YIELD_VALUE) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1914 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1915 f->f_stacktop = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1916 why = WHY_YIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1917 goto fast_yield; |
| 79693 | 1918 } |
| 1919 | |
| 1920 TARGET(POP_EXCEPT) { | |
| 1921 PyTryBlock *b = PyFrame_BlockPop(f); | |
| 1922 if (b->b_type != EXCEPT_HANDLER) { | |
| 1923 PyErr_SetString(PyExc_SystemError, | |
| 1924 "popped block is not an except handler"); | |
| 1925 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1926 } |
| 79693 | 1927 UNWIND_EXCEPT_HANDLER(b); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1928 DISPATCH(); |
| 79693 | 1929 } |
| 1930 | |
| 1931 TARGET(POP_BLOCK) { | |
| 1932 PyTryBlock *b = PyFrame_BlockPop(f); | |
| 1933 UNWIND_BLOCK(b); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1934 DISPATCH(); |
| 79693 | 1935 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1936 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1937 PREDICTED(END_FINALLY); |
| 79693 | 1938 TARGET(END_FINALLY) { |
| 1939 PyObject *status = POP(); | |
| 1940 if (PyLong_Check(status)) { | |
| 1941 why = (enum why_code) PyLong_AS_LONG(status); | |
| 1942 assert(why != WHY_YIELD && why != WHY_EXCEPTION); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1943 if (why == WHY_RETURN || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1944 why == WHY_CONTINUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1945 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1946 if (why == WHY_SILENCED) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1947 /* An exception was silenced by 'with', we must |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1948 manually unwind the EXCEPT_HANDLER block which was |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1949 created when the exception was caught, otherwise |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1950 the stack will be in an inconsistent state. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1951 PyTryBlock *b = PyFrame_BlockPop(f); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1952 assert(b->b_type == EXCEPT_HANDLER); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1953 UNWIND_EXCEPT_HANDLER(b); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1954 why = WHY_NOT; |
| 79693 | 1955 Py_DECREF(status); |
| 1956 DISPATCH(); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1957 } |
| 79693 | 1958 Py_DECREF(status); |
| 1959 goto fast_block_end; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1960 } |
| 79693 | 1961 else if (PyExceptionClass_Check(status)) { |
| 1962 PyObject *exc = POP(); | |
| 1963 PyObject *tb = POP(); | |
| 1964 PyErr_Restore(status, exc, tb); | |
| 1965 why = WHY_EXCEPTION; | |
| 1966 goto fast_block_end; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1967 } |
| 79693 | 1968 else if (status != Py_None) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1969 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1970 "'finally' pops bad exception"); |
| 79693 | 1971 Py_DECREF(status); |
| 1972 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1973 } |
| 79693 | 1974 Py_DECREF(status); |
| 1975 DISPATCH(); | |
| 1976 } | |
| 1977 | |
| 1978 TARGET(LOAD_BUILD_CLASS) { | |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
1979 _Py_IDENTIFIER(__build_class__); |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1980 |
| 79693 | 1981 PyObject *bc; |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1982 if (PyDict_CheckExact(f->f_builtins)) { |
| 79693 | 1983 bc = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__); |
| 1984 if (bc == NULL) { | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1985 PyErr_SetString(PyExc_NameError, |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1986 "__build_class__ not found"); |
| 79693 | 1987 goto error; |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1988 } |
| 79693 | 1989 Py_INCREF(bc); |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1990 } |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1991 else { |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1992 PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__); |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1993 if (build_class_str == NULL) |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1994 break; |
| 79693 | 1995 bc = PyObject_GetItem(f->f_builtins, build_class_str); |
| 1996 if (bc == NULL) { | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1997 if (PyErr_ExceptionMatches(PyExc_KeyError)) |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1998 PyErr_SetString(PyExc_NameError, |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
1999 "__build_class__ not found"); |
| 79693 | 2000 goto error; |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2001 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2002 } |
| 79693 | 2003 PUSH(bc); |
| 2004 DISPATCH(); | |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
2005 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2006 |
| 79693 | 2007 TARGET(STORE_NAME) { |
| 2008 PyObject *name = GETITEM(names, oparg); | |
| 2009 PyObject *v = POP(); | |
| 2010 PyObject *ns = f->f_locals; | |
| 2011 int err; | |
| 2012 if (ns == NULL) { | |
| 2013 PyErr_Format(PyExc_SystemError, | |
| 2014 "no locals found when storing %R", name); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2015 Py_DECREF(v); |
| 79693 | 2016 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2017 } |
| 79693 | 2018 if (PyDict_CheckExact(ns)) |
| 2019 err = PyDict_SetItem(ns, name, v); | |
| 2020 else | |
| 2021 err = PyObject_SetItem(ns, name, v); | |
| 2022 Py_DECREF(v); | |
| 2023 if (err != 0) | |
| 2024 goto error; | |
|
79650
5a13f9b842b1
add some missing DISPATCH()
Benjamin Peterson <benjamin@python.org>
parents:
78458
diff
changeset
|
2025 DISPATCH(); |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
2026 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2027 |
| 79693 | 2028 TARGET(DELETE_NAME) { |
| 2029 PyObject *name = GETITEM(names, oparg); | |
| 2030 PyObject *ns = f->f_locals; | |
| 2031 int err; | |
| 2032 if (ns == NULL) { | |
| 2033 PyErr_Format(PyExc_SystemError, | |
| 2034 "no locals when deleting %R", name); | |
| 2035 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2036 } |
| 79693 | 2037 err = PyObject_DelItem(ns, name); |
| 2038 if (err != 0) { | |
| 2039 format_exc_check_arg(PyExc_NameError, | |
| 2040 NAME_ERROR_MSG, | |
| 2041 name); | |
| 2042 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2043 } |
| 79693 | 2044 DISPATCH(); |
| 2045 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2046 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2047 PREDICTED_WITH_ARG(UNPACK_SEQUENCE); |
| 79693 | 2048 TARGET(UNPACK_SEQUENCE) { |
| 2049 PyObject *seq = POP(), *item, **items; | |
| 2050 if (PyTuple_CheckExact(seq) && | |
| 2051 PyTuple_GET_SIZE(seq) == oparg) { | |
| 2052 items = ((PyTupleObject *)seq)->ob_item; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2053 while (oparg--) { |
| 79693 | 2054 item = items[oparg]; |
| 2055 Py_INCREF(item); | |
| 2056 PUSH(item); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2057 } |
| 79693 | 2058 } else if (PyList_CheckExact(seq) && |
| 2059 PyList_GET_SIZE(seq) == oparg) { | |
| 2060 items = ((PyListObject *)seq)->ob_item; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2061 while (oparg--) { |
| 79693 | 2062 item = items[oparg]; |
| 2063 Py_INCREF(item); | |
| 2064 PUSH(item); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2065 } |
| 79693 | 2066 } else if (unpack_iterable(seq, oparg, -1, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2067 stack_pointer + oparg)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2068 STACKADJ(oparg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2069 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2070 /* unpack_iterable() raised an exception */ |
| 79693 | 2071 Py_DECREF(seq); |
| 2072 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2073 } |
| 79693 | 2074 Py_DECREF(seq); |
|
79650
5a13f9b842b1
add some missing DISPATCH()
Benjamin Peterson <benjamin@python.org>
parents:
78458
diff
changeset
|
2075 DISPATCH(); |
| 79693 | 2076 } |
| 2077 | |
| 2078 TARGET(UNPACK_EX) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2079 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); |
| 79693 | 2080 PyObject *seq = POP(); |
| 2081 | |
| 2082 if (unpack_iterable(seq, oparg & 0xFF, oparg >> 8, | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2083 stack_pointer + totalargs)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2084 stack_pointer += totalargs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2085 } else { |
| 79693 | 2086 Py_DECREF(seq); |
| 2087 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2088 } |
| 79693 | 2089 Py_DECREF(seq); |
| 2090 DISPATCH(); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2091 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2092 |
| 79693 | 2093 TARGET(STORE_ATTR) { |
| 2094 PyObject *name = GETITEM(names, oparg); | |
| 2095 PyObject *owner = TOP(); | |
| 2096 PyObject *v = SECOND(); | |
| 2097 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2098 STACKADJ(-2); |
| 79693 | 2099 err = PyObject_SetAttr(owner, name, v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2100 Py_DECREF(v); |
| 79693 | 2101 Py_DECREF(owner); |
| 2102 if (err != 0) | |
| 2103 goto error; | |
| 2104 DISPATCH(); | |
| 2105 } | |
| 2106 | |
| 2107 TARGET(DELETE_ATTR) { | |
| 2108 PyObject *name = GETITEM(names, oparg); | |
| 2109 PyObject *owner = POP(); | |
| 2110 int err; | |
| 2111 err = PyObject_SetAttr(owner, name, (PyObject *)NULL); | |
| 2112 Py_DECREF(owner); | |
| 2113 if (err != 0) | |
| 2114 goto error; | |
|
79650
5a13f9b842b1
add some missing DISPATCH()
Benjamin Peterson <benjamin@python.org>
parents:
78458
diff
changeset
|
2115 DISPATCH(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2116 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2117 |
| 79693 | 2118 TARGET(STORE_GLOBAL) { |
| 2119 PyObject *name = GETITEM(names, oparg); | |
| 2120 PyObject *v = POP(); | |
| 2121 int err; | |
| 2122 err = PyDict_SetItem(f->f_globals, name, v); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2123 Py_DECREF(v); |
| 79693 | 2124 if (err != 0) |
| 2125 goto error; | |
| 2126 DISPATCH(); | |
| 2127 } | |
| 2128 | |
| 2129 TARGET(DELETE_GLOBAL) { | |
| 2130 PyObject *name = GETITEM(names, oparg); | |
| 2131 int err; | |
| 2132 err = PyDict_DelItem(f->f_globals, name); | |
| 2133 if (err != 0) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2134 format_exc_check_arg( |
|
82459
f1d3fbcd837d
#17032: The "global" in the "NameError: global name 'x' is not defined" error message has been removed. Patch by Ram Rachum.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
82133
diff
changeset
|
2135 PyExc_NameError, NAME_ERROR_MSG, name); |
| 79693 | 2136 goto error; |
|
79650
5a13f9b842b1
add some missing DISPATCH()
Benjamin Peterson <benjamin@python.org>
parents:
78458
diff
changeset
|
2137 } |
|
5a13f9b842b1
add some missing DISPATCH()
Benjamin Peterson <benjamin@python.org>
parents:
78458
diff
changeset
|
2138 DISPATCH(); |
| 79693 | 2139 } |
| 2140 | |
| 2141 TARGET(LOAD_NAME) { | |
| 2142 PyObject *name = GETITEM(names, oparg); | |
| 2143 PyObject *locals = f->f_locals; | |
| 2144 PyObject *v; | |
| 2145 if (locals == NULL) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2146 PyErr_Format(PyExc_SystemError, |
| 79693 | 2147 "no locals when loading %R", name); |
| 2148 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2149 } |
| 79693 | 2150 if (PyDict_CheckExact(locals)) { |
| 2151 v = PyDict_GetItem(locals, name); | |
| 2152 Py_XINCREF(v); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2153 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2154 else { |
| 79693 | 2155 v = PyObject_GetItem(locals, name); |
| 2156 if (v == NULL && PyErr_Occurred()) { | |
|
80857
bb6fd6f021e7
use error label instead of breaking eval loop (closes #16693)
Benjamin Peterson <benjamin@python.org>
parents:
79695
diff
changeset
|
2157 if (!PyErr_ExceptionMatches(PyExc_KeyError)) |
|
bb6fd6f021e7
use error label instead of breaking eval loop (closes #16693)
Benjamin Peterson <benjamin@python.org>
parents:
79695
diff
changeset
|
2158 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2159 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2160 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2161 } |
| 79693 | 2162 if (v == NULL) { |
| 2163 v = PyDict_GetItem(f->f_globals, name); | |
| 2164 Py_XINCREF(v); | |
| 2165 if (v == NULL) { | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2166 if (PyDict_CheckExact(f->f_builtins)) { |
| 79693 | 2167 v = PyDict_GetItem(f->f_builtins, name); |
| 2168 if (v == NULL) { | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2169 format_exc_check_arg( |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2170 PyExc_NameError, |
| 79693 | 2171 NAME_ERROR_MSG, name); |
| 2172 goto error; | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2173 } |
| 79693 | 2174 Py_INCREF(v); |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2175 } |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2176 else { |
| 79693 | 2177 v = PyObject_GetItem(f->f_builtins, name); |
| 2178 if (v == NULL) { | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2179 if (PyErr_ExceptionMatches(PyExc_KeyError)) |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2180 format_exc_check_arg( |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2181 PyExc_NameError, |
| 79693 | 2182 NAME_ERROR_MSG, name); |
| 2183 goto error; | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2184 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2185 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2186 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2187 } |
| 79693 | 2188 PUSH(v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2189 DISPATCH(); |
| 79693 | 2190 } |
| 2191 | |
| 2192 TARGET(LOAD_GLOBAL) { | |
| 2193 PyObject *name = GETITEM(names, oparg); | |
| 2194 PyObject *v; | |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2195 if (PyDict_CheckExact(f->f_globals) |
|
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2196 && PyDict_CheckExact(f->f_builtins)) { |
| 79693 | 2197 v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals, |
|
76485
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2198 (PyDictObject *)f->f_builtins, |
| 79693 | 2199 name); |
| 2200 if (v == NULL) { | |
|
76485
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2201 if (!PyErr_Occurred()) |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2202 format_exc_check_arg(PyExc_NameError, |
|
82459
f1d3fbcd837d
#17032: The "global" in the "NameError: global name 'x' is not defined" error message has been removed. Patch by Ram Rachum.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
82133
diff
changeset
|
2203 NAME_ERROR_MSG, name); |
| 79693 | 2204 goto error; |
|
76411
e3ab8aa0216c
Issue #14385: Support other types than dict for __builtins__
Victor Stinner <victor.stinner@gmail.com>
parents:
76072
diff
changeset
|
2205 } |
| 79693 | 2206 Py_INCREF(v); |
|
76485
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2207 } |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2208 else { |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2209 /* Slow-path if globals or builtins is not a dict */ |
| 79693 | 2210 v = PyObject_GetItem(f->f_globals, name); |
| 2211 if (v == NULL) { | |
| 2212 v = PyObject_GetItem(f->f_builtins, name); | |
| 2213 if (v == NULL) { | |
|
76485
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2214 if (PyErr_ExceptionMatches(PyExc_KeyError)) |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2215 format_exc_check_arg( |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76419
diff
changeset
|
2216 PyExc_NameError, |
|
82459
f1d3fbcd837d
#17032: The "global" in the "NameError: global name 'x' is not defined" error message has been removed. Patch by Ram Rachum.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
82133
diff
changeset
|
2217 NAME_ERROR_MSG, name); |
| 79693 | 2218 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2220 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2221 } |
| 79693 | 2222 PUSH(v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2223 DISPATCH(); |
| 79693 | 2224 } |
| 2225 | |
| 2226 TARGET(DELETE_FAST) { | |
| 2227 PyObject *v = GETLOCAL(oparg); | |
| 2228 if (v != NULL) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2229 SETLOCAL(oparg, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2230 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2231 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2232 format_exc_check_arg( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2233 PyExc_UnboundLocalError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2234 UNBOUNDLOCAL_ERROR_MSG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2235 PyTuple_GetItem(co->co_varnames, oparg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2236 ); |
| 79693 | 2237 goto error; |
| 2238 } | |
| 2239 | |
| 2240 TARGET(DELETE_DEREF) { | |
| 2241 PyObject *cell = freevars[oparg]; | |
| 2242 if (PyCell_GET(cell) != NULL) { | |
| 2243 PyCell_Set(cell, NULL); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2244 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2245 } |
| 79693 | 2246 format_exc_unbound(co, oparg); |
| 2247 goto error; | |
| 2248 } | |
| 2249 | |
| 2250 TARGET(LOAD_CLOSURE) { | |
| 2251 PyObject *cell = freevars[oparg]; | |
| 2252 Py_INCREF(cell); | |
| 2253 PUSH(cell); | |
| 2254 DISPATCH(); | |
| 2255 } | |
| 2256 | |
|
83572
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2257 TARGET(LOAD_CLASSDEREF) { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2258 PyObject *name, *value, *locals = f->f_locals; |
|
83800
e5dc97fb304d
Fix a compilater warning on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents:
83791
diff
changeset
|
2259 Py_ssize_t idx; |
|
83572
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2260 assert(locals); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2261 assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars)); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2262 idx = oparg - PyTuple_GET_SIZE(co->co_cellvars); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2263 assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars)); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2264 name = PyTuple_GET_ITEM(co->co_freevars, idx); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2265 if (PyDict_CheckExact(locals)) { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2266 value = PyDict_GetItem(locals, name); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2267 Py_XINCREF(value); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2268 } |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2269 else { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2270 value = PyObject_GetItem(locals, name); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2271 if (value == NULL && PyErr_Occurred()) { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2272 if (!PyErr_ExceptionMatches(PyExc_KeyError)) |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2273 goto error; |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2274 PyErr_Clear(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2275 } |
|
83572
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2276 } |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2277 if (!value) { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2278 PyObject *cell = freevars[oparg]; |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2279 value = PyCell_GET(cell); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2280 if (value == NULL) { |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2281 format_exc_unbound(co, oparg); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2282 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2283 } |
|
83572
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2284 Py_INCREF(value); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2285 } |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2286 PUSH(value); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2287 DISPATCH(); |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2288 } |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83456
diff
changeset
|
2289 |
| 79693 | 2290 TARGET(LOAD_DEREF) { |
| 2291 PyObject *cell = freevars[oparg]; | |
| 2292 PyObject *value = PyCell_GET(cell); | |
| 2293 if (value == NULL) { | |
| 2294 format_exc_unbound(co, oparg); | |
| 2295 goto error; | |
| 2296 } | |
| 2297 Py_INCREF(value); | |
| 2298 PUSH(value); | |
| 2299 DISPATCH(); | |
| 2300 } | |
| 2301 | |
| 2302 TARGET(STORE_DEREF) { | |
| 2303 PyObject *v = POP(); | |
| 2304 PyObject *cell = freevars[oparg]; | |
| 2305 PyCell_Set(cell, v); | |
| 2306 Py_DECREF(v); | |
| 2307 DISPATCH(); | |
| 2308 } | |
| 2309 | |
| 2310 TARGET(BUILD_TUPLE) { | |
| 2311 PyObject *tup = PyTuple_New(oparg); | |
| 2312 if (tup == NULL) | |
| 2313 goto error; | |
| 2314 while (--oparg >= 0) { | |
| 2315 PyObject *item = POP(); | |
| 2316 PyTuple_SET_ITEM(tup, oparg, item); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2317 } |
| 79693 | 2318 PUSH(tup); |
| 2319 DISPATCH(); | |
| 2320 } | |
| 2321 | |
| 2322 TARGET(BUILD_LIST) { | |
| 2323 PyObject *list = PyList_New(oparg); | |
| 2324 if (list == NULL) | |
| 2325 goto error; | |
| 2326 while (--oparg >= 0) { | |
| 2327 PyObject *item = POP(); | |
| 2328 PyList_SET_ITEM(list, oparg, item); | |
| 2329 } | |
| 2330 PUSH(list); | |
| 2331 DISPATCH(); | |
| 2332 } | |
| 2333 | |
| 2334 TARGET(BUILD_SET) { | |
| 2335 PyObject *set = PySet_New(NULL); | |
| 2336 int err = 0; | |
| 2337 if (set == NULL) | |
| 2338 goto error; | |
| 2339 while (--oparg >= 0) { | |
| 2340 PyObject *item = POP(); | |
| 2341 if (err == 0) | |
| 2342 err = PySet_Add(set, item); | |
| 2343 Py_DECREF(item); | |
| 2344 } | |
| 2345 if (err != 0) { | |
| 2346 Py_DECREF(set); | |
| 2347 goto error; | |
| 2348 } | |
| 2349 PUSH(set); | |
| 2350 DISPATCH(); | |
| 2351 } | |
| 2352 | |
| 2353 TARGET(BUILD_MAP) { | |
| 2354 PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); | |
| 2355 if (map == NULL) | |
| 2356 goto error; | |
| 2357 PUSH(map); | |
| 2358 DISPATCH(); | |
| 2359 } | |
| 2360 | |
| 2361 TARGET(STORE_MAP) { | |
| 2362 PyObject *key = TOP(); | |
| 2363 PyObject *value = SECOND(); | |
| 2364 PyObject *map = THIRD(); | |
| 2365 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2366 STACKADJ(-2); |
| 79693 | 2367 assert(PyDict_CheckExact(map)); |
| 2368 err = PyDict_SetItem(map, key, value); | |
| 2369 Py_DECREF(value); | |
| 2370 Py_DECREF(key); | |
| 2371 if (err != 0) | |
| 2372 goto error; | |
| 2373 DISPATCH(); | |
| 2374 } | |
| 2375 | |
| 2376 TARGET(MAP_ADD) { | |
| 2377 PyObject *key = TOP(); | |
| 2378 PyObject *value = SECOND(); | |
| 2379 PyObject *map; | |
| 2380 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2381 STACKADJ(-2); |
| 79693 | 2382 map = stack_pointer[-oparg]; /* dict */ |
| 2383 assert(PyDict_CheckExact(map)); | |
| 2384 err = PyDict_SetItem(map, key, value); /* v[w] = u */ | |
| 2385 Py_DECREF(value); | |
| 2386 Py_DECREF(key); | |
| 2387 if (err != 0) | |
| 2388 goto error; | |
| 2389 PREDICT(JUMP_ABSOLUTE); | |
| 2390 DISPATCH(); | |
| 2391 } | |
| 2392 | |
| 2393 TARGET(LOAD_ATTR) { | |
| 2394 PyObject *name = GETITEM(names, oparg); | |
| 2395 PyObject *owner = TOP(); | |
| 2396 PyObject *res = PyObject_GetAttr(owner, name); | |
| 2397 Py_DECREF(owner); | |
| 2398 SET_TOP(res); | |
| 2399 if (res == NULL) | |
| 2400 goto error; | |
| 2401 DISPATCH(); | |
| 2402 } | |
| 2403 | |
| 2404 TARGET(COMPARE_OP) { | |
| 2405 PyObject *right = POP(); | |
| 2406 PyObject *left = TOP(); | |
| 2407 PyObject *res = cmp_outcome(oparg, left, right); | |
| 2408 Py_DECREF(left); | |
| 2409 Py_DECREF(right); | |
| 2410 SET_TOP(res); | |
| 2411 if (res == NULL) | |
| 2412 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2413 PREDICT(POP_JUMP_IF_FALSE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2414 PREDICT(POP_JUMP_IF_TRUE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2415 DISPATCH(); |
| 79693 | 2416 } |
| 2417 | |
| 2418 TARGET(IMPORT_NAME) { | |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
2419 _Py_IDENTIFIER(__import__); |
| 79693 | 2420 PyObject *name = GETITEM(names, oparg); |
| 2421 PyObject *func = _PyDict_GetItemId(f->f_builtins, &PyId___import__); | |
|
79695
fb40d0ab0c77
move more variable declarations to the top of blocks
Benjamin Peterson <benjamin@python.org>
parents:
79694
diff
changeset
|
2422 PyObject *from, *level, *args, *res; |
| 79693 | 2423 if (func == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2424 PyErr_SetString(PyExc_ImportError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2425 "__import__ not found"); |
| 79693 | 2426 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2427 } |
| 79693 | 2428 Py_INCREF(func); |
| 2429 from = POP(); | |
| 2430 level = TOP(); | |
| 2431 if (PyLong_AsLong(level) != -1 || PyErr_Occurred()) | |
| 2432 args = PyTuple_Pack(5, | |
| 2433 name, | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2434 f->f_globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2435 f->f_locals == NULL ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2436 Py_None : f->f_locals, |
| 79693 | 2437 from, |
| 2438 level); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2439 else |
| 79693 | 2440 args = PyTuple_Pack(4, |
| 2441 name, | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2442 f->f_globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2443 f->f_locals == NULL ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2444 Py_None : f->f_locals, |
| 79693 | 2445 from); |
| 2446 Py_DECREF(level); | |
| 2447 Py_DECREF(from); | |
| 2448 if (args == NULL) { | |
| 2449 Py_DECREF(func); | |
| 2450 STACKADJ(-1); | |
| 2451 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2452 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2453 READ_TIMESTAMP(intr0); |
|
79695
fb40d0ab0c77
move more variable declarations to the top of blocks
Benjamin Peterson <benjamin@python.org>
parents:
79694
diff
changeset
|
2454 res = PyEval_CallObject(func, args); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2455 READ_TIMESTAMP(intr1); |
| 79693 | 2456 Py_DECREF(args); |
| 2457 Py_DECREF(func); | |
| 2458 SET_TOP(res); | |
| 2459 if (res == NULL) | |
| 2460 goto error; | |
| 2461 DISPATCH(); | |
|
75959
c67f3681e032
Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents:
75852
diff
changeset
|
2462 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2463 |
| 79693 | 2464 TARGET(IMPORT_STAR) { |
| 2465 PyObject *from = POP(), *locals; | |
| 2466 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2467 PyFrame_FastToLocals(f); |
| 79693 | 2468 locals = f->f_locals; |
| 2469 if (locals == NULL) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2470 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2471 "no locals found during 'import *'"); |
| 79693 | 2472 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2473 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2474 READ_TIMESTAMP(intr0); |
| 79693 | 2475 err = import_all_from(locals, from); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2476 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2477 PyFrame_LocalsToFast(f, 0); |
| 79693 | 2478 Py_DECREF(from); |
| 2479 if (err != 0) | |
| 2480 goto error; | |
| 2481 DISPATCH(); | |
| 2482 } | |
| 2483 | |
| 2484 TARGET(IMPORT_FROM) { | |
| 2485 PyObject *name = GETITEM(names, oparg); | |
| 2486 PyObject *from = TOP(); | |
| 2487 PyObject *res; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2488 READ_TIMESTAMP(intr0); |
| 79693 | 2489 res = import_from(from, name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2490 READ_TIMESTAMP(intr1); |
| 79693 | 2491 PUSH(res); |
| 2492 if (res == NULL) | |
| 2493 goto error; | |
| 2494 DISPATCH(); | |
| 2495 } | |
| 2496 | |
| 2497 TARGET(JUMP_FORWARD) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2498 JUMPBY(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2499 FAST_DISPATCH(); |
| 79693 | 2500 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2501 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2502 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE); |
| 79693 | 2503 TARGET(POP_JUMP_IF_FALSE) { |
| 2504 PyObject *cond = POP(); | |
| 2505 int err; | |
| 2506 if (cond == Py_True) { | |
| 2507 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2508 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2509 } |
| 79693 | 2510 if (cond == Py_False) { |
| 2511 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2512 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2513 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2514 } |
| 79693 | 2515 err = PyObject_IsTrue(cond); |
| 2516 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2517 if (err > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2518 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2519 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2520 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2521 else |
| 79693 | 2522 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2523 DISPATCH(); |
| 79693 | 2524 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2525 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2526 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE); |
| 79693 | 2527 TARGET(POP_JUMP_IF_TRUE) { |
| 2528 PyObject *cond = POP(); | |
| 2529 int err; | |
| 2530 if (cond == Py_False) { | |
| 2531 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2532 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2533 } |
| 79693 | 2534 if (cond == Py_True) { |
| 2535 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2536 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2537 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2538 } |
| 79693 | 2539 err = PyObject_IsTrue(cond); |
| 2540 Py_DECREF(cond); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2541 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2542 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2543 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2544 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2545 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2546 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2547 else |
| 79693 | 2548 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2549 DISPATCH(); |
| 79693 | 2550 } |
| 2551 | |
| 2552 TARGET(JUMP_IF_FALSE_OR_POP) { | |
| 2553 PyObject *cond = TOP(); | |
| 2554 int err; | |
| 2555 if (cond == Py_True) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2556 STACKADJ(-1); |
| 79693 | 2557 Py_DECREF(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2558 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2559 } |
| 79693 | 2560 if (cond == Py_False) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2561 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2562 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2563 } |
| 79693 | 2564 err = PyObject_IsTrue(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2565 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2566 STACKADJ(-1); |
| 79693 | 2567 Py_DECREF(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2568 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2569 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2570 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2571 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2572 else |
| 79693 | 2573 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2574 DISPATCH(); |
| 79693 | 2575 } |
| 2576 | |
| 2577 TARGET(JUMP_IF_TRUE_OR_POP) { | |
| 2578 PyObject *cond = TOP(); | |
| 2579 int err; | |
| 2580 if (cond == Py_False) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2581 STACKADJ(-1); |
| 79693 | 2582 Py_DECREF(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2583 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2584 } |
| 79693 | 2585 if (cond == Py_True) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2586 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2587 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2588 } |
| 79693 | 2589 err = PyObject_IsTrue(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2590 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2591 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2592 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2593 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2594 else if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2595 STACKADJ(-1); |
| 79693 | 2596 Py_DECREF(cond); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2597 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2598 else |
| 79693 | 2599 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2600 DISPATCH(); |
| 79693 | 2601 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2602 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2603 PREDICTED_WITH_ARG(JUMP_ABSOLUTE); |
| 79693 | 2604 TARGET(JUMP_ABSOLUTE) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2605 JUMPTO(oparg); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2606 #if FAST_LOOPS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2607 /* Enabling this path speeds-up all while and for-loops by bypassing |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2608 the per-loop checks for signals. By default, this should be turned-off |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2609 because it prevents detection of a control-break in tight loops like |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2610 "while 1: pass". Compile with this option turned-on when you need |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2611 the speed-up and do not need break checking inside tight loops (ones |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2612 that contain only instructions ending with FAST_DISPATCH). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2613 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2614 FAST_DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2615 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2616 DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2617 #endif |
| 79693 | 2618 } |
| 2619 | |
| 2620 TARGET(GET_ITER) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2621 /* before: [obj]; after [getiter(obj)] */ |
| 79693 | 2622 PyObject *iterable = TOP(); |
| 2623 PyObject *iter = PyObject_GetIter(iterable); | |
| 2624 Py_DECREF(iterable); | |
| 2625 SET_TOP(iter); | |
| 2626 if (iter == NULL) | |
| 2627 goto error; | |
| 2628 PREDICT(FOR_ITER); | |
| 2629 DISPATCH(); | |
| 2630 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2631 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2632 PREDICTED_WITH_ARG(FOR_ITER); |
| 79693 | 2633 TARGET(FOR_ITER) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2634 /* before: [iter]; after: [iter, iter()] *or* [] */ |
| 79693 | 2635 PyObject *iter = TOP(); |
| 2636 PyObject *next = (*iter->ob_type->tp_iternext)(iter); | |
| 2637 if (next != NULL) { | |
| 2638 PUSH(next); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2639 PREDICT(STORE_FAST); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2640 PREDICT(UNPACK_SEQUENCE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2641 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2642 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2643 if (PyErr_Occurred()) { |
| 79693 | 2644 if (!PyErr_ExceptionMatches(PyExc_StopIteration)) |
| 2645 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2646 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2647 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2648 /* iterator ended normally */ |
| 79693 | 2649 STACKADJ(-1); |
| 2650 Py_DECREF(iter); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2651 JUMPBY(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2652 DISPATCH(); |
| 79693 | 2653 } |
| 2654 | |
| 2655 TARGET(BREAK_LOOP) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2656 why = WHY_BREAK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2657 goto fast_block_end; |
| 79693 | 2658 } |
| 2659 | |
| 2660 TARGET(CONTINUE_LOOP) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2661 retval = PyLong_FromLong(oparg); |
| 79693 | 2662 if (retval == NULL) |
| 2663 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2664 why = WHY_CONTINUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2665 goto fast_block_end; |
| 79693 | 2666 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2667 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2668 TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2669 TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2670 TARGET(SETUP_FINALLY) |
| 79693 | 2671 _setup_finally: { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2672 /* NOTE: If you add any new block-setup opcodes that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2673 are not try/except/finally handlers, you may need |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2674 to update the PyGen_NeedsFinalizing() function. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2675 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2676 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2677 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2678 STACK_LEVEL()); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2679 DISPATCH(); |
| 79693 | 2680 } |
| 2681 | |
| 2682 TARGET(SETUP_WITH) { | |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
2683 _Py_IDENTIFIER(__exit__); |
|
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
2684 _Py_IDENTIFIER(__enter__); |
| 79693 | 2685 PyObject *mgr = TOP(); |
| 2686 PyObject *exit = special_lookup(mgr, &PyId___exit__), *enter; | |
| 2687 PyObject *res; | |
| 2688 if (exit == NULL) | |
| 2689 goto error; | |
| 2690 SET_TOP(exit); | |
| 2691 enter = special_lookup(mgr, &PyId___enter__); | |
| 2692 Py_DECREF(mgr); | |
| 2693 if (enter == NULL) | |
| 2694 goto error; | |
| 2695 res = PyObject_CallFunctionObjArgs(enter, NULL); | |
| 2696 Py_DECREF(enter); | |
| 2697 if (res == NULL) | |
| 2698 goto error; | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2699 /* Setup the finally block before pushing the result |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2700 of __enter__ on the stack. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2701 PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2702 STACK_LEVEL()); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2703 |
| 79693 | 2704 PUSH(res); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2705 DISPATCH(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2706 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2707 |
| 79693 | 2708 TARGET(WITH_CLEANUP) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2709 /* At the top of the stack are 1-3 values indicating |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2710 how/why we entered the finally clause: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2711 - TOP = None |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2712 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2713 - TOP = WHY_*; no retval below it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2714 - (TOP, SECOND, THIRD) = exc_info() |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2715 (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2716 Below them is EXIT, the context.__exit__ bound method. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2717 In the last case, we must call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2718 EXIT(TOP, SECOND, THIRD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2719 otherwise we must call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2720 EXIT(None, None, None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2721 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2722 In the first two cases, we remove EXIT from the |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2723 stack, leaving the rest in the same order. In the |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2724 third case, we shift the bottom 3 values of the |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2725 stack down, and replace the empty spot with NULL. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2726 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2727 In addition, if the stack represents an exception, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2728 *and* the function call returns a 'true' value, we |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2729 push WHY_SILENCED onto the stack. END_FINALLY will |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2730 then not re-raise the exception. (But non-local |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2731 gotos should still be resumed.) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2732 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2733 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2734 PyObject *exit_func; |
| 79693 | 2735 PyObject *exc = TOP(), *val = Py_None, *tb = Py_None, *res; |
| 2736 int err; | |
| 2737 if (exc == Py_None) { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2738 (void)POP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2739 exit_func = TOP(); |
| 79693 | 2740 SET_TOP(exc); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2741 } |
| 79693 | 2742 else if (PyLong_Check(exc)) { |
| 2743 STACKADJ(-1); | |
| 2744 switch (PyLong_AsLong(exc)) { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2745 case WHY_RETURN: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2746 case WHY_CONTINUE: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2747 /* Retval in TOP. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2748 exit_func = SECOND(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2749 SET_SECOND(TOP()); |
| 79693 | 2750 SET_TOP(exc); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2751 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2752 default: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2753 exit_func = TOP(); |
| 79693 | 2754 SET_TOP(exc); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2755 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2756 } |
| 79693 | 2757 exc = Py_None; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2758 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2759 else { |
| 79693 | 2760 PyObject *tp2, *exc2, *tb2; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2761 PyTryBlock *block; |
| 79693 | 2762 val = SECOND(); |
| 2763 tb = THIRD(); | |
| 2764 tp2 = FOURTH(); | |
| 2765 exc2 = PEEK(5); | |
| 2766 tb2 = PEEK(6); | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2767 exit_func = PEEK(7); |
| 79693 | 2768 SET_VALUE(7, tb2); |
| 2769 SET_VALUE(6, exc2); | |
| 2770 SET_VALUE(5, tp2); | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2771 /* UNWIND_EXCEPT_HANDLER will pop this off. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2772 SET_FOURTH(NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2773 /* We just shifted the stack down, so we have |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2774 to tell the except handler block that the |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2775 values are lower than it expects. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2776 block = &f->f_blockstack[f->f_iblock - 1]; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2777 assert(block->b_type == EXCEPT_HANDLER); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2778 block->b_level--; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2779 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2780 /* XXX Not the fastest way to call it... */ |
| 79693 | 2781 res = PyObject_CallFunctionObjArgs(exit_func, exc, val, tb, NULL); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2782 Py_DECREF(exit_func); |
| 79693 | 2783 if (res == NULL) |
| 2784 goto error; | |
| 2785 | |
| 2786 if (exc != Py_None) | |
| 2787 err = PyObject_IsTrue(res); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2788 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2789 err = 0; |
| 79693 | 2790 Py_DECREF(res); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2791 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2792 if (err < 0) |
| 79693 | 2793 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2794 else if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2795 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2796 /* There was an exception and a True return */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2797 PUSH(PyLong_FromLong((long) WHY_SILENCED)); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2798 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2799 PREDICT(END_FINALLY); |
| 79693 | 2800 DISPATCH(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2801 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2802 |
| 79693 | 2803 TARGET(CALL_FUNCTION) { |
| 2804 PyObject **sp, *res; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2805 PCALL(PCALL_ALL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2806 sp = stack_pointer; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2807 #ifdef WITH_TSC |
| 79693 | 2808 res = call_function(&sp, oparg, &intr0, &intr1); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2809 #else |
| 79693 | 2810 res = call_function(&sp, oparg); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2811 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2812 stack_pointer = sp; |
| 79693 | 2813 PUSH(res); |
| 2814 if (res == NULL) | |
| 2815 goto error; | |
| 2816 DISPATCH(); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2817 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2818 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2819 TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2820 TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2821 TARGET(CALL_FUNCTION_VAR_KW) |
| 79693 | 2822 _call_function_var_kw: { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2823 int na = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2824 int nk = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2825 int flags = (opcode - CALL_FUNCTION) & 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2826 int n = na + 2 * nk; |
| 79693 | 2827 PyObject **pfunc, *func, **sp, *res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2828 PCALL(PCALL_ALL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2829 if (flags & CALL_FLAG_VAR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2830 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2831 if (flags & CALL_FLAG_KW) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2832 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2833 pfunc = stack_pointer - n - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2834 func = *pfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2835 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2836 if (PyMethod_Check(func) |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
2837 && PyMethod_GET_SELF(func) != NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2838 PyObject *self = PyMethod_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2839 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2840 func = PyMethod_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2841 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2842 Py_DECREF(*pfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2843 *pfunc = self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2844 na++; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
68086
diff
changeset
|
2845 /* n++; */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2846 } else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2847 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2848 sp = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2849 READ_TIMESTAMP(intr0); |
| 79693 | 2850 res = ext_do_call(func, &sp, flags, na, nk); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2851 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2852 stack_pointer = sp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2853 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2854 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2855 while (stack_pointer > pfunc) { |
| 79693 | 2856 PyObject *o = POP(); |
| 2857 Py_DECREF(o); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2858 } |
| 79693 | 2859 PUSH(res); |
| 2860 if (res == NULL) | |
| 2861 goto error; | |
| 2862 DISPATCH(); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2863 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2864 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2865 TARGET_WITH_IMPL(MAKE_CLOSURE, _make_function) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2866 TARGET(MAKE_FUNCTION) |
| 79693 | 2867 _make_function: { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2868 int posdefaults = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2869 int kwdefaults = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2870 int num_annotations = (oparg >> 16) & 0x7fff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2871 |
| 79693 | 2872 PyObject *qualname = POP(); /* qualname */ |
| 2873 PyObject *code = POP(); /* code object */ | |
| 2874 PyObject *func = PyFunction_NewWithQualName(code, f->f_globals, qualname); | |
| 2875 Py_DECREF(code); | |
| 2876 Py_DECREF(qualname); | |
| 2877 | |
| 2878 if (func == NULL) | |
| 2879 goto error; | |
| 2880 | |
| 2881 if (opcode == MAKE_CLOSURE) { | |
| 2882 PyObject *closure = POP(); | |
| 2883 if (PyFunction_SetClosure(func, closure) != 0) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2884 /* Can't happen unless bytecode is corrupt. */ |
| 79693 | 2885 Py_DECREF(func); |
| 2886 Py_DECREF(closure); | |
| 2887 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2888 } |
| 79693 | 2889 Py_DECREF(closure); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2890 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2891 |
| 79693 | 2892 if (num_annotations > 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2893 Py_ssize_t name_ix; |
| 79693 | 2894 PyObject *names = POP(); /* names of args with annotations */ |
| 2895 PyObject *anns = PyDict_New(); | |
| 2896 if (anns == NULL) { | |
| 2897 Py_DECREF(func); | |
| 2898 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2899 } |
| 79693 | 2900 name_ix = PyTuple_Size(names); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2901 assert(num_annotations == name_ix+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2902 while (name_ix > 0) { |
| 79693 | 2903 PyObject *name, *value; |
| 2904 int err; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2905 --name_ix; |
| 79693 | 2906 name = PyTuple_GET_ITEM(names, name_ix); |
| 2907 value = POP(); | |
| 2908 err = PyDict_SetItem(anns, name, value); | |
| 2909 Py_DECREF(value); | |
| 2910 if (err != 0) { | |
| 2911 Py_DECREF(anns); | |
| 2912 Py_DECREF(func); | |
| 2913 goto error; | |
| 2914 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2915 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2916 |
| 79693 | 2917 if (PyFunction_SetAnnotations(func, anns) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2918 /* Can't happen unless |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2919 PyFunction_SetAnnotations changes. */ |
| 79693 | 2920 Py_DECREF(anns); |
| 2921 Py_DECREF(func); | |
| 2922 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2923 } |
| 79693 | 2924 Py_DECREF(anns); |
| 2925 Py_DECREF(names); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2926 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2927 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2928 /* XXX Maybe this should be a separate opcode? */ |
| 79693 | 2929 if (kwdefaults > 0) { |
| 2930 PyObject *defs = PyDict_New(); | |
| 2931 if (defs == NULL) { | |
| 2932 Py_DECREF(func); | |
| 2933 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2934 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2935 while (--kwdefaults >= 0) { |
| 79693 | 2936 PyObject *v = POP(); /* default value */ |
| 2937 PyObject *key = POP(); /* kw only arg name */ | |
| 2938 int err = PyDict_SetItem(defs, key, v); | |
| 2939 Py_DECREF(v); | |
| 2940 Py_DECREF(key); | |
| 2941 if (err != 0) { | |
| 2942 Py_DECREF(defs); | |
| 2943 Py_DECREF(func); | |
| 2944 goto error; | |
| 2945 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2946 } |
| 79693 | 2947 if (PyFunction_SetKwDefaults(func, defs) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2948 /* Can't happen unless |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2949 PyFunction_SetKwDefaults changes. */ |
| 79693 | 2950 Py_DECREF(func); |
| 2951 Py_DECREF(defs); | |
| 2952 goto error; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2953 } |
| 79693 | 2954 Py_DECREF(defs); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2955 } |
|
82133
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2956 if (posdefaults > 0) { |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2957 PyObject *defs = PyTuple_New(posdefaults); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2958 if (defs == NULL) { |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2959 Py_DECREF(func); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2960 goto error; |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2961 } |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2962 while (--posdefaults >= 0) |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2963 PyTuple_SET_ITEM(defs, posdefaults, POP()); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2964 if (PyFunction_SetDefaults(func, defs) != 0) { |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2965 /* Can't happen unless |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2966 PyFunction_SetDefaults changes. */ |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2967 Py_DECREF(defs); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2968 Py_DECREF(func); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2969 goto error; |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2970 } |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2971 Py_DECREF(defs); |
|
d296cf1600a8
evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents:
81677
diff
changeset
|
2972 } |
| 79693 | 2973 PUSH(func); |
| 2974 DISPATCH(); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2975 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2976 |
| 79693 | 2977 TARGET(BUILD_SLICE) { |
| 2978 PyObject *start, *stop, *step, *slice; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2979 if (oparg == 3) |
| 79693 | 2980 step = POP(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2981 else |
| 79693 | 2982 step = NULL; |
| 2983 stop = POP(); | |
| 2984 start = TOP(); | |
| 2985 slice = PySlice_New(start, stop, step); | |
| 2986 Py_DECREF(start); | |
| 2987 Py_DECREF(stop); | |
| 2988 Py_XDECREF(step); | |
| 2989 SET_TOP(slice); | |
| 2990 if (slice == NULL) | |
| 2991 goto error; | |
| 2992 DISPATCH(); | |
| 2993 } | |
| 2994 | |
| 2995 TARGET(EXTENDED_ARG) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2996 opcode = NEXTOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2997 oparg = oparg<<16 | NEXTARG(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2998 goto dispatch_opcode; |
| 79693 | 2999 } |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
3000 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
3001 #if USE_COMPUTED_GOTOS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3002 _unknown_opcode: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
3003 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3004 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3005 fprintf(stderr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3006 "XXX lineno: %d, opcode: %d\n", |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3007 PyFrame_GetLineNumber(f), |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3008 opcode); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3009 PyErr_SetString(PyExc_SystemError, "unknown opcode"); |
| 79693 | 3010 goto error; |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
3011 |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
3012 #ifdef CASE_TOO_BIG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3013 } |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
3014 #endif |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
3015 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3016 } /* switch */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3017 |
| 79693 | 3018 /* This should never be reached. Every opcode should end with DISPATCH() |
| 3019 or goto error. */ | |
| 3020 assert(0); | |
| 3021 | |
| 3022 error: | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3023 READ_TIMESTAMP(inst1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3024 |
| 79693 | 3025 assert(why == WHY_NOT); |
| 3026 why = WHY_EXCEPTION; | |
| 3027 | |
| 3028 /* Double-check exception status. */ | |
| 3029 if (!PyErr_Occurred()) | |
| 3030 PyErr_SetString(PyExc_SystemError, | |
| 3031 "error return without exception set"); | |
| 3032 | |
| 3033 /* Log traceback info. */ | |
| 3034 PyTraceBack_Here(f); | |
| 3035 | |
|
81677
cd87afe18ff8
revert #16672 for incorrect semantics
Benjamin Peterson <benjamin@python.org>
parents:
81015
diff
changeset
|
3036 if (tstate->c_tracefunc != NULL) |
| 79693 | 3037 call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, f); |
| 3038 | |
| 3039 fast_block_end: | |
| 3040 assert(why != WHY_NOT); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3041 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3042 /* Unwind stacks if a (pseudo) exception occurred */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3043 while (why != WHY_NOT && f->f_iblock > 0) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3044 /* Peek at the current block. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3045 PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1]; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3046 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3047 assert(why != WHY_YIELD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3048 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3049 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3050 JUMPTO(PyLong_AS_LONG(retval)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3051 Py_DECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3052 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3053 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3054 /* Now we have to pop the block. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3055 f->f_iblock--; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3056 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3057 if (b->b_type == EXCEPT_HANDLER) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3058 UNWIND_EXCEPT_HANDLER(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3059 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3060 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3061 UNWIND_BLOCK(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3062 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3063 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3064 JUMPTO(b->b_handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3065 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3066 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3067 if (why == WHY_EXCEPTION && (b->b_type == SETUP_EXCEPT |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3068 || b->b_type == SETUP_FINALLY)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3069 PyObject *exc, *val, *tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3070 int handler = b->b_handler; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3071 /* Beware, this invalidates all b->b_* fields */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3072 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL()); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3073 PUSH(tstate->exc_traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3074 PUSH(tstate->exc_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3075 if (tstate->exc_type != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3076 PUSH(tstate->exc_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3077 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3078 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3079 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3080 PUSH(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3081 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3082 PyErr_Fetch(&exc, &val, &tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3083 /* Make the raw exception data |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3084 available to the handler, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3085 so a program can emulate the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3086 Python main loop. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3087 PyErr_NormalizeException( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3088 &exc, &val, &tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3089 PyException_SetTraceback(val, tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3090 Py_INCREF(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3091 tstate->exc_type = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3092 Py_INCREF(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3093 tstate->exc_value = val; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3094 tstate->exc_traceback = tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3095 if (tb == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3096 tb = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3097 Py_INCREF(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3098 PUSH(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3099 PUSH(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3100 PUSH(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3101 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3102 JUMPTO(handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3103 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3104 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3105 if (b->b_type == SETUP_FINALLY) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3106 if (why & (WHY_RETURN | WHY_CONTINUE)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3107 PUSH(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3108 PUSH(PyLong_FromLong((long)why)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3109 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3110 JUMPTO(b->b_handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3111 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3112 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3113 } /* unwind stack */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3114 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3115 /* End the loop if we still have an error (or return) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3116 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3117 if (why != WHY_NOT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3118 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3119 READ_TIMESTAMP(loop1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3120 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3121 } /* main loop */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3122 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3123 assert(why != WHY_YIELD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3124 /* Pop remaining stack entries. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3125 while (!EMPTY()) { |
| 79693 | 3126 PyObject *o = POP(); |
| 3127 Py_XDECREF(o); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3128 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3129 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3130 if (why != WHY_RETURN) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3131 retval = NULL; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
3132 |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
3133 fast_yield: |
|
71157
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3134 if (co->co_flags & CO_GENERATOR && (why == WHY_YIELD || why == WHY_RETURN)) { |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3135 /* The purpose of this block is to put aside the generator's exception |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3136 state and restore that of the calling frame. If the current |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3137 exception state is from the caller, we clear the exception values |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3138 on the generator frame, so they are not swapped back in latter. The |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3139 origin of the current exception state is determined by checking for |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3140 except handler blocks, which we must be in iff a new exception |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3141 state came into existence in this frame. (An uncaught exception |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3142 would have why == WHY_EXCEPTION, and we wouldn't be here). */ |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3143 int i; |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3144 for (i = 0; i < f->f_iblock; i++) |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3145 if (f->f_blockstack[i].b_type == EXCEPT_HANDLER) |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3146 break; |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3147 if (i == f->f_iblock) |
|
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3148 /* We did not create this exception. */ |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3149 restore_and_clear_exc_state(tstate, f); |
|
71157
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3150 else |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3151 swap_exc_state(tstate, f); |
|
71157
419871c62bb3
never retain a generator's caller's exception state on the generator after a yield/return
Benjamin Peterson <benjamin@python.org>
parents:
71151
diff
changeset
|
3152 } |
|
71151
cc7ae81cfe91
restore a generator's caller's exception state both on yield and (last) return
Benjamin Peterson <benjamin@python.org>
parents:
69832
diff
changeset
|
3153 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3154 if (tstate->use_tracing) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3155 if (tstate->c_tracefunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3156 if (why == WHY_RETURN || why == WHY_YIELD) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3157 if (call_trace(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3158 tstate->c_traceobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3159 PyTrace_RETURN, retval)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3160 Py_XDECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3161 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3162 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3163 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3164 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3165 else if (why == WHY_EXCEPTION) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3166 call_trace_protected(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3167 tstate->c_traceobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3168 PyTrace_RETURN, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3169 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3170 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3171 if (tstate->c_profilefunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3172 if (why == WHY_EXCEPTION) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3173 call_trace_protected(tstate->c_profilefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3174 tstate->c_profileobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3175 PyTrace_RETURN, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3176 else if (call_trace(tstate->c_profilefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3177 tstate->c_profileobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3178 PyTrace_RETURN, retval)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3179 Py_XDECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3180 retval = NULL; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
68086
diff
changeset
|
3181 /* why = WHY_EXCEPTION; */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3182 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3183 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3184 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3185 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3186 /* pop frame */ |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3187 exit_eval_frame: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3188 Py_LeaveRecursiveCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3189 tstate->frame = f->f_back; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3190 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3191 return retval; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
3192 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
3193 |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3194 static void |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3195 format_missing(const char *kind, PyCodeObject *co, PyObject *names) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3196 { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3197 int err; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3198 Py_ssize_t len = PyList_GET_SIZE(names); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3199 PyObject *name_str, *comma, *tail, *tmp; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3200 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3201 assert(PyList_CheckExact(names)); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3202 assert(len >= 1); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3203 /* Deal with the joys of natural language. */ |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3204 switch (len) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3205 case 1: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3206 name_str = PyList_GET_ITEM(names, 0); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3207 Py_INCREF(name_str); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3208 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3209 case 2: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3210 name_str = PyUnicode_FromFormat("%U and %U", |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3211 PyList_GET_ITEM(names, len - 2), |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3212 PyList_GET_ITEM(names, len - 1)); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3213 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3214 default: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3215 tail = PyUnicode_FromFormat(", %U, and %U", |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3216 PyList_GET_ITEM(names, len - 2), |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3217 PyList_GET_ITEM(names, len - 1)); |
|
77283
2285a82504dc
check return for error
Benjamin Peterson <benjamin@python.org>
parents:
76942
diff
changeset
|
3218 if (tail == NULL) |
|
2285a82504dc
check return for error
Benjamin Peterson <benjamin@python.org>
parents:
76942
diff
changeset
|
3219 return; |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3220 /* Chop off the last two objects in the list. This shouldn't actually |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3221 fail, but we can't be too careful. */ |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3222 err = PyList_SetSlice(names, len - 2, len, NULL); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3223 if (err == -1) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3224 Py_DECREF(tail); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3225 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3226 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3227 /* Stitch everything up into a nice comma-separated list. */ |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3228 comma = PyUnicode_FromString(", "); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3229 if (comma == NULL) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3230 Py_DECREF(tail); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3231 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3232 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3233 tmp = PyUnicode_Join(comma, names); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3234 Py_DECREF(comma); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3235 if (tmp == NULL) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3236 Py_DECREF(tail); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3237 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3238 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3239 name_str = PyUnicode_Concat(tmp, tail); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3240 Py_DECREF(tmp); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3241 Py_DECREF(tail); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3242 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3243 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3244 if (name_str == NULL) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3245 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3246 PyErr_Format(PyExc_TypeError, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3247 "%U() missing %i required %s argument%s: %U", |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3248 co->co_name, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3249 len, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3250 kind, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3251 len == 1 ? "" : "s", |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3252 name_str); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3253 Py_DECREF(name_str); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3254 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3255 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3256 static void |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3257 missing_arguments(PyCodeObject *co, int missing, int defcount, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3258 PyObject **fastlocals) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3259 { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3260 int i, j = 0; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3261 int start, end; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3262 int positional = defcount != -1; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3263 const char *kind = positional ? "positional" : "keyword-only"; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3264 PyObject *missing_names; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3265 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3266 /* Compute the names of the arguments that are missing. */ |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3267 missing_names = PyList_New(missing); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3268 if (missing_names == NULL) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3269 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3270 if (positional) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3271 start = 0; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3272 end = co->co_argcount - defcount; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3273 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3274 else { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3275 start = co->co_argcount; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3276 end = start + co->co_kwonlyargcount; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3277 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3278 for (i = start; i < end; i++) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3279 if (GETLOCAL(i) == NULL) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3280 PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3281 PyObject *name = PyObject_Repr(raw); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3282 if (name == NULL) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3283 Py_DECREF(missing_names); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3284 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3285 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3286 PyList_SET_ITEM(missing_names, j++, name); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3287 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3288 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3289 assert(j == missing); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3290 format_missing(kind, co, missing_names); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3291 Py_DECREF(missing_names); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3292 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3293 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3294 static void |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3295 too_many_positional(PyCodeObject *co, int given, int defcount, PyObject **fastlocals) |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3296 { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3297 int plural; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3298 int kwonly_given = 0; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3299 int i; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3300 PyObject *sig, *kwonly_sig; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3301 |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3302 assert((co->co_flags & CO_VARARGS) == 0); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3303 /* Count missing keyword-only args. */ |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3304 for (i = co->co_argcount; i < co->co_argcount + co->co_kwonlyargcount; i++) |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3305 if (GETLOCAL(i) != NULL) |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3306 kwonly_given++; |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3307 if (defcount) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3308 int atleast = co->co_argcount - defcount; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3309 plural = 1; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3310 sig = PyUnicode_FromFormat("from %d to %d", atleast, co->co_argcount); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3311 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3312 else { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3313 plural = co->co_argcount != 1; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3314 sig = PyUnicode_FromFormat("%d", co->co_argcount); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3315 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3316 if (sig == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3317 return; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3318 if (kwonly_given) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3319 const char *format = " positional argument%s (and %d keyword-only argument%s)"; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3320 kwonly_sig = PyUnicode_FromFormat(format, given != 1 ? "s" : "", kwonly_given, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3321 kwonly_given != 1 ? "s" : ""); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3322 if (kwonly_sig == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3323 Py_DECREF(sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3324 return; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3325 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3326 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3327 else { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3328 /* This will not fail. */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3329 kwonly_sig = PyUnicode_FromString(""); |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3330 assert(kwonly_sig != NULL); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3331 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3332 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3333 "%U() takes %U positional argument%s but %d%U %s given", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3334 co->co_name, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3335 sig, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3336 plural ? "s" : "", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3337 given, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3338 kwonly_sig, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3339 given == 1 && !kwonly_given ? "was" : "were"); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3340 Py_DECREF(sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3341 Py_DECREF(kwonly_sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3342 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3343 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
3344 /* This is gonna seem *real weird*, but if you put some other code between |
|
32421
485d2ef43419
Patch #966493: Cleanup generator/eval_frame exposure.
Martin v. Löwis <martin@v.loewis.de>
parents:
32412
diff
changeset
|
3345 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
3346 the test in the if statements in Misc/gdbinit (pystack and pystackv). */ |
|
31606
fd2103ae6f29
Add pystack definition to Misc/gdbinit with some explanation of its behavior
Skip Montanaro <skip@pobox.com>
parents:
31514
diff
changeset
|
3347 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3348 PyObject * |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
3349 PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3350 PyObject **args, int argcount, PyObject **kws, int kwcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3351 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure) |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3352 { |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
3353 PyCodeObject* co = (PyCodeObject*)_co; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3354 register PyFrameObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3355 register PyObject *retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3356 register PyObject **fastlocals, **freevars; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3357 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3358 PyObject *x, *u; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3359 int total_args = co->co_argcount + co->co_kwonlyargcount; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3360 int i; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3361 int n = argcount; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3362 PyObject *kwdict = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3363 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3364 if (globals == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3365 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3366 "PyEval_EvalCodeEx: NULL globals"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3367 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3368 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3369 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3370 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3371 assert(globals != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3372 f = PyFrame_New(tstate, co, globals, locals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3373 if (f == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3374 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3375 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3376 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3377 freevars = f->f_localsplus + co->co_nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3378 |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3379 /* Parse arguments. */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3380 if (co->co_flags & CO_VARKEYWORDS) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3381 kwdict = PyDict_New(); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3382 if (kwdict == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3383 goto fail; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3384 i = total_args; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3385 if (co->co_flags & CO_VARARGS) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3386 i++; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3387 SETLOCAL(i, kwdict); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3388 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3389 if (argcount > co->co_argcount) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3390 n = co->co_argcount; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3391 for (i = 0; i < n; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3392 x = args[i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3393 Py_INCREF(x); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3394 SETLOCAL(i, x); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3395 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3396 if (co->co_flags & CO_VARARGS) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3397 u = PyTuple_New(argcount - n); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3398 if (u == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3399 goto fail; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3400 SETLOCAL(total_args, u); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3401 for (i = n; i < argcount; i++) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3402 x = args[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3403 Py_INCREF(x); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3404 PyTuple_SET_ITEM(u, i-n, x); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3405 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3406 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3407 for (i = 0; i < kwcount; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3408 PyObject **co_varnames; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3409 PyObject *keyword = kws[2*i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3410 PyObject *value = kws[2*i + 1]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3411 int j; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3412 if (keyword == NULL || !PyUnicode_Check(keyword)) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3413 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3414 "%U() keywords must be strings", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3415 co->co_name); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3416 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3417 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3418 /* Speed hack: do raw pointer compares. As names are |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3419 normally interned this should almost always hit. */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3420 co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3421 for (j = 0; j < total_args; j++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3422 PyObject *nm = co_varnames[j]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3423 if (nm == keyword) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3424 goto kw_found; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3425 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3426 /* Slow fallback, just in case */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3427 for (j = 0; j < total_args; j++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3428 PyObject *nm = co_varnames[j]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3429 int cmp = PyObject_RichCompareBool( |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3430 keyword, nm, Py_EQ); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3431 if (cmp > 0) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3432 goto kw_found; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3433 else if (cmp < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3434 goto fail; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3435 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3436 if (j >= total_args && kwdict == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3437 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3438 "%U() got an unexpected " |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3439 "keyword argument '%S'", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3440 co->co_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3441 keyword); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3442 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3443 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3444 PyDict_SetItem(kwdict, keyword, value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3445 continue; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3446 kw_found: |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3447 if (GETLOCAL(j) != NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3448 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3449 "%U() got multiple " |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3450 "values for argument '%S'", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3451 co->co_name, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3452 keyword); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3453 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3454 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3455 Py_INCREF(value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3456 SETLOCAL(j, value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3457 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3458 if (argcount > co->co_argcount && !(co->co_flags & CO_VARARGS)) { |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3459 too_many_positional(co, argcount, defcount, fastlocals); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3460 goto fail; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3461 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3462 if (argcount < co->co_argcount) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3463 int m = co->co_argcount - defcount; |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3464 int missing = 0; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3465 for (i = argcount; i < m; i++) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3466 if (GETLOCAL(i) == NULL) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3467 missing++; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3468 if (missing) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3469 missing_arguments(co, missing, defcount, fastlocals); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3470 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3471 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3472 if (n > m) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3473 i = n - m; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3474 else |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3475 i = 0; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3476 for (; i < defcount; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3477 if (GETLOCAL(m+i) == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3478 PyObject *def = defs[i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3479 Py_INCREF(def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3480 SETLOCAL(m+i, def); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3481 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3482 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3483 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3484 if (co->co_kwonlyargcount > 0) { |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3485 int missing = 0; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3486 for (i = co->co_argcount; i < total_args; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3487 PyObject *name; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3488 if (GETLOCAL(i) != NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3489 continue; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3490 name = PyTuple_GET_ITEM(co->co_varnames, i); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3491 if (kwdefs != NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3492 PyObject *def = PyDict_GetItem(kwdefs, name); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3493 if (def) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3494 Py_INCREF(def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3495 SETLOCAL(i, def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3496 continue; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3497 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3498 } |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3499 missing++; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3500 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3501 if (missing) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3502 missing_arguments(co, missing, -1, fastlocals); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3503 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3504 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3505 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3506 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3507 /* Allocate and initialize storage for cell vars, and copy free |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3508 vars into frame. */ |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3509 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3510 PyObject *c; |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3511 int arg; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3512 /* Possibly account for the cell variable being an argument. */ |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3513 if (co->co_cell2arg != NULL && |
|
83772
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3514 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) { |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3515 c = PyCell_New(GETLOCAL(arg)); |
|
83772
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3516 /* Clear the local copy. */ |
|
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3517 SETLOCAL(arg, NULL); |
|
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3518 } |
|
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3519 else { |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3520 c = PyCell_New(NULL); |
|
83772
2b4b289c1abb
when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents:
83455
diff
changeset
|
3521 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3522 if (c == NULL) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3523 goto fail; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3524 SETLOCAL(co->co_nlocals + i, c); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3525 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3526 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) { |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3527 PyObject *o = PyTuple_GET_ITEM(closure, i); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3528 Py_INCREF(o); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3529 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3530 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3531 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3532 if (co->co_flags & CO_GENERATOR) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3533 /* Don't need to keep the reference to f_back, it will be set |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3534 * when the generator is resumed. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3535 Py_XDECREF(f->f_back); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3536 f->f_back = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3537 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3538 PCALL(PCALL_GENERATOR); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3539 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3540 /* Create a new generator that owns the ready to run frame |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3541 * and return that as the value. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3542 return PyGen_New(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3543 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3544 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3545 retval = PyEval_EvalFrameEx(f,0); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3546 |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3547 fail: /* Jump here from prelude on failure */ |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3548 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3549 /* decref'ing the frame can cause __del__ methods to get invoked, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3550 which can call back into Python. While we're done with the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3551 current Python frame (f), the associated C stack is still in use, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3552 so recursion_depth must be boosted for the duration. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3553 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3554 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3555 ++tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3556 Py_DECREF(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3557 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3558 return retval; |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3559 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3560 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3561 |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3562 static PyObject * |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
3563 special_lookup(PyObject *o, _Py_Identifier *id) |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3564 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3565 PyObject *res; |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
3566 res = _PyObject_LookupSpecial(o, id); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3567 if (res == NULL && !PyErr_Occurred()) { |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74367
diff
changeset
|
3568 PyErr_SetObject(PyExc_AttributeError, id->object); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3569 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3570 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3571 return res; |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3572 } |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3573 |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3574 |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3575 /* These 3 functions deal with the exception state of generators. */ |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3576 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3577 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3578 save_exc_state(PyThreadState *tstate, PyFrameObject *f) |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3579 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3580 PyObject *type, *value, *traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3581 Py_XINCREF(tstate->exc_type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3582 Py_XINCREF(tstate->exc_value); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3583 Py_XINCREF(tstate->exc_traceback); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3584 type = f->f_exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3585 value = f->f_exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3586 traceback = f->f_exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3587 f->f_exc_type = tstate->exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3588 f->f_exc_value = tstate->exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3589 f->f_exc_traceback = tstate->exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3590 Py_XDECREF(type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3591 Py_XDECREF(value); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
3592 Py_XDECREF(traceback); |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3593 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3594 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3595 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3596 swap_exc_state(PyThreadState *tstate, PyFrameObject *f) |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3597 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3598 PyObject *tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3599 tmp = tstate->exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3600 tstate->exc_type = f->f_exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3601 f->f_exc_type = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3602 tmp = tstate->exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3603 tstate->exc_value = f->f_exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3604 f->f_exc_value = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3605 tmp = tstate->exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3606 tstate->exc_traceback = f->f_exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3607 f->f_exc_traceback = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3608 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3609 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3610 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3611 restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f) |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3612 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3613 PyObject *type, *value, *tb; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3614 type = tstate->exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3615 value = tstate->exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3616 tb = tstate->exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3617 tstate->exc_type = f->f_exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3618 tstate->exc_value = f->f_exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3619 tstate->exc_traceback = f->f_exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3620 f->f_exc_type = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3621 f->f_exc_value = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3622 f->f_exc_traceback = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3623 Py_XDECREF(type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3624 Py_XDECREF(value); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3625 Py_XDECREF(tb); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3626 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3627 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3628 |
|
4667
c42379e4653b
Moved the raise logic out of the main interpreter loop to a separate function.
Guido van Rossum <guido@python.org>
parents:
4594
diff
changeset
|
3629 /* Logic for the raise statement (too complicated for inlining). |
|
c42379e4653b
Moved the raise logic out of the main interpreter loop to a separate function.
Guido van Rossum <guido@python.org>
parents:
4594
diff
changeset
|
3630 This *consumes* a reference count to each of its arguments. */ |
| 79693 | 3631 static int |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3632 do_raise(PyObject *exc, PyObject *cause) |
|
4667
c42379e4653b
Moved the raise logic out of the main interpreter loop to a separate function.
Guido van Rossum <guido@python.org>
parents:
4594
diff
changeset
|
3633 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3634 PyObject *type = NULL, *value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3635 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3636 if (exc == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3637 /* Reraise */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3638 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3639 PyObject *tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3640 type = tstate->exc_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3641 value = tstate->exc_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3642 tb = tstate->exc_traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3643 if (type == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3644 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3645 "No active exception to reraise"); |
| 79693 | 3646 return 0; |
| 3647 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3648 Py_XINCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3649 Py_XINCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3650 Py_XINCREF(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3651 PyErr_Restore(type, value, tb); |
| 79693 | 3652 return 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3653 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3654 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3655 /* We support the following forms of raise: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3656 raise |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3657 raise <instance> |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3658 raise <type> */ |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3659 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3660 if (PyExceptionClass_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3661 type = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3662 value = PyObject_CallObject(exc, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3663 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3664 goto raise_error; |
|
71349
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3665 if (!PyExceptionInstance_Check(value)) { |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3666 PyErr_Format(PyExc_TypeError, |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3667 "calling %R should have returned an instance of " |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3668 "BaseException, not %R", |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3669 type, Py_TYPE(value)); |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3670 goto raise_error; |
|
8d05f697acd4
catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Benjamin Peterson <benjamin@python.org>
parents:
71157
diff
changeset
|
3671 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3672 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3673 else if (PyExceptionInstance_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3674 value = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3675 type = PyExceptionInstance_Class(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3676 Py_INCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3677 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3678 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3679 /* Not something you can raise. You get an exception |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3680 anyway, just not what you specified :-) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3681 Py_DECREF(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3682 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3683 "exceptions must derive from BaseException"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3684 goto raise_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3685 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3686 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3687 if (cause) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3688 PyObject *fixed_cause; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3689 if (PyExceptionClass_Check(cause)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3690 fixed_cause = PyObject_CallObject(cause, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3691 if (fixed_cause == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3692 goto raise_error; |
|
76942
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3693 Py_DECREF(cause); |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3694 } |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3695 else if (PyExceptionInstance_Check(cause)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3696 fixed_cause = cause; |
|
76942
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3697 } |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3698 else if (cause == Py_None) { |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3699 Py_DECREF(cause); |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3700 fixed_cause = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3701 } |
|
76942
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3702 else { |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3703 PyErr_SetString(PyExc_TypeError, |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3704 "exception causes must derive from " |
|
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3705 "BaseException"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3706 goto raise_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3707 } |
|
76942
b0eb7d2a9542
PEP 415: Implement suppression of __context__ display with an exception attribute
Benjamin Peterson <benjamin@python.org>
parents:
76567
diff
changeset
|
3708 PyException_SetCause(value, fixed_cause); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3709 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3710 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3711 PyErr_SetObject(type, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3712 /* PyErr_SetObject incref's its arguments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3713 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3714 Py_XDECREF(type); |
| 79693 | 3715 return 0; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3716 |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3717 raise_error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3718 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3719 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3720 Py_XDECREF(cause); |
| 79693 | 3721 return 0; |
|
4667
c42379e4653b
Moved the raise logic out of the main interpreter loop to a separate function.
Guido van Rossum <guido@python.org>
parents:
4594
diff
changeset
|
3722 } |
|
c42379e4653b
Moved the raise logic out of the main interpreter loop to a separate function.
Guido van Rossum <guido@python.org>
parents:
4594
diff
changeset
|
3723 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3724 /* Iterate v argcnt times and store the results on the stack (via decreasing |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3725 sp). Return 1 for success, 0 if error. |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3726 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3727 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3728 with a variable target. |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3729 */ |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3730 |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3731 static int |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3732 unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3733 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3734 int i = 0, j = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3735 Py_ssize_t ll = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3736 PyObject *it; /* iter(v) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3737 PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3738 PyObject *l = NULL; /* variable list */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3739 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3740 assert(v != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3741 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3742 it = PyObject_GetIter(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3743 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3744 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3745 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3746 for (; i < argcnt; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3747 w = PyIter_Next(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3748 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3749 /* Iterator done, via error or exhaustion. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3750 if (!PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3751 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3752 "need more than %d value%s to unpack", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3753 i, i == 1 ? "" : "s"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3754 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3755 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3756 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3757 *--sp = w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3758 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3759 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3760 if (argcntafter == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3761 /* We better have exhausted the iterator now. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3762 w = PyIter_Next(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3763 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3764 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3765 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3766 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3767 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3768 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3769 Py_DECREF(w); |
|
62914
983e2c0bf8dc
#3071: tell how many values were expected when unpacking too many.
Georg Brandl <georg@python.org>
parents:
62492
diff
changeset
|
3770 PyErr_Format(PyExc_ValueError, "too many values to unpack " |
|
983e2c0bf8dc
#3071: tell how many values were expected when unpacking too many.
Georg Brandl <georg@python.org>
parents:
62492
diff
changeset
|
3771 "(expected %d)", argcnt); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3772 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3773 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3774 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3775 l = PySequence_List(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3776 if (l == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3777 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3778 *--sp = l; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3779 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3780 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3781 ll = PyList_GET_SIZE(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3782 if (ll < argcntafter) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3783 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3784 argcnt + ll); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3785 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3786 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3787 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3788 /* Pop the "after-variable" args off the list. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3789 for (j = argcntafter; j > 0; j--, i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3790 *--sp = PyList_GET_ITEM(l, ll - j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3791 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3792 /* Resize the list. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3793 Py_SIZE(l) = ll - argcntafter; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3794 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3795 return 1; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3796 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3797 Error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3798 for (; i > 0; i--, sp++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3799 Py_DECREF(*sp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3800 Py_XDECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3801 return 0; |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3802 } |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3803 |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3804 |
| 567 | 3805 #ifdef LLTRACE |
| 86 | 3806 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3807 prtrace(PyObject *v, char *str) |
| 69 | 3808 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3809 printf("%s ", str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3810 if (PyObject_Print(v, stdout, 0) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3811 PyErr_Clear(); /* Don't know what else to do */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3812 printf("\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3813 return 1; |
| 69 | 3814 } |
| 86 | 3815 #endif |
| 69 | 3816 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3817 static void |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3818 call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f) |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3819 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3820 PyObject *type, *value, *traceback, *arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3821 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3822 PyErr_Fetch(&type, &value, &traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3823 if (value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3824 value = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3825 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3826 } |
|
83455
d18df4c90515
#17413: make sure settrace funcs get passed exception instances for 'value'.
R David Murray <rdmurray@bitdance.com>
parents:
78458
diff
changeset
|
3827 PyErr_NormalizeException(&type, &value, &traceback); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3828 arg = PyTuple_Pack(3, type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3829 if (arg == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3830 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3831 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3832 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3833 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3834 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3835 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3836 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3837 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3838 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3839 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3840 Py_XDECREF(traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3841 } |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3842 } |
|
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3843 |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3844 static int |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3845 call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3846 int what, PyObject *arg) |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3847 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3848 PyObject *type, *value, *traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3849 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3850 PyErr_Fetch(&type, &value, &traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3851 err = call_trace(func, obj, frame, what, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3852 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3853 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3854 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3855 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3856 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3857 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3858 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3859 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3860 Py_XDECREF(traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3861 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3862 } |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3863 } |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3864 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3865 static int |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3866 call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3867 int what, PyObject *arg) |
| 567 | 3868 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3869 register PyThreadState *tstate = frame->f_tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3870 int result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3871 if (tstate->tracing) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3872 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3873 tstate->tracing++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3874 tstate->use_tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3875 result = func(obj, frame, what, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3876 tstate->use_tracing = ((tstate->c_tracefunc != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3877 || (tstate->c_profilefunc != NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3878 tstate->tracing--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3879 return result; |
| 567 | 3880 } |
| 3881 | |
|
28556
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3882 PyObject * |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3883 _PyEval_CallTracing(PyObject *func, PyObject *args) |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3884 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3885 PyFrameObject *frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3886 PyThreadState *tstate = frame->f_tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3887 int save_tracing = tstate->tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3888 int save_use_tracing = tstate->use_tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3889 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3890 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3891 tstate->tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3892 tstate->use_tracing = ((tstate->c_tracefunc != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3893 || (tstate->c_profilefunc != NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3894 result = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3895 tstate->tracing = save_tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3896 tstate->use_tracing = save_use_tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3897 return result; |
|
28556
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3898 } |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3899 |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
54909
diff
changeset
|
3900 /* See Objects/lnotab_notes.txt for a description of how tracing works. */ |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3901 static int |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3902 maybe_call_line_trace(Py_tracefunc func, PyObject *obj, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3903 PyFrameObject *frame, int *instr_lb, int *instr_ub, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3904 int *instr_prev) |
| 24844 | 3905 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3906 int result = 0; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3907 int line = frame->f_lineno; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3908 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3909 /* If the last instruction executed isn't in the current |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3910 instruction window, reset the window. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3911 */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3912 if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3913 PyAddrPair bounds; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3914 line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3915 &bounds); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3916 *instr_lb = bounds.ap_lower; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3917 *instr_ub = bounds.ap_upper; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3918 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3919 /* If the last instruction falls at the start of a line or if |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3920 it represents a jump backwards, update the frame's line |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3921 number and call the trace function. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3922 if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3923 frame->f_lineno = line; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3924 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3925 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3926 *instr_prev = frame->f_lasti; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3927 return result; |
| 24844 | 3928 } |
| 3929 | |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3930 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3931 PyEval_SetProfile(Py_tracefunc func, PyObject *arg) |
|
18136
4cb34314bd97
Instead of initializing & interning the strings passed to the profile
Fred Drake <fdrake@acm.org>
parents:
18128
diff
changeset
|
3932 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3933 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3934 PyObject *temp = tstate->c_profileobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3935 Py_XINCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3936 tstate->c_profilefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3937 tstate->c_profileobj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3938 /* Must make sure that tracing is not ignored if 'temp' is freed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3939 tstate->use_tracing = tstate->c_tracefunc != NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3940 Py_XDECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3941 tstate->c_profilefunc = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3942 tstate->c_profileobj = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3943 /* Flag that tracing or profiling is turned on */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3944 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3945 } |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3946 |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3947 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3948 PyEval_SetTrace(Py_tracefunc func, PyObject *arg) |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3949 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3950 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3951 PyObject *temp = tstate->c_traceobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3952 _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3953 Py_XINCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3954 tstate->c_tracefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3955 tstate->c_traceobj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3956 /* Must make sure that profiling is not ignored if 'temp' is freed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3957 tstate->use_tracing = tstate->c_profilefunc != NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3958 Py_XDECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3959 tstate->c_tracefunc = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3960 tstate->c_traceobj = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3961 /* Flag that tracing or profiling is turned on */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3962 tstate->use_tracing = ((func != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3963 || (tstate->c_profilefunc != NULL)); |
|
18136
4cb34314bd97
Instead of initializing & interning the strings passed to the profile
Fred Drake <fdrake@acm.org>
parents:
18128
diff
changeset
|
3964 } |
|
4cb34314bd97
Instead of initializing & interning the strings passed to the profile
Fred Drake <fdrake@acm.org>
parents:
18128
diff
changeset
|
3965 |
| 5368 | 3966 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3967 PyEval_GetBuiltins(void) |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3968 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3969 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3970 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3971 return PyThreadState_GET()->interp->builtins; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3972 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3973 return current_frame->f_builtins; |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3974 } |
|
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3975 |
| 5368 | 3976 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3977 PyEval_GetLocals(void) |
|
1263
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3978 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3979 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3980 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3981 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3982 PyFrame_FastToLocals(current_frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3983 return current_frame->f_locals; |
|
1263
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3984 } |
|
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3985 |
| 5368 | 3986 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3987 PyEval_GetGlobals(void) |
| 69 | 3988 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3989 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3990 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3991 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3992 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3993 return current_frame->f_globals; |
| 69 | 3994 } |
| 3995 | |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3996 PyFrameObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3997 PyEval_GetFrame(void) |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3998 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3999 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4000 return _PyThreadState_GetFrame(tstate); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
4001 } |
|
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
4002 |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
4003 int |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
4004 PyEval_MergeCompilerFlags(PyCompilerFlags *cf) |
|
17124
a8301d4ed2b1
If a code object is compiled with nested scopes, define the CO_NESTED flag.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17114
diff
changeset
|
4005 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4006 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4007 int result = cf->cf_flags != 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4008 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4009 if (current_frame != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4010 const int codeflags = current_frame->f_code->co_flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4011 const int compilerflags = codeflags & PyCF_MASK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4012 if (compilerflags) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4013 result = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4014 cf->cf_flags |= compilerflags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4015 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
4016 #if 0 /* future keyword */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4017 if (codeflags & CO_GENERATOR_ALLOWED) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4018 result = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4019 cf->cf_flags |= CO_GENERATOR_ALLOWED; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4020 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
4021 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4022 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4023 return result; |
|
17124
a8301d4ed2b1
If a code object is compiled with nested scopes, define the CO_NESTED flag.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17114
diff
changeset
|
4024 } |
|
a8301d4ed2b1
If a code object is compiled with nested scopes, define the CO_NESTED flag.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17114
diff
changeset
|
4025 |
| 86 | 4026 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
4027 /* External interface to call any callable object. |
|
60130
04e775b33e9e
Merged revisions 79555 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59863
diff
changeset
|
4028 The arg must be a tuple or NULL. The kw must be a dict or NULL. */ |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
4029 |
| 5368 | 4030 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4031 PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
4032 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4033 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4034 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4035 if (arg == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4036 arg = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4037 if (arg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4038 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4039 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4040 else if (!PyTuple_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4041 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4042 "argument list must be a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4043 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4044 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4045 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4046 Py_INCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4047 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4048 if (kw != NULL && !PyDict_Check(kw)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4049 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4050 "keyword list must be a dictionary"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4051 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4052 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4053 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4054 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4055 result = PyObject_Call(func, arg, kw); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4056 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4057 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4058 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4059 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
4060 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
4061 PyEval_GetFuncName(PyObject *func) |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4062 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4063 if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4064 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4065 else if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4066 return _PyUnicode_AsString(((PyFunctionObject*)func)->func_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4067 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4068 return ((PyCFunctionObject*)func)->m_ml->ml_name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4069 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4070 return func->ob_type->tp_name; |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4071 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4072 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
4073 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
4074 PyEval_GetFuncDesc(PyObject *func) |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4075 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4076 if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4077 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4078 else if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4079 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4080 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4081 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4082 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4083 return " object"; |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4084 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4085 |
|
26141
6ce9228a3da2
Make private functions static so we don't pollute the namespace
Neal Norwitz <nnorwitz@gmail.com>
parents:
26110
diff
changeset
|
4086 static void |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4087 err_args(PyObject *func, int flags, int nargs) |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4088 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4089 if (flags & METH_NOARGS) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4090 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4091 "%.200s() takes no arguments (%d given)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4092 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4093 nargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4094 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4095 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4096 "%.200s() takes exactly one argument (%d given)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4097 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4098 nargs); |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4099 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4100 |
|
35609
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
4101 #define C_TRACE(x, call) \ |
|
32409
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
4102 if (tstate->use_tracing && tstate->c_profilefunc) { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4103 if (call_trace(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4104 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4105 tstate->frame, PyTrace_C_CALL, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4106 func)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4107 x = NULL; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4108 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4109 else { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4110 x = call; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4111 if (tstate->c_profilefunc != NULL) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4112 if (x == NULL) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4113 call_trace_protected(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4114 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4115 tstate->frame, PyTrace_C_EXCEPTION, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4116 func); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4117 /* XXX should pass (type, value, tb) */ \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4118 } else { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4119 if (call_trace(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4120 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4121 tstate->frame, PyTrace_C_RETURN, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4122 func)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4123 Py_DECREF(x); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4124 x = NULL; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4125 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4126 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4127 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4128 } \ |
|
32409
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
4129 } else { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4130 x = call; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4131 } |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
4132 |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4133 static PyObject * |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
4134 call_function(PyObject ***pp_stack, int oparg |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
4135 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4136 , uint64* pintr0, uint64* pintr1 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
4137 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4138 ) |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4139 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4140 int na = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4141 int nk = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4142 int n = na + 2 * nk; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4143 PyObject **pfunc = (*pp_stack) - n - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4144 PyObject *func = *pfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4145 PyObject *x, *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4146 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4147 /* Always dispatch PyCFunction first, because these are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4148 presumed to be the most frequent callable object. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4149 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4150 if (PyCFunction_Check(func) && nk == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4151 int flags = PyCFunction_GET_FLAGS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4152 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4153 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4154 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4155 if (flags & (METH_NOARGS | METH_O)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4156 PyCFunction meth = PyCFunction_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4157 PyObject *self = PyCFunction_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4158 if (flags & METH_NOARGS && na == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4159 C_TRACE(x, (*meth)(self,NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4160 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4161 else if (flags & METH_O && na == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4162 PyObject *arg = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4163 C_TRACE(x, (*meth)(self,arg)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4164 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4165 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4166 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4167 err_args(func, flags, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4168 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4169 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4170 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4171 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4172 PyObject *callargs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4173 callargs = load_args(pp_stack, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4174 READ_TIMESTAMP(*pintr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4175 C_TRACE(x, PyCFunction_Call(func,callargs,NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4176 READ_TIMESTAMP(*pintr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4177 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4178 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4179 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4180 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4181 /* optimize access to bound methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4182 PyObject *self = PyMethod_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4183 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4184 PCALL(PCALL_BOUND_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4185 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4186 func = PyMethod_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4187 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4188 Py_DECREF(*pfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4189 *pfunc = self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4190 na++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4191 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4192 } else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4193 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4194 READ_TIMESTAMP(*pintr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4195 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4196 x = fast_function(func, pp_stack, n, na, nk); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4197 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4198 x = do_call(func, pp_stack, na, nk); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4199 READ_TIMESTAMP(*pintr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4200 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4201 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4202 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4203 /* Clear the stack of the function object. Also removes |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4204 the arguments in case they weren't consumed already |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4205 (fast_function() and err_args() leave them on the stack). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4206 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4207 while ((*pp_stack) > pfunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4208 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4209 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4210 PCALL(PCALL_POP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4211 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4212 return x; |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4213 } |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4214 |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4215 /* The fast_function() function optimize calls for which no argument |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4216 tuple is necessary; the objects are passed directly from the stack. |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4217 For the simplest case -- a function that takes only positional |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4218 arguments and is called with only positional arguments -- it |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4219 inlines the most primitive frame setup code from |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4220 PyEval_EvalCodeEx(), which vastly reduces the checks that must be |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4221 done before evaluating the frame. |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4222 */ |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4223 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4224 static PyObject * |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4225 fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4226 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4227 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4228 PyObject *globals = PyFunction_GET_GLOBALS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4229 PyObject *argdefs = PyFunction_GET_DEFAULTS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4230 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4231 PyObject **d = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4232 int nd = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4233 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4234 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4235 PCALL(PCALL_FAST_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4236 if (argdefs == NULL && co->co_argcount == n && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4237 co->co_kwonlyargcount == 0 && nk==0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4238 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4239 PyFrameObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4240 PyObject *retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4241 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4242 PyObject **fastlocals, **stack; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4243 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4244 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4245 PCALL(PCALL_FASTER_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4246 assert(globals != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4247 /* XXX Perhaps we should create a specialized |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4248 PyFrame_New() that doesn't take locals, but does |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4249 take builtins without sanity checking them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4250 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4251 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4252 f = PyFrame_New(tstate, co, globals, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4253 if (f == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4254 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4255 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4256 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4257 stack = (*pp_stack) - n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4258 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4259 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4260 Py_INCREF(*stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4261 fastlocals[i] = *stack++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4262 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4263 retval = PyEval_EvalFrameEx(f,0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4264 ++tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4265 Py_DECREF(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4266 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4267 return retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4268 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4269 if (argdefs != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4270 d = &PyTuple_GET_ITEM(argdefs, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4271 nd = Py_SIZE(argdefs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4272 } |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
4273 return PyEval_EvalCodeEx((PyObject*)co, globals, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4274 (PyObject *)NULL, (*pp_stack)-n, na, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4275 (*pp_stack)-2*nk, nk, d, nd, kwdefs, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4276 PyFunction_GET_CLOSURE(func)); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4277 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4278 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4279 static PyObject * |
|
15899
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15830
diff
changeset
|
4280 update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack, |
|
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15830
diff
changeset
|
4281 PyObject *func) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4282 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4283 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4284 if (orig_kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4285 kwdict = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4286 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4287 kwdict = PyDict_Copy(orig_kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4288 Py_DECREF(orig_kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4289 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4290 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4291 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4292 while (--nk >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4293 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4294 PyObject *value = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4295 PyObject *key = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4296 if (PyDict_GetItem(kwdict, key) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4297 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4298 "%.200s%s got multiple values " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4299 "for keyword argument '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4300 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4301 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4302 key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4303 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4304 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4305 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4306 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4307 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4308 err = PyDict_SetItem(kwdict, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4309 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4310 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4311 if (err) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4312 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4313 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4314 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4315 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4316 return kwdict; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4317 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4318 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4319 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4320 update_star_args(int nstack, int nstar, PyObject *stararg, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4321 PyObject ***pp_stack) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4322 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4323 PyObject *callargs, *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4324 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4325 callargs = PyTuple_New(nstack + nstar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4326 if (callargs == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4327 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4328 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4329 if (nstar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4330 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4331 for (i = 0; i < nstar; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4332 PyObject *a = PyTuple_GET_ITEM(stararg, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4333 Py_INCREF(a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4334 PyTuple_SET_ITEM(callargs, nstack + i, a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4335 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4336 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4337 while (--nstack >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4338 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4339 PyTuple_SET_ITEM(callargs, nstack, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4340 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4341 return callargs; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4342 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4343 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4344 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4345 load_args(PyObject ***pp_stack, int na) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4346 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4347 PyObject *args = PyTuple_New(na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4348 PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4349 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4350 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4351 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4352 while (--na >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4353 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4354 PyTuple_SET_ITEM(args, na, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4355 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4356 return args; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4357 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4358 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4359 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4360 do_call(PyObject *func, PyObject ***pp_stack, int na, int nk) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4361 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4362 PyObject *callargs = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4363 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4364 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4365 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4366 if (nk > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4367 kwdict = update_keyword_args(NULL, nk, pp_stack, func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4368 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4369 goto call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4370 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4371 callargs = load_args(pp_stack, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4372 if (callargs == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4373 goto call_fail; |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4374 #ifdef CALL_PROFILE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4375 /* At this point, we have to look at the type of func to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4376 update the call stats properly. Do it here so as to avoid |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4377 exposing the call stats machinery outside ceval.c |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4378 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4379 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4380 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4381 else if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4382 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4383 else if (PyType_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4384 PCALL(PCALL_TYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4385 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4386 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4387 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4388 PCALL(PCALL_OTHER); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4389 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4390 if (PyCFunction_Check(func)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4391 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4392 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4393 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4394 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4395 result = PyObject_Call(func, callargs, kwdict); |
| 43411 | 4396 call_fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4397 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4398 Py_XDECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4399 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4400 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4401 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4402 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4403 ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4404 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4405 int nstar = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4406 PyObject *callargs = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4407 PyObject *stararg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4408 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4409 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4410 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4411 if (flags & CALL_FLAG_KW) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4412 kwdict = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4413 if (!PyDict_Check(kwdict)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4414 PyObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4415 d = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4416 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4417 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4418 if (PyDict_Update(d, kwdict) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4419 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4420 /* PyDict_Update raises attribute |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4421 * error (percolated from an attempt |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4422 * to get 'keys' attribute) instead of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4423 * a type error if its second argument |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4424 * is not a mapping. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4425 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4426 if (PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4427 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4428 "%.200s%.200s argument after ** " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4429 "must be a mapping, not %.200s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4430 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4431 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4432 kwdict->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4433 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4434 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4435 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4436 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4437 kwdict = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4438 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4439 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4440 if (flags & CALL_FLAG_VAR) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4441 stararg = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4442 if (!PyTuple_Check(stararg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4443 PyObject *t = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4444 t = PySequence_Tuple(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4445 if (t == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4446 if (PyErr_ExceptionMatches(PyExc_TypeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4447 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4448 "%.200s%.200s argument after * " |
|
68822
d3ae3fe3eb97
Issue #7330, #10833: Replace %100s by %.100s and %200s by %.200s
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68587
diff
changeset
|
4449 "must be a sequence, not %.200s", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4450 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4451 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4452 stararg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4453 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4454 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4455 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4456 Py_DECREF(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4457 stararg = t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4458 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4459 nstar = PyTuple_GET_SIZE(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4460 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4461 if (nk > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4462 kwdict = update_keyword_args(kwdict, nk, pp_stack, func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4463 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4464 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4465 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4466 callargs = update_star_args(na, nstar, stararg, pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4467 if (callargs == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4468 goto ext_call_fail; |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4469 #ifdef CALL_PROFILE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4470 /* At this point, we have to look at the type of func to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4471 update the call stats properly. Do it here so as to avoid |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4472 exposing the call stats machinery outside ceval.c |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4473 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4474 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4475 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4476 else if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4477 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4478 else if (PyType_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4479 PCALL(PCALL_TYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4480 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4481 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4482 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4483 PCALL(PCALL_OTHER); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4484 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4485 if (PyCFunction_Check(func)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4486 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4487 C_TRACE(result, PyCFunction_Call(func, callargs, kwdict)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4488 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4489 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4490 result = PyObject_Call(func, callargs, kwdict); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
4491 ext_call_fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4492 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4493 Py_XDECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4494 Py_XDECREF(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4495 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4496 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4497 |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4498 /* Extract a slice index from a PyInt or PyLong or an object with the |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4499 nb_index slot defined, and store in *pi. |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4500 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4501 and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. |
|
36558
d3685f9b7b71
Remove size constraints in SLICE opcodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
4502 Return 0 on error, 1 on success. |
|
21440
30efe46f8e3c
_PyEval_SliceIndex(): Repaired the comments, and added XXX comments
Tim Peters <tim.peters@gmail.com>
parents:
21398
diff
changeset
|
4503 */ |
|
21441
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4504 /* Note: If v is NULL, return success without storing into *pi. This |
|
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4505 is because_PyEval_SliceIndex() is called by apply_slice(), which can be |
|
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4506 called by the SLICE opcode with v and/or w equal to NULL. |
|
21440
30efe46f8e3c
_PyEval_SliceIndex(): Repaired the comments, and added XXX comments
Tim Peters <tim.peters@gmail.com>
parents:
21398
diff
changeset
|
4507 */ |
| 12614 | 4508 int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
4509 _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) |
| 69 | 4510 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4511 if (v != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4512 Py_ssize_t x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4513 if (PyIndex_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4514 x = PyNumber_AsSsize_t(v, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4515 if (x == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4516 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4517 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4518 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4519 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4520 "slice indices must be integers or " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4521 "None or have an __index__ method"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4522 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4523 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4524 *pi = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4525 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4526 return 1; |
| 69 | 4527 } |
| 4528 | |
|
42132
863ed7cd45dc
Merged revisions 56020-56124 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
4529 #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4530 "BaseException is not allowed" |
|
40942
4b9d0dac79cc
You can no longer catch non-BaseException objects; TypeError is raised if such
Brett Cannon <bcannon@gmail.com>
parents:
40937
diff
changeset
|
4531 |
| 5368 | 4532 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4533 cmp_outcome(int op, register PyObject *v, register PyObject *w) |
| 69 | 4534 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4535 int res = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4536 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4537 case PyCmp_IS: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4538 res = (v == w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4539 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4540 case PyCmp_IS_NOT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4541 res = (v != w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4542 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4543 case PyCmp_IN: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4544 res = PySequence_Contains(w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4545 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4546 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4547 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4548 case PyCmp_NOT_IN: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4549 res = PySequence_Contains(w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4550 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4551 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4552 res = !res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4553 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4554 case PyCmp_EXC_MATCH: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4555 if (PyTuple_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4556 Py_ssize_t i, length; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4557 length = PyTuple_Size(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4558 for (i = 0; i < length; i += 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4559 PyObject *exc = PyTuple_GET_ITEM(w, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4560 if (!PyExceptionClass_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4561 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4562 CANNOT_CATCH_MSG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4563 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4564 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4565 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4566 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4567 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4568 if (!PyExceptionClass_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4569 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4570 CANNOT_CATCH_MSG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4571 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4572 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4573 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4574 res = PyErr_GivenExceptionMatches(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4575 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4576 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4577 return PyObject_RichCompare(v, w, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4578 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4579 v = res ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4580 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4581 return v; |
| 69 | 4582 } |
| 4583 | |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4584 static PyObject * |
|
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4585 import_from(PyObject *v, PyObject *name) |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4586 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4587 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4588 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4589 x = PyObject_GetAttr(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4590 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
84103
8a0ed9f63c6e
Issue #15767: Introduce ModuleNotFoundError, a subclass of
Brett Cannon <brett@python.org>
parents:
83800
diff
changeset
|
4591 PyErr_Format(PyExc_ModuleNotFoundError, "cannot import name %S", name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4592 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4593 return x; |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4594 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4595 |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4596 static int |
|
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4597 import_all_from(PyObject *locals, PyObject *v) |
|
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4598 { |
|
72926
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4599 _Py_IDENTIFIER(__all__); |
|
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4600 _Py_IDENTIFIER(__dict__); |
|
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4601 PyObject *all = _PyObject_GetAttrId(v, &PyId___all__); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4602 PyObject *dict, *name, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4603 int skip_leading_underscores = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4604 int pos, err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4605 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4606 if (all == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4607 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4608 return -1; /* Unexpected error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4609 PyErr_Clear(); |
|
72926
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4610 dict = _PyObject_GetAttrId(v, &PyId___dict__); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4611 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4612 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4613 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4614 PyErr_SetString(PyExc_ImportError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4615 "from-import-* object has no __dict__ and no __all__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4616 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4617 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4618 all = PyMapping_Keys(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4619 Py_DECREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4620 if (all == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4621 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4622 skip_leading_underscores = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4623 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4624 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4625 for (pos = 0, err = 0; ; pos++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4626 name = PySequence_GetItem(all, pos); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4627 if (name == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4628 if (!PyErr_ExceptionMatches(PyExc_IndexError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4629 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4630 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4631 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4632 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4633 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4634 if (skip_leading_underscores && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4635 PyUnicode_Check(name) && |
| 72475 | 4636 PyUnicode_READY(name) != -1 && |
| 4637 PyUnicode_READ_CHAR(name, 0) == '_') | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4638 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4639 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4640 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4641 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4642 value = PyObject_GetAttr(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4643 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4644 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4645 else if (PyDict_CheckExact(locals)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4646 err = PyDict_SetItem(locals, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4647 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4648 err = PyObject_SetItem(locals, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4649 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4650 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4651 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4652 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4653 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4654 Py_DECREF(all); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4655 return err; |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4656 } |
|
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4657 |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4658 static void |
| 42860 | 4659 format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj) |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4660 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4661 const char *obj_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4662 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4663 if (!obj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4664 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4665 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4666 obj_str = _PyUnicode_AsString(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4667 if (!obj_str) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4668 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4669 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4670 PyErr_Format(exc, format_str, obj_str); |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4671 } |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4672 |
|
64620
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4673 static void |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4674 format_exc_unbound(PyCodeObject *co, int oparg) |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4675 { |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4676 PyObject *name; |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4677 /* Don't stomp existing exception */ |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4678 if (PyErr_Occurred()) |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4679 return; |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4680 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) { |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4681 name = PyTuple_GET_ITEM(co->co_cellvars, |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4682 oparg); |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4683 format_exc_check_arg( |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4684 PyExc_UnboundLocalError, |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4685 UNBOUNDLOCAL_ERROR_MSG, |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4686 name); |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4687 } else { |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4688 name = PyTuple_GET_ITEM(co->co_freevars, oparg - |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4689 PyTuple_GET_SIZE(co->co_cellvars)); |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4690 format_exc_check_arg(PyExc_NameError, |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4691 UNBOUNDFREE_ERROR_MSG, name); |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4692 } |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4693 } |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4694 |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4695 static PyObject * |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4696 unicode_concatenate(PyObject *v, PyObject *w, |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4697 PyFrameObject *f, unsigned char *next_instr) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4698 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4699 PyObject *res; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4700 if (Py_REFCNT(v) == 2) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4701 /* In the common case, there are 2 references to the value |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4702 * stored in 'variable' when the += is performed: one on the |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4703 * value stack (in 'v') and one still stored in the |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4704 * 'variable'. We try to delete the variable now to reduce |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4705 * the refcnt to 1. |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4706 */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4707 switch (*next_instr) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4708 case STORE_FAST: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4709 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4710 int oparg = PEEKARG(); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4711 PyObject **fastlocals = f->f_localsplus; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4712 if (GETLOCAL(oparg) == v) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4713 SETLOCAL(oparg, NULL); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4714 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4715 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4716 case STORE_DEREF: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4717 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4718 PyObject **freevars = (f->f_localsplus + |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4719 f->f_code->co_nlocals); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4720 PyObject *c = freevars[PEEKARG()]; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4721 if (PyCell_GET(c) == v) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4722 PyCell_Set(c, NULL); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4723 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4724 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4725 case STORE_NAME: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4726 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4727 PyObject *names = f->f_code->co_names; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4728 PyObject *name = GETITEM(names, PEEKARG()); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4729 PyObject *locals = f->f_locals; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4730 if (PyDict_CheckExact(locals) && |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4731 PyDict_GetItem(locals, name) == v) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4732 if (PyDict_DelItem(locals, name) != 0) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4733 PyErr_Clear(); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4734 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4735 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4736 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4737 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4738 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4739 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4740 res = v; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4741 PyUnicode_Append(&res, w); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4742 return res; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4743 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4744 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4745 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4746 |
|
20438
08d7a6756bfe
make getarray static - it's only called from ceval.c and is not an
Skip Montanaro <skip@pobox.com>
parents:
20409
diff
changeset
|
4747 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4748 getarray(long a[256]) |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4749 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4750 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4751 PyObject *l = PyList_New(256); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4752 if (l == NULL) return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4753 for (i = 0; i < 256; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4754 PyObject *x = PyLong_FromLong(a[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4755 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4756 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4757 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4758 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4759 PyList_SetItem(l, i, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4760 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4761 for (i = 0; i < 256; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4762 a[i] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4763 return l; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4764 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4765 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4766 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4767 _Py_GetDXProfile(PyObject *self, PyObject *args) |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4768 { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4769 #ifndef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4770 return getarray(dxp); |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4771 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4772 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4773 PyObject *l = PyList_New(257); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4774 if (l == NULL) return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4775 for (i = 0; i < 257; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4776 PyObject *x = getarray(dxpairs[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4777 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4778 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4779 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4780 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4781 PyList_SetItem(l, i, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4782 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4783 return l; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4784 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4785 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4786 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4787 #endif |
