Mercurial > cpython-lru_cache-weakref
annotate Python/ceval.c @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | db4aa878cea2 |
| children | e1dbc72bd97f |
| 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 *); |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
141 static PyObject * special_lookup(PyObject *, char *, PyObject **); |
|
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" |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
145 #define GLOBAL_NAME_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
146 "global name '%.200s' is not defined" |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
147 #define UNBOUNDLOCAL_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
148 "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
|
149 #define UNBOUNDFREE_ERROR_MSG \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
150 "free variable '%.200s' referenced before assignment" \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
151 " in enclosing scope" |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
152 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
153 /* Dynamic execution profile */ |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
154 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
155 #ifdef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
156 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
|
157 #define dxp dxpairs[256] |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
158 #else |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
159 static long dxp[256]; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
160 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
161 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
162 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
163 /* 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
|
164 #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
|
165 #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
|
166 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
|
167 |
|
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_ALL 0 |
|
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_FUNCTION 1 |
|
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_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
|
171 #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
|
172 #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
|
173 #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
|
174 #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
|
175 #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
|
176 #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
|
177 #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
|
178 #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
|
179 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
180 /* 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
|
181 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
182 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
|
183 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
184 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
|
185 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
|
186 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
187 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
|
188 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
|
189 twice. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
190 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 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
|
195 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
|
196 */ |
|
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 #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
|
199 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
200 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
201 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
|
202 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
203 return Py_BuildValue("iiiiiiiiiii", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 } |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
208 #else |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
209 #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
|
210 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
211 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
212 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
|
213 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
214 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
215 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
|
216 } |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
217 #endif |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
218 |
|
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
|
219 |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
220 #ifdef WITH_THREAD |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
221 #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
|
222 #else |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
223 #define GIL_REQUEST 0 |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
224 #endif |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
225 |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
226 /* 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
|
227 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
|
228 the GIL eventually anyway. */ |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
229 #define COMPUTE_EVAL_BREAKER() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
230 _Py_atomic_store_relaxed( \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
231 &eval_breaker, \ |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
232 GIL_REQUEST | \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
233 _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
|
234 pending_async_exc) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
235 |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
236 #ifdef WITH_THREAD |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
237 |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
238 #define SET_GIL_DROP_REQUEST() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
239 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
240 _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
|
241 _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
|
242 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
243 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
244 #define RESET_GIL_DROP_REQUEST() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
245 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
246 _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
|
247 COMPUTE_EVAL_BREAKER(); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
248 } while (0) |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
249 |
|
64628
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
250 #endif |
|
56844b716cd7
remove gil_drop_request in --without-threads
Benjamin Peterson <benjamin@python.org>
parents:
64624
diff
changeset
|
251 |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
252 /* Pending calls are only modified under pending_lock */ |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
253 #define SIGNAL_PENDING_CALLS() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
254 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
255 _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
|
256 _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
|
257 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
258 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
259 #define UNSIGNAL_PENDING_CALLS() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
260 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
261 _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
|
262 COMPUTE_EVAL_BREAKER(); \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
263 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
264 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
265 #define SIGNAL_ASYNC_EXC() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
266 do { \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
267 pending_async_exc = 1; \ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
268 _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
|
269 } while (0) |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
270 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
271 #define UNSIGNAL_ASYNC_EXC() \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
272 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
|
273 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
274 |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
275 #ifdef WITH_THREAD |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
276 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
277 #ifdef HAVE_ERRNO_H |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
278 #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
|
279 #endif |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9048
diff
changeset
|
280 #include "pythread.h" |
| 926 | 281 |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
282 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
|
283 static long main_thread = 0; |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
284 /* 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
|
285 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
|
286 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
|
287 /* 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
|
288 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
|
289 /* 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
|
290 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
|
291 /* 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
|
292 Guarded by the GIL. */ |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
60130
diff
changeset
|
293 static int pending_async_exc = 0; |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
294 |
|
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
295 #include "ceval_gil.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
296 |
|
33715
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
297 int |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
298 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
|
299 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
300 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
|
301 } |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
302 |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
303 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
304 PyEval_InitThreads(void) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
305 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
306 if (gil_created()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
307 return; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
308 create_gil(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
309 take_gil(PyThreadState_GET()); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
310 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
|
311 if (!pending_lock) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
312 pending_lock = PyThread_allocate_lock(); |
| 926 | 313 } |
| 314 | |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
315 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
|
316 _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
|
317 { |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
318 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
|
319 return; |
|
557e2537c9ae
Issue #9828: Destroy the GIL in Py_Finalize(), so that it gets properly
Antoine Pitrou <solipsis@pitrou.net>
parents:
64634
diff
changeset
|
320 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
|
321 assert(!gil_created()); |
| 926 | 322 } |
| 323 | |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
324 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
325 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
|
326 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
327 PyThreadState *tstate = PyThreadState_GET(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
328 if (tstate == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
329 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
|
330 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
|
331 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
332 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
333 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
334 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
|
335 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
336 /* 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
|
337 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
|
338 in debug mode. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
339 */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
340 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
|
341 &_PyThreadState_Current)); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
342 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
343 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
344 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
345 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
|
346 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
347 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
348 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
|
349 /* 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
|
350 assert(gil_created()); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
351 take_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
352 if (PyThreadState_Swap(tstate) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
353 Py_FatalError( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
354 "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
|
355 } |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
356 |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
357 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
358 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
|
359 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
360 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
361 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
|
362 if (PyThreadState_Swap(NULL) != tstate) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
363 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
|
364 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
|
365 } |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
366 |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
367 /* This function is called from PyOS_AfterFork to ensure that newly |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
368 created child processes don't hold locks referring to threads which |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
369 are not running in the child process. (This could also be done using |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
370 pthread_atfork mechanism, at least for the pthreads implementation.) */ |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
371 |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
372 void |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
373 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
|
374 { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
375 _Py_IDENTIFIER(_after_fork); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
376 PyObject *threading, *result; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
377 PyThreadState *tstate = PyThreadState_GET(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
378 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
379 if (!gil_created()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
380 return; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
381 recreate_gil(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
382 pending_lock = PyThread_allocate_lock(); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
383 take_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
384 main_thread = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
385 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
386 /* 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
|
387 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
388 tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
389 threading = PyMapping_GetItemString(tstate->interp->modules, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
390 "threading"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
391 if (threading == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
392 /* threading not imported */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
393 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
394 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
395 } |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72605
diff
changeset
|
396 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
|
397 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
398 PyErr_WriteUnraisable(threading); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
399 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
400 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
401 Py_DECREF(threading); |
|
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_RERAISE = 0x0004, /* Exception re-raised by 'finally' */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
746 WHY_RETURN = 0x0008, /* 'return' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
747 WHY_BREAK = 0x0010, /* 'break' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
748 WHY_CONTINUE = 0x0020, /* 'continue' statement */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
749 WHY_YIELD = 0x0040, /* 'yield' operator */ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
750 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
|
751 }; |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
752 |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
753 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
|
754 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
|
755 static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *); |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
756 static enum why_code 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
|
757 static int unpack_iterable(PyObject *, int, int, PyObject **); |
| 5018 | 758 |
|
50045
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
759 /* 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
|
760 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
|
761 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
|
762 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
|
763 fast_next_opcode*/ |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
764 static int _Py_TracingPossible = 0; |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
765 |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
57004
diff
changeset
|
766 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
767 |
| 5368 | 768 PyObject * |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
769 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
|
770 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
771 return PyEval_EvalCodeEx(co, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
772 globals, locals, |
|
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 (PyObject **)NULL, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
776 NULL, NULL); |
|
2844
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 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
780 /* Interpreter main loop */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
781 |
|
32421
485d2ef43419
Patch #966493: Cleanup generator/eval_frame exposure.
Martin v. Löwis <martin@v.loewis.de>
parents:
32412
diff
changeset
|
782 PyObject * |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
783 PyEval_EvalFrame(PyFrameObject *f) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
784 /* 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
|
785 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
|
786 PyEval_EvalFrameEx() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
787 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
|
788 } |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
789 |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
790 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
|
791 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
|
792 { |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
793 #ifdef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
794 int lastopcode = 0; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
795 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
796 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
|
797 register unsigned char *next_instr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
798 register int opcode; /* Current opcode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
799 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
|
800 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
|
801 register int err; /* Error status -- nonzero if error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
802 register PyObject *x; /* Result object -- NULL if error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
803 register PyObject *v; /* Temporary objects popped off stack */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
804 register PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
805 register PyObject *u; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
806 register PyObject *t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
807 register PyObject **fastlocals, **freevars; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
808 PyObject *retval = NULL; /* Return value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
809 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
810 PyCodeObject *co; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
811 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
812 /* 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
|
813 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
814 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
|
815 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
816 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
|
817 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
|
818 time it is tested. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
819 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
|
820 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
821 unsigned char *first_instr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
822 PyObject *names; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
823 PyObject *consts; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
824 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
825 /* Computed GOTOs, or |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
826 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
|
827 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
|
828 (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
|
829 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
830 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
|
831 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
|
832 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
|
833 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
|
834 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
|
835 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
|
836 several identical opcodes). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
837 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
838 "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
|
839 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
|
840 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
|
841 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
|
842 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
|
843 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
|
844 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
845 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
|
846 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
|
847 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
|
848 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
|
849 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
850 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
|
851 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
|
852 CPU architecture. |
|
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 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
|
855 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
|
856 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
857 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
858 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
|
859 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
|
860 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
|
861 -fno-crossjumping). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
862 */ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
863 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
864 #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
|
865 #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
|
866 #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
|
867 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
868 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
869 #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
|
870 #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
|
871 #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
|
872 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
873 #else |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
874 #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
|
875 #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
|
876 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
877 #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
|
878 #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
|
879 #endif |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
880 |
|
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
881 #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
|
882 /* 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
|
883 #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
|
884 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
885 /* 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
|
886 (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
|
887 #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
|
888 TARGET_##op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
889 opcode = op; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
890 if (HAS_ARG(op)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
891 oparg = NEXTARG(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
892 case op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
893 goto impl; \ |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
894 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
895 #define TARGET(op) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
896 TARGET_##op: \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
897 opcode = op; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
898 if (HAS_ARG(op)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
899 oparg = NEXTARG(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
900 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
901 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
902 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
903 #define DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
904 { \ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
905 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
|
906 FAST_DISPATCH(); \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
907 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
908 continue; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
909 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
910 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
911 #ifdef LLTRACE |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
912 #define FAST_DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
913 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
914 if (!lltrace && !_Py_TracingPossible) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
915 f->f_lasti = INSTR_OFFSET(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
916 goto *opcode_targets[*next_instr++]; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
917 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
918 goto fast_next_opcode; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
919 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
920 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
921 #define FAST_DISPATCH() \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
922 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
923 if (!_Py_TracingPossible) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
924 f->f_lasti = INSTR_OFFSET(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
925 goto *opcode_targets[*next_instr++]; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
926 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
927 goto fast_next_opcode; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
928 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
929 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
930 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
931 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
932 #define TARGET(op) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
933 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
934 #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
|
935 /* silence compiler warnings about `impl` unused */ \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
936 if (0) goto impl; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
937 case op: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
938 #define DISPATCH() continue |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
939 #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
|
940 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
941 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
942 |
|
24232
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
943 /* 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
|
944 |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
945 #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
|
946 #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
|
947 #else |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
948 #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
|
949 #endif |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
950 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
951 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
952 /* 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
|
953 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
|
954 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
|
955 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
|
956 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
|
957 (may be skipped) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
958 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
|
959 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
|
960 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
961 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
|
962 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
|
963 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
|
964 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
|
965 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
|
966 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
967 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
|
968 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
|
969 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
|
970 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
971 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
|
972 cases: |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
973 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
974 IMPORT_STAR |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
975 IMPORT_FROM |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
976 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
|
977 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
978 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
979 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
|
980 int ticked = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
981 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
982 READ_TIMESTAMP(inst0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
983 READ_TIMESTAMP(inst1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
984 READ_TIMESTAMP(loop0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
985 READ_TIMESTAMP(loop1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
986 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
987 /* shut up the compiler */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
988 opcode = 0; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
989 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
990 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
991 /* Code access macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
992 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
993 #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
|
994 #define NEXTOP() (*next_instr++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
995 #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
|
996 #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
|
997 #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
|
998 #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
|
999 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1000 /* OpCode prediction macros |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1001 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
|
1002 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
|
1003 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
|
1004 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
|
1005 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1006 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
|
1007 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
|
1008 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
|
1009 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
|
1010 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
|
1011 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
|
1012 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
|
1013 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
|
1014 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
|
1015 |
|
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
|
1016 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
|
1017 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
|
1018 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
|
1019 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
|
1020 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1021 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
|
1022 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
|
1023 opcode. |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1024 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1025 */ |
|
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1026 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
1027 #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
|
1028 #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
|
1029 #define PREDICTED(op) PRED_##op: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1030 #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
|
1031 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1032 #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
|
1033 #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
|
1034 #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
|
1035 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1036 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
1037 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1038 /* Stack manipulation macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1039 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
1040 /* 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
|
1041 co_stacksize are ints. */ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1042 #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
|
1043 #define EMPTY() (STACK_LEVEL() == 0) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1044 #define TOP() (stack_pointer[-1]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1045 #define SECOND() (stack_pointer[-2]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1046 #define THIRD() (stack_pointer[-3]) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1047 #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
|
1048 #define PEEK(n) (stack_pointer[-(n)]) |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1049 #define SET_TOP(v) (stack_pointer[-1] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1050 #define SET_SECOND(v) (stack_pointer[-2] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1051 #define SET_THIRD(v) (stack_pointer[-3] = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1052 #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
|
1053 #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
|
1054 #define BASIC_STACKADJ(n) (stack_pointer += n) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1055 #define BASIC_PUSH(v) (*stack_pointer++ = (v)) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1056 #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
|
1057 |
| 567 | 1058 #ifdef LLTRACE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1059 #define PUSH(v) { (void)(BASIC_PUSH(v), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1060 lltrace && prtrace(TOP(), "push")); \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1061 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
|
1062 #define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1063 BASIC_POP()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1064 #define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1065 lltrace && prtrace(TOP(), "stackadj")); \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1066 assert(STACK_LEVEL() <= co->co_stacksize); } |
|
44310
e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44187
diff
changeset
|
1067 #define EXT_POP(STACK_POINTER) ((void)(lltrace && \ |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1068 prtrace((STACK_POINTER)[-1], "ext_pop")), \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1069 *--(STACK_POINTER)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1070 #else |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1071 #define PUSH(v) BASIC_PUSH(v) |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1072 #define POP() BASIC_POP() |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1073 #define STACKADJ(n) BASIC_STACKADJ(n) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
1074 #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
|
1075 #endif |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1076 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1077 /* Local variable macros */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1078 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1079 #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
|
1080 |
|
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 /* 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
|
1082 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
|
1083 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
|
1084 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
|
1085 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
|
1086 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
|
1087 #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
|
1088 GETLOCAL(i) = value; \ |
|
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1089 Py_XDECREF(tmp); } while (0) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1090 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1091 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1092 #define UNWIND_BLOCK(b) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1093 while (STACK_LEVEL() > (b)->b_level) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1094 PyObject *v = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1095 Py_XDECREF(v); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1096 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1097 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1098 #define UNWIND_EXCEPT_HANDLER(b) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1099 { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1100 PyObject *type, *value, *traceback; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1101 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
|
1102 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
|
1103 value = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1104 Py_XDECREF(value); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1105 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1106 type = tstate->exc_type; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1107 value = tstate->exc_value; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1108 traceback = tstate->exc_traceback; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1109 tstate->exc_type = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1110 tstate->exc_value = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1111 tstate->exc_traceback = POP(); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1112 Py_XDECREF(type); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1113 Py_XDECREF(value); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1114 Py_XDECREF(traceback); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1115 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1116 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1117 /* Start of code */ |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1118 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1119 /* push frame */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1120 if (Py_EnterRecursiveCall("")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1121 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1122 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1123 tstate->frame = f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1124 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1125 if (tstate->use_tracing) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1126 if (tstate->c_tracefunc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1127 /* 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
|
1128 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
|
1129 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
|
1130 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
|
1131 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
|
1132 (Actually, the function must return itself |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1133 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
|
1134 functions are called with three arguments: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1135 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
|
1136 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
|
1137 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
|
1138 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
|
1139 whenever an exception is detected. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1140 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
|
1141 tstate->c_traceobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1142 f, PyTrace_CALL, Py_None)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1143 /* Trace function raised an error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1144 goto exit_eval_frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1145 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1146 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1147 if (tstate->c_profilefunc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1148 /* 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
|
1149 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
|
1150 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
|
1151 tstate->c_profileobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1152 f, PyTrace_CALL, Py_None)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1153 /* Profile function raised an error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1154 goto exit_eval_frame; |
|
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 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1157 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1158 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1159 co = f->f_code; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1160 names = co->co_names; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1161 consts = co->co_consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1162 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1163 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
|
1164 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
|
1165 /* 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
|
1166 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1167 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
|
1168 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
|
1169 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
|
1170 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
|
1171 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
|
1172 does work. Promise. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1173 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1174 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
|
1175 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
|
1176 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
|
1177 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
|
1178 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
|
1179 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
|
1180 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
|
1181 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1182 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
|
1183 stack_pointer = f->f_stacktop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1184 assert(stack_pointer != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1185 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
|
1186 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1187 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
|
1188 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
|
1189 /* 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
|
1190 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
|
1191 (see YIELD_VALUE). */ |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1192 swap_exc_state(tstate, f); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1193 } |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1194 else |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
1195 save_exc_state(tstate, f); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1196 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1197 |
|
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
|
1198 #ifdef LLTRACE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1199 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != 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
|
1200 #endif |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1201 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1202 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1203 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1204 x = Py_None; /* Not a reference, just anything non-NULL */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1205 w = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1206 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1207 if (throwflag) { /* support for generator.throw() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1208 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1209 goto on_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1210 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1211 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1212 for (;;) { |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1213 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1214 if (inst1 == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1215 /* 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
|
1216 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
|
1217 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
|
1218 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1219 READ_TIMESTAMP(inst1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1220 loop1 = inst1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1221 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1222 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
|
1223 intr0, intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1224 ticked = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1225 inst1 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1226 intr0 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1227 intr1 = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1228 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
|
1229 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1230 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
|
1231 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
|
1232 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1233 /* 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
|
1234 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
|
1235 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
|
1236 ``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
|
1237 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
|
1238 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
|
1239 Py_MakePendingCalls() above. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1240 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1241 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
|
1242 if (*next_instr == SETUP_FINALLY) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1243 /* 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
|
1244 a try: finally: block uninterruptible. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1245 goto fast_next_opcode; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1246 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1247 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
|
1248 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1249 ticked = 1; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1250 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1251 if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1252 if (Py_MakePendingCalls() < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1253 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1254 goto on_error; |
|
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 } |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1257 #ifdef WITH_THREAD |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1258 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
|
1259 /* Give another thread a chance */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1260 if (PyThreadState_Swap(NULL) != tstate) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1261 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
|
1262 drop_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1263 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1264 /* Other threads may run now */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1265 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1266 take_gil(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1267 if (PyThreadState_Swap(tstate) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1268 Py_FatalError("ceval: orphan tstate"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1269 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1270 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1271 /* Check for asynchronous exceptions. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1272 if (tstate->async_exc != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1273 x = tstate->async_exc; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1274 tstate->async_exc = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1275 UNSIGNAL_ASYNC_EXC(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1276 PyErr_SetNone(x); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1277 Py_DECREF(x); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1278 why = WHY_EXCEPTION; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1279 goto on_error; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1280 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1281 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1282 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1283 fast_next_opcode: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1284 f->f_lasti = INSTR_OFFSET(); |
|
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 /* line-by-line tracing support */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1287 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1288 if (_Py_TracingPossible && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1289 tstate->c_tracefunc != NULL && !tstate->tracing) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1290 /* see maybe_call_line_trace |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1291 for expository comments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1292 f->f_stacktop = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1293 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1294 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
|
1295 tstate->c_traceobj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1296 f, &instr_lb, &instr_ub, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1297 &instr_prev); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1298 /* Reload possibly changed frame fields */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1299 JUMPTO(f->f_lasti); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1300 if (f->f_stacktop != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1301 stack_pointer = f->f_stacktop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1302 f->f_stacktop = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1303 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1304 if (err) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1305 /* trace function raised an exception */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1306 goto on_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1307 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1308 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1309 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1310 /* Extract opcode and argument */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1311 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1312 opcode = NEXTOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1313 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
|
1314 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
|
1315 if (HAS_ARG(opcode)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1316 oparg = NEXTARG(); |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
1317 dispatch_opcode: |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1318 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1319 #ifdef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1320 dxpairs[lastopcode][opcode]++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1321 lastopcode = opcode; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1322 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1323 dxp[opcode]++; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1324 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1325 |
| 567 | 1326 #ifdef LLTRACE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1327 /* Instruction tracing */ |
|
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 if (lltrace) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1330 if (HAS_ARG(opcode)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1331 printf("%d: %d, %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1332 f->f_lasti, opcode, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1333 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1334 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1335 printf("%d: %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1336 f->f_lasti, opcode); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1337 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1338 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1339 #endif |
| 24844 | 1340 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1341 /* Main switch on opcode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1342 READ_TIMESTAMP(inst0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1343 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1344 switch (opcode) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1345 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1346 /* BEWARE! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1347 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
|
1348 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
|
1349 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
|
1350 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1351 TARGET(NOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1352 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1353 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1354 TARGET(LOAD_FAST) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1355 x = GETLOCAL(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1356 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1357 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1358 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1359 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1360 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1361 format_exc_check_arg(PyExc_UnboundLocalError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1362 UNBOUNDLOCAL_ERROR_MSG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1363 PyTuple_GetItem(co->co_varnames, oparg)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1364 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1365 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1366 TARGET(LOAD_CONST) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1367 x = GETITEM(consts, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1368 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1369 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1370 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1371 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1372 PREDICTED_WITH_ARG(STORE_FAST); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1373 TARGET(STORE_FAST) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1374 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1375 SETLOCAL(oparg, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1376 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1377 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1378 TARGET(POP_TOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1379 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1380 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1381 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1382 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1383 TARGET(ROT_TWO) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1384 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1385 w = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1386 SET_TOP(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1387 SET_SECOND(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1388 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1389 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1390 TARGET(ROT_THREE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1391 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1392 w = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1393 x = THIRD(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1394 SET_TOP(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1395 SET_SECOND(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1396 SET_THIRD(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1397 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1398 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1399 TARGET(DUP_TOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1400 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1401 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1402 PUSH(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1403 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1404 |
|
64439
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1405 TARGET(DUP_TOP_TWO) |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1406 x = TOP(); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1407 Py_INCREF(x); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1408 w = SECOND(); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1409 Py_INCREF(w); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1410 STACKADJ(2); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1411 SET_TOP(x); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1412 SET_SECOND(w); |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64092
diff
changeset
|
1413 FAST_DISPATCH(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1414 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1415 TARGET(UNARY_POSITIVE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1416 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1417 x = PyNumber_Positive(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1418 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1419 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1420 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1421 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1422 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1423 TARGET(UNARY_NEGATIVE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1424 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1425 x = PyNumber_Negative(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1426 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1427 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1428 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1429 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1430 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1431 TARGET(UNARY_NOT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1432 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1433 err = PyObject_IsTrue(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1434 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1435 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1436 Py_INCREF(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1437 SET_TOP(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1438 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1439 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1440 else if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1441 Py_INCREF(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1442 SET_TOP(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1443 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1444 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1445 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1446 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1447 break; |
|
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 TARGET(UNARY_INVERT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1450 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1451 x = PyNumber_Invert(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1452 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1453 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1454 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1455 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1456 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1457 TARGET(BINARY_POWER) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1458 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1459 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1460 x = PyNumber_Power(v, w, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1461 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1462 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1463 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1464 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1465 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1466 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1467 TARGET(BINARY_MULTIPLY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1468 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1469 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1470 x = PyNumber_Multiply(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1471 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1472 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1473 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1474 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1475 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1476 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1477 TARGET(BINARY_TRUE_DIVIDE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1478 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1479 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1480 x = PyNumber_TrueDivide(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1481 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1482 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1483 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1484 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1485 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1486 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1487 TARGET(BINARY_FLOOR_DIVIDE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1488 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1489 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1490 x = PyNumber_FloorDivide(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1491 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1492 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1493 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1494 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1495 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1496 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1497 TARGET(BINARY_MODULO) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1498 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1499 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1500 if (PyUnicode_CheckExact(v)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1501 x = PyUnicode_Format(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1502 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1503 x = PyNumber_Remainder(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1504 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1505 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1506 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1507 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1508 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1509 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1510 TARGET(BINARY_ADD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1511 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1512 v = TOP(); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1513 if (PyUnicode_CheckExact(v) && |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1514 PyUnicode_CheckExact(w)) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1515 x = unicode_concatenate(v, w, f, next_instr); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1516 /* unicode_concatenate consumed the ref to v */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1517 goto skip_decref_vx; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1518 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1519 else { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1520 x = PyNumber_Add(v, w); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1521 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1522 Py_DECREF(v); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1523 skip_decref_vx: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1524 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1525 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1526 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1527 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1528 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1529 TARGET(BINARY_SUBTRACT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1530 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1531 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1532 x = PyNumber_Subtract(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1533 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1534 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1535 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1536 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1537 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1538 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1539 TARGET(BINARY_SUBSCR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1540 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1541 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1542 x = PyObject_GetItem(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1543 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1544 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1545 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1546 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1547 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1548 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1549 TARGET(BINARY_LSHIFT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1550 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1551 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1552 x = PyNumber_Lshift(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1553 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1554 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1555 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1556 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1557 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1558 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1559 TARGET(BINARY_RSHIFT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1560 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1561 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1562 x = PyNumber_Rshift(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1563 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1564 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1565 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1566 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1567 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1568 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1569 TARGET(BINARY_AND) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1570 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1571 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1572 x = PyNumber_And(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1573 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1574 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1575 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1576 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1577 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1578 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1579 TARGET(BINARY_XOR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1580 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1581 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1582 x = PyNumber_Xor(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1583 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1584 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1585 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1586 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1587 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1588 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1589 TARGET(BINARY_OR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1590 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1591 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1592 x = PyNumber_Or(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1593 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1594 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1595 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1596 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1597 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1598 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1599 TARGET(LIST_APPEND) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1600 w = POP(); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1601 v = PEEK(oparg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1602 err = PyList_Append(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1603 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1604 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1605 PREDICT(JUMP_ABSOLUTE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1606 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1607 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1608 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1609 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1610 TARGET(SET_ADD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1611 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1612 v = stack_pointer[-oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1613 err = PySet_Add(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1614 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1615 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1616 PREDICT(JUMP_ABSOLUTE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1617 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1618 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1619 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1620 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1621 TARGET(INPLACE_POWER) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1622 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1623 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1624 x = PyNumber_InPlacePower(v, w, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1625 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1626 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1627 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1628 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1629 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1630 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1631 TARGET(INPLACE_MULTIPLY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1632 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1633 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1634 x = PyNumber_InPlaceMultiply(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1635 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1636 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1637 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1638 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1639 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1640 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1641 TARGET(INPLACE_TRUE_DIVIDE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1642 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1643 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1644 x = PyNumber_InPlaceTrueDivide(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1645 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1646 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1647 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1648 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1649 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1650 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1651 TARGET(INPLACE_FLOOR_DIVIDE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1652 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1653 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1654 x = PyNumber_InPlaceFloorDivide(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1655 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1656 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1657 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1658 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1659 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1660 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1661 TARGET(INPLACE_MODULO) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1662 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1663 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1664 x = PyNumber_InPlaceRemainder(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1665 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1666 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1667 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1668 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1669 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1670 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1671 TARGET(INPLACE_ADD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1672 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1673 v = TOP(); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1674 if (PyUnicode_CheckExact(v) && |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1675 PyUnicode_CheckExact(w)) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1676 x = unicode_concatenate(v, w, f, next_instr); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1677 /* unicode_concatenate consumed the ref to v */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1678 goto skip_decref_v; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1679 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1680 else { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1681 x = PyNumber_InPlaceAdd(v, w); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1682 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1683 Py_DECREF(v); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
1684 skip_decref_v: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1685 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1686 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1687 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1688 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1689 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1690 TARGET(INPLACE_SUBTRACT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1691 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1692 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1693 x = PyNumber_InPlaceSubtract(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1694 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1695 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1696 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1697 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1698 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1699 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1700 TARGET(INPLACE_LSHIFT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1701 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1702 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1703 x = PyNumber_InPlaceLshift(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1704 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1705 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1706 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1707 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1708 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1709 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1710 TARGET(INPLACE_RSHIFT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1711 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1712 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1713 x = PyNumber_InPlaceRshift(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1714 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1715 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1716 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1717 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1718 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1719 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1720 TARGET(INPLACE_AND) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1721 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1722 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1723 x = PyNumber_InPlaceAnd(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1724 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1725 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1726 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1727 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1728 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1729 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1730 TARGET(INPLACE_XOR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1731 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1732 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1733 x = PyNumber_InPlaceXor(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1734 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1735 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1736 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1737 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1738 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1739 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1740 TARGET(INPLACE_OR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1741 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1742 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1743 x = PyNumber_InPlaceOr(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1744 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1745 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1746 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1747 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1748 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1749 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1750 TARGET(STORE_SUBSCR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1751 w = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1752 v = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1753 u = THIRD(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1754 STACKADJ(-3); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1755 /* v[w] = u */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1756 err = PyObject_SetItem(v, w, u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1757 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1758 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1759 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1760 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1761 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1762 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1763 TARGET(DELETE_SUBSCR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1764 w = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1765 v = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1766 STACKADJ(-2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1767 /* del v[w] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1768 err = PyObject_DelItem(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1769 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1770 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1771 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1772 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1773 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1774 TARGET(PRINT_EXPR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1775 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1776 w = PySys_GetObject("displayhook"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1777 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1778 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1779 "lost sys.displayhook"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1780 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1781 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1782 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1783 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1784 x = PyTuple_Pack(1, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1785 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1786 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1787 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1788 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1789 w = PyEval_CallObject(w, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1790 Py_XDECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1791 if (w == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1792 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1793 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1794 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1795 Py_XDECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1796 break; |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1797 |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1798 #ifdef CASE_TOO_BIG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1799 default: switch (opcode) { |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1800 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1801 TARGET(RAISE_VARARGS) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1802 v = w = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1803 switch (oparg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1804 case 2: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1805 v = POP(); /* cause */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1806 case 1: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1807 w = POP(); /* exc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1808 case 0: /* Fallthrough */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1809 why = do_raise(w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1810 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1811 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1812 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1813 "bad RAISE_VARARGS oparg"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1814 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1815 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1816 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1817 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1818 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1819 TARGET(STORE_LOCALS) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1820 x = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1821 v = f->f_locals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1822 Py_XDECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1823 f->f_locals = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1824 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1825 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1826 TARGET(RETURN_VALUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1827 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1828 why = WHY_RETURN; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1829 goto fast_block_end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1830 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1831 TARGET(YIELD_VALUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1832 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1833 f->f_stacktop = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1834 why = WHY_YIELD; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1835 goto fast_yield; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1836 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1837 TARGET(POP_EXCEPT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1838 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1839 PyTryBlock *b = PyFrame_BlockPop(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1840 if (b->b_type != EXCEPT_HANDLER) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1841 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1842 "popped block is not an except handler"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1843 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1844 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1845 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1846 UNWIND_EXCEPT_HANDLER(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1847 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1848 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1849 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1850 TARGET(POP_BLOCK) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1851 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1852 PyTryBlock *b = PyFrame_BlockPop(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1853 UNWIND_BLOCK(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1854 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1855 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1856 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1857 PREDICTED(END_FINALLY); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1858 TARGET(END_FINALLY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1859 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1860 if (PyLong_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1861 why = (enum why_code) PyLong_AS_LONG(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1862 assert(why != WHY_YIELD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1863 if (why == WHY_RETURN || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1864 why == WHY_CONTINUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1865 retval = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1866 if (why == WHY_SILENCED) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1867 /* 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
|
1868 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
|
1869 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
|
1870 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
|
1871 PyTryBlock *b = PyFrame_BlockPop(f); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1872 assert(b->b_type == EXCEPT_HANDLER); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1873 UNWIND_EXCEPT_HANDLER(b); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1874 why = WHY_NOT; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1875 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1876 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1877 else if (PyExceptionClass_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1878 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1879 u = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1880 PyErr_Restore(v, w, u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1881 why = WHY_RERAISE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1882 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1883 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1884 else if (v != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1885 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1886 "'finally' pops bad exception"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1887 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1888 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1889 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1890 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1891 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1892 TARGET(LOAD_BUILD_CLASS) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1893 x = PyDict_GetItemString(f->f_builtins, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1894 "__build_class__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1895 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1896 PyErr_SetString(PyExc_ImportError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1897 "__build_class__ not found"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1898 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1899 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1900 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1901 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1902 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1903 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1904 TARGET(STORE_NAME) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1905 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1906 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1907 if ((x = f->f_locals) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1908 if (PyDict_CheckExact(x)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1909 err = PyDict_SetItem(x, w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1910 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1911 err = PyObject_SetItem(x, w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1912 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1913 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1914 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1915 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1916 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1917 "no locals found when storing %R", w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1918 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1919 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1920 TARGET(DELETE_NAME) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1921 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1922 if ((x = f->f_locals) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1923 if ((err = PyObject_DelItem(x, w)) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1924 format_exc_check_arg(PyExc_NameError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1925 NAME_ERROR_MSG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1926 w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1927 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1928 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1929 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1930 "no locals when deleting %R", w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1931 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1932 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1933 PREDICTED_WITH_ARG(UNPACK_SEQUENCE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1934 TARGET(UNPACK_SEQUENCE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1935 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1936 if (PyTuple_CheckExact(v) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1937 PyTuple_GET_SIZE(v) == oparg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1938 PyObject **items = \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1939 ((PyTupleObject *)v)->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1940 while (oparg--) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1941 w = items[oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1942 Py_INCREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1943 PUSH(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1944 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1945 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1946 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1947 } else if (PyList_CheckExact(v) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1948 PyList_GET_SIZE(v) == oparg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1949 PyObject **items = \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1950 ((PyListObject *)v)->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1951 while (oparg--) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1952 w = items[oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1953 Py_INCREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1954 PUSH(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1955 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1956 } else if (unpack_iterable(v, oparg, -1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1957 stack_pointer + oparg)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
1958 STACKADJ(oparg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1959 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1960 /* unpack_iterable() raised an exception */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1961 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1962 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1963 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1964 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1965 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1966 TARGET(UNPACK_EX) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1967 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1968 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1969 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1970 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1971 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1972 stack_pointer + totalargs)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1973 stack_pointer += totalargs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1974 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1975 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1976 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1977 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1978 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1979 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1980 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1981 TARGET(STORE_ATTR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1982 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1983 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1984 u = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1985 STACKADJ(-2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1986 err = PyObject_SetAttr(v, w, u); /* v.w = u */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1987 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1988 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1989 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1990 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1991 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1992 TARGET(DELETE_ATTR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1993 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1994 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1995 err = PyObject_SetAttr(v, w, (PyObject *)NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1996 /* del v.w */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1997 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1998 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1999 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2000 TARGET(STORE_GLOBAL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2001 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2002 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2003 err = PyDict_SetItem(f->f_globals, w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2004 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2005 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2006 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2007 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2008 TARGET(DELETE_GLOBAL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2009 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2010 if ((err = PyDict_DelItem(f->f_globals, w)) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2011 format_exc_check_arg( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2012 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2013 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2014 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2015 TARGET(LOAD_NAME) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2016 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2017 if ((v = f->f_locals) == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2018 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2019 "no locals when loading %R", w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2020 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2021 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2022 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2023 if (PyDict_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2024 x = PyDict_GetItem(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2025 Py_XINCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2026 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2027 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2028 x = PyObject_GetItem(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2029 if (x == NULL && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2030 if (!PyErr_ExceptionMatches( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2031 PyExc_KeyError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2032 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2033 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2034 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2035 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2036 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2037 x = PyDict_GetItem(f->f_globals, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2038 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2039 x = PyDict_GetItem(f->f_builtins, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2040 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2041 format_exc_check_arg( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2042 PyExc_NameError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2043 NAME_ERROR_MSG, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2044 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2045 } |
|
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 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2048 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2049 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2050 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2051 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2052 TARGET(LOAD_GLOBAL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2053 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2054 if (PyUnicode_CheckExact(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2055 /* Inline the PyDict_GetItem() calls. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2056 WARNING: this is an extreme speed hack. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2057 Do not try this at home. */ |
| 72475 | 2058 Py_hash_t hash = ((PyASCIIObject *)w)->hash; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2059 if (hash != -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2060 PyDictObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2061 PyDictEntry *e; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2062 d = (PyDictObject *)(f->f_globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2063 e = d->ma_lookup(d, w, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2064 if (e == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2065 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2066 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2067 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2068 x = e->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2069 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2070 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2071 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2072 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2073 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2074 d = (PyDictObject *)(f->f_builtins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2075 e = d->ma_lookup(d, w, hash); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2076 if (e == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2077 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2078 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2079 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2080 x = e->me_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2081 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2082 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2083 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2084 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2085 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2086 goto load_global_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2087 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2088 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2089 /* This is the un-inlined version of the code above */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2090 x = PyDict_GetItem(f->f_globals, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2091 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2092 x = PyDict_GetItem(f->f_builtins, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2093 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2094 load_global_error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2095 format_exc_check_arg( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2096 PyExc_NameError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2097 GLOBAL_NAME_ERROR_MSG, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2098 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2099 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2100 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2101 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2102 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2103 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2104 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2105 TARGET(DELETE_FAST) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2106 x = GETLOCAL(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2107 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2108 SETLOCAL(oparg, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2109 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2110 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2111 format_exc_check_arg( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2112 PyExc_UnboundLocalError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2113 UNBOUNDLOCAL_ERROR_MSG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2114 PyTuple_GetItem(co->co_varnames, oparg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2115 ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2116 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2117 |
|
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
|
2118 TARGET(DELETE_DEREF) |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
2119 x = 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
|
2120 if (PyCell_GET(x) != NULL) { |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
2121 PyCell_Set(x, NULL); |
|
64624
9265752a1c83
use DISPATCH() instead of continue
Benjamin Peterson <benjamin@python.org>
parents:
64620
diff
changeset
|
2122 DISPATCH(); |
|
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
|
2123 } |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
2124 err = -1; |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
2125 format_exc_unbound(co, 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
|
2126 break; |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
2127 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2128 TARGET(LOAD_CLOSURE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2129 x = freevars[oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2130 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2131 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2132 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2133 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2134 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2135 TARGET(LOAD_DEREF) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2136 x = freevars[oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2137 w = PyCell_Get(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2138 if (w != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2139 PUSH(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2140 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2141 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2142 err = -1; |
|
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
|
2143 format_exc_unbound(co, oparg); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2144 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2145 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2146 TARGET(STORE_DEREF) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2147 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2148 x = freevars[oparg]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2149 PyCell_Set(x, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2150 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2151 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2152 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2153 TARGET(BUILD_TUPLE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2154 x = PyTuple_New(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2155 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2156 for (; --oparg >= 0;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2157 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2158 PyTuple_SET_ITEM(x, oparg, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2159 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2160 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2161 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2162 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2163 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2164 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2165 TARGET(BUILD_LIST) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2166 x = PyList_New(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2167 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2168 for (; --oparg >= 0;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2169 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2170 PyList_SET_ITEM(x, oparg, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2171 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2172 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2173 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2174 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2175 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2176 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2177 TARGET(BUILD_SET) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2178 x = PySet_New(NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2179 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2180 for (; --oparg >= 0;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2181 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2182 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2183 err = PySet_Add(x, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2184 Py_DECREF(w); |
|
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 if (err != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2187 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2188 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2189 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2190 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2191 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2192 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2193 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2194 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2195 TARGET(BUILD_MAP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2196 x = _PyDict_NewPresized((Py_ssize_t)oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2197 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2198 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2199 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2200 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2201 TARGET(STORE_MAP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2202 w = TOP(); /* key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2203 u = SECOND(); /* value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2204 v = THIRD(); /* dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2205 STACKADJ(-2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2206 assert (PyDict_CheckExact(v)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2207 err = PyDict_SetItem(v, w, u); /* v[w] = u */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2208 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2209 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2210 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2211 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2212 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2213 TARGET(MAP_ADD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2214 w = TOP(); /* key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2215 u = SECOND(); /* value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2216 STACKADJ(-2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2217 v = stack_pointer[-oparg]; /* dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2218 assert (PyDict_CheckExact(v)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2219 err = PyDict_SetItem(v, w, u); /* v[w] = u */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2220 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2221 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2222 if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2223 PREDICT(JUMP_ABSOLUTE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2224 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2225 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2226 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2227 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2228 TARGET(LOAD_ATTR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2229 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2230 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2231 x = PyObject_GetAttr(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2232 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2233 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2234 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2235 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2236 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2237 TARGET(COMPARE_OP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2238 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2239 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2240 x = cmp_outcome(oparg, v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2241 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2242 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2243 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2244 if (x == NULL) break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2245 PREDICT(POP_JUMP_IF_FALSE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2246 PREDICT(POP_JUMP_IF_TRUE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2247 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2248 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2249 TARGET(IMPORT_NAME) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2250 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2251 x = PyDict_GetItemString(f->f_builtins, "__import__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2252 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2253 PyErr_SetString(PyExc_ImportError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2254 "__import__ not found"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2255 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2257 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2258 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2259 u = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2260 if (PyLong_AsLong(u) != -1 || PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2261 w = PyTuple_Pack(5, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2262 w, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2263 f->f_globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2264 f->f_locals == NULL ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2265 Py_None : f->f_locals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2266 v, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2267 u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2268 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2269 w = PyTuple_Pack(4, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2270 w, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2271 f->f_globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2272 f->f_locals == NULL ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2273 Py_None : f->f_locals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2274 v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2275 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2276 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2277 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2278 u = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2279 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2280 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2281 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2282 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2283 READ_TIMESTAMP(intr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2284 v = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2285 x = PyEval_CallObject(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2286 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2287 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2288 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2289 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2290 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2291 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2292 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2293 TARGET(IMPORT_STAR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2294 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2295 PyFrame_FastToLocals(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2296 if ((x = f->f_locals) == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2297 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2298 "no locals found during 'import *'"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2299 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2300 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2301 READ_TIMESTAMP(intr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2302 err = import_all_from(x, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2303 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2304 PyFrame_LocalsToFast(f, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2305 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2306 if (err == 0) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2307 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2308 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2309 TARGET(IMPORT_FROM) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2310 w = GETITEM(names, oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2311 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2312 READ_TIMESTAMP(intr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2313 x = import_from(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2314 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2315 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2316 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2317 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2318 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2319 TARGET(JUMP_FORWARD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2320 JUMPBY(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2321 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2322 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2323 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2324 TARGET(POP_JUMP_IF_FALSE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2325 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2326 if (w == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2327 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2328 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2329 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2330 if (w == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2331 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2332 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2333 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2334 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2335 err = PyObject_IsTrue(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2336 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2337 if (err > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2338 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2339 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2340 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2341 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2342 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2343 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2344 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2345 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2346 TARGET(POP_JUMP_IF_TRUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2347 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2348 if (w == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2349 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2350 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2351 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2352 if (w == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2353 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2354 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2355 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2356 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2357 err = PyObject_IsTrue(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2358 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2359 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2360 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2361 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2362 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2363 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2364 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2365 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2366 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2367 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2368 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2369 TARGET(JUMP_IF_FALSE_OR_POP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2370 w = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2371 if (w == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2372 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2373 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2374 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2375 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2376 if (w == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2377 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2378 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2380 err = PyObject_IsTrue(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2381 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2382 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2383 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2384 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2385 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2386 else if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2387 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2388 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2389 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2390 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2391 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2392 TARGET(JUMP_IF_TRUE_OR_POP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2393 w = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2394 if (w == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2395 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2396 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2397 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2398 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2399 if (w == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2400 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2401 FAST_DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2402 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2403 err = PyObject_IsTrue(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2404 if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2405 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2406 JUMPTO(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2407 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2408 else if (err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2409 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2410 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2411 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2412 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2413 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2414 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2415 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2416 PREDICTED_WITH_ARG(JUMP_ABSOLUTE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2417 TARGET(JUMP_ABSOLUTE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2418 JUMPTO(oparg); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2419 #if FAST_LOOPS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2420 /* 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
|
2421 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
|
2422 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
|
2423 "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
|
2424 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
|
2425 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
|
2426 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2427 FAST_DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2428 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2429 DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2430 #endif |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2431 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2432 TARGET(GET_ITER) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2433 /* before: [obj]; after [getiter(obj)] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2434 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2435 x = PyObject_GetIter(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2436 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2437 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2438 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2439 PREDICT(FOR_ITER); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2440 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2441 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2442 STACKADJ(-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2443 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2444 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2445 PREDICTED_WITH_ARG(FOR_ITER); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2446 TARGET(FOR_ITER) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2447 /* before: [iter]; after: [iter, iter()] *or* [] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2448 v = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2449 x = (*v->ob_type->tp_iternext)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2450 if (x != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2451 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2452 PREDICT(STORE_FAST); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2453 PREDICT(UNPACK_SEQUENCE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2454 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2455 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2456 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2457 if (!PyErr_ExceptionMatches( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2458 PyExc_StopIteration)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2459 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2460 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2461 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2462 /* iterator ended normally */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2463 x = v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2464 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2465 JUMPBY(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2466 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2467 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2468 TARGET(BREAK_LOOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2469 why = WHY_BREAK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2470 goto fast_block_end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2471 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2472 TARGET(CONTINUE_LOOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2473 retval = PyLong_FromLong(oparg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2474 if (!retval) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2475 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2476 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2477 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2478 why = WHY_CONTINUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2479 goto fast_block_end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2480 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2481 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
|
2482 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
|
2483 TARGET(SETUP_FINALLY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2484 _setup_finally: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2485 /* 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
|
2486 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
|
2487 to update the PyGen_NeedsFinalizing() function. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2488 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2489 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2490 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
|
2491 STACK_LEVEL()); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2492 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2493 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2494 TARGET(SETUP_WITH) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2495 { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2496 static PyObject *exit, *enter; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2497 w = TOP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2498 x = special_lookup(w, "__exit__", &exit); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2499 if (!x) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2500 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2501 SET_TOP(x); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2502 u = special_lookup(w, "__enter__", &enter); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2503 Py_DECREF(w); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2504 if (!u) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2505 x = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2506 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2507 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2508 x = PyObject_CallFunctionObjArgs(u, NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2509 Py_DECREF(u); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2510 if (!x) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2511 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2512 /* 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
|
2513 of __enter__ on the stack. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2514 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
|
2515 STACK_LEVEL()); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2516 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2517 PUSH(x); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2518 DISPATCH(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2519 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2520 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2521 TARGET(WITH_CLEANUP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2522 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2523 /* 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
|
2524 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
|
2525 - TOP = None |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2526 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2527 - TOP = WHY_*; no retval below it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2528 - (TOP, SECOND, THIRD) = exc_info() |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2529 (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
|
2530 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
|
2531 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
|
2532 EXIT(TOP, SECOND, THIRD) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2533 otherwise we must call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2534 EXIT(None, None, None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2535 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2536 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
|
2537 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
|
2538 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
|
2539 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
|
2540 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2541 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
|
2542 *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
|
2543 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
|
2544 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
|
2545 gotos should still be resumed.) |
|
61467
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 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2548 PyObject *exit_func; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2549 u = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2550 if (u == Py_None) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2551 (void)POP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2552 exit_func = TOP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2553 SET_TOP(u); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2554 v = w = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2555 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2556 else if (PyLong_Check(u)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2557 (void)POP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2558 switch(PyLong_AsLong(u)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2559 case WHY_RETURN: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2560 case WHY_CONTINUE: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2561 /* Retval in TOP. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2562 exit_func = SECOND(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2563 SET_SECOND(TOP()); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2564 SET_TOP(u); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2565 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2566 default: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2567 exit_func = TOP(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2568 SET_TOP(u); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2569 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2570 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2571 u = v = w = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2572 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2573 else { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2574 PyObject *tp, *exc, *tb; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2575 PyTryBlock *block; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2576 v = SECOND(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2577 w = THIRD(); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2578 tp = FOURTH(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2579 exc = PEEK(5); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2580 tb = PEEK(6); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2581 exit_func = PEEK(7); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2582 SET_VALUE(7, tb); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2583 SET_VALUE(6, exc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2584 SET_VALUE(5, tp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2585 /* 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
|
2586 SET_FOURTH(NULL); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2587 /* 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
|
2588 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
|
2589 values are lower than it expects. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2590 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
|
2591 assert(block->b_type == EXCEPT_HANDLER); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2592 block->b_level--; |
|
61467
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 /* XXX Not the fastest way to call it... */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2595 x = PyObject_CallFunctionObjArgs(exit_func, u, v, w, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2596 NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2597 Py_DECREF(exit_func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2598 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2599 break; /* Go to error exit */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2600 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2601 if (u != Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2602 err = PyObject_IsTrue(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2603 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2604 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2605 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2606 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2607 if (err < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2608 break; /* Go to error exit */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2609 else if (err > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2610 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2611 /* 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
|
2612 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
|
2613 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2614 PREDICT(END_FINALLY); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2615 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2616 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2617 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2618 TARGET(CALL_FUNCTION) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2619 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2620 PyObject **sp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2621 PCALL(PCALL_ALL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2622 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
|
2623 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2624 x = 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
|
2625 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2626 x = 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
|
2627 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2628 stack_pointer = sp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2629 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2630 if (x != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2631 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2632 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2633 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2634 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2635 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
|
2636 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
|
2637 TARGET(CALL_FUNCTION_VAR_KW) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2638 _call_function_var_kw: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2639 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2640 int na = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2641 int nk = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2642 int flags = (opcode - CALL_FUNCTION) & 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2643 int n = na + 2 * nk; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2644 PyObject **pfunc, *func, **sp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2645 PCALL(PCALL_ALL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2646 if (flags & CALL_FLAG_VAR) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2647 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2648 if (flags & CALL_FLAG_KW) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2649 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2650 pfunc = stack_pointer - n - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2651 func = *pfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2652 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2653 if (PyMethod_Check(func) |
|
62462
0e4637ea20d0
Merged revisions 82181 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents:
61467
diff
changeset
|
2654 && PyMethod_GET_SELF(func) != NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2655 PyObject *self = PyMethod_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2656 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2657 func = PyMethod_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2658 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2659 Py_DECREF(*pfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2660 *pfunc = self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2661 na++; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
68086
diff
changeset
|
2662 /* n++; */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2663 } else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2664 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2665 sp = stack_pointer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2666 READ_TIMESTAMP(intr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2667 x = ext_do_call(func, &sp, flags, na, nk); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2668 READ_TIMESTAMP(intr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2669 stack_pointer = sp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2670 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2671 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2672 while (stack_pointer > pfunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2673 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2674 Py_DECREF(w); |
|
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 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2677 if (x != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2678 DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2679 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2680 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2681 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2682 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
|
2683 TARGET(MAKE_FUNCTION) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2684 _make_function: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2685 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2686 int posdefaults = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2687 int kwdefaults = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2688 int num_annotations = (oparg >> 16) & 0x7fff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2689 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2690 v = POP(); /* code object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2691 x = PyFunction_New(v, f->f_globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2692 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2693 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2694 if (x != NULL && opcode == MAKE_CLOSURE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2695 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2696 if (PyFunction_SetClosure(x, v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2697 /* Can't happen unless bytecode is corrupt. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2698 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2699 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2700 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2701 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2702 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2703 if (x != NULL && num_annotations > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2704 Py_ssize_t name_ix; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2705 u = POP(); /* names of args with annotations */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2706 v = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2707 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2708 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2709 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2710 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2711 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2712 name_ix = PyTuple_Size(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2713 assert(num_annotations == name_ix+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2714 while (name_ix > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2715 --name_ix; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2716 t = PyTuple_GET_ITEM(u, name_ix); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2717 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2718 /* XXX(nnorwitz): check for errors */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2719 PyDict_SetItem(v, t, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2720 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2721 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2722 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2723 if (PyFunction_SetAnnotations(x, v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2724 /* Can't happen unless |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2725 PyFunction_SetAnnotations changes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2726 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2727 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2728 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2729 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2730 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2731 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2732 /* XXX Maybe this should be a separate opcode? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2733 if (x != NULL && posdefaults > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2734 v = PyTuple_New(posdefaults); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2735 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2736 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2737 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2738 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2739 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2740 while (--posdefaults >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2741 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2742 PyTuple_SET_ITEM(v, posdefaults, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2743 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2744 if (PyFunction_SetDefaults(x, v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2745 /* Can't happen unless |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2746 PyFunction_SetDefaults changes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2747 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2748 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2749 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2750 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2751 if (x != NULL && kwdefaults > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2752 v = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2753 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2754 Py_DECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2755 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2756 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2757 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2758 while (--kwdefaults >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2759 w = POP(); /* default value */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2760 u = POP(); /* kw only arg name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2761 /* XXX(nnorwitz): check for errors */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2762 PyDict_SetItem(v, u, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2763 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2764 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2765 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2766 if (PyFunction_SetKwDefaults(x, v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2767 /* Can't happen unless |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2768 PyFunction_SetKwDefaults changes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2769 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2770 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2771 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2772 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2773 PUSH(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2774 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2775 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2776 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2777 TARGET(BUILD_SLICE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2778 if (oparg == 3) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2779 w = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2780 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2781 w = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2782 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2783 u = TOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2784 x = PySlice_New(u, v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2785 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2786 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2787 Py_XDECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2788 SET_TOP(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2789 if (x != NULL) DISPATCH(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2790 break; |
|
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 TARGET(EXTENDED_ARG) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2793 opcode = NEXTOP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2794 oparg = oparg<<16 | NEXTARG(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2795 goto dispatch_opcode; |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2796 |
|
63959
e54baebbd6ff
Issue #9203: Computed gotos are now enabled by default on supported
Antoine Pitrou <solipsis@pitrou.net>
parents:
63114
diff
changeset
|
2797 #if USE_COMPUTED_GOTOS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2798 _unknown_opcode: |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2799 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2800 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2801 fprintf(stderr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2802 "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
|
2803 PyFrame_GetLineNumber(f), |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2804 opcode); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2805 PyErr_SetString(PyExc_SystemError, "unknown opcode"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2806 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2807 break; |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2808 |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2809 #ifdef CASE_TOO_BIG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2810 } |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2811 #endif |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2812 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2813 } /* switch */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2814 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2815 on_error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2816 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2817 READ_TIMESTAMP(inst1); |
|
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 /* Quickly continue if no error occurred */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2820 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2821 if (why == WHY_NOT) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2822 if (err == 0 && x != NULL) { |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2823 #ifdef CHECKEXC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2824 /* This check is expensive! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2825 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2826 fprintf(stderr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2827 "XXX undetected error\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2828 else { |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2829 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2830 READ_TIMESTAMP(loop1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2831 continue; /* Normal, fast path */ |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2832 #ifdef CHECKEXC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2833 } |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2834 #endif |
|
61467
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 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2837 x = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2838 err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2839 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2840 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2841 /* Double-check exception status */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2842 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2843 if (why == WHY_EXCEPTION || why == WHY_RERAISE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2844 if (!PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2845 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2846 "error return without exception set"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2847 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2848 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2849 } |
|
10363
4daab7a9f566
Always test for an error return (usually NULL or -1) without setting
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2850 #ifdef CHECKEXC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2851 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2852 /* This check is expensive! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2853 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2854 char buf[128]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2855 sprintf(buf, "Stack unwind with exception " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2856 "set and why=%d", why); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2857 Py_FatalError(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2858 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2859 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2860 #endif |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2861 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2862 /* Log traceback info if this is a real exception */ |
|
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 if (why == WHY_EXCEPTION) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2865 PyTraceBack_Here(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2866 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2867 if (tstate->c_tracefunc != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2868 call_exc_trace(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2869 tstate->c_traceobj, f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2870 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2871 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2872 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2873 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2874 if (why == WHY_RERAISE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2875 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2876 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2877 /* Unwind stacks if a (pseudo) exception occurred */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2878 |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
2879 fast_block_end: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2880 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
|
2881 /* Peek at the current block. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2882 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
|
2883 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2884 assert(why != WHY_YIELD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2885 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
|
2886 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2887 JUMPTO(PyLong_AS_LONG(retval)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2888 Py_DECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2889 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2890 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
2891 /* 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
|
2892 f->f_iblock--; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2893 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2894 if (b->b_type == EXCEPT_HANDLER) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2895 UNWIND_EXCEPT_HANDLER(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2896 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2897 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2898 UNWIND_BLOCK(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2899 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
|
2900 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2901 JUMPTO(b->b_handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2902 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2903 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2904 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
|
2905 || b->b_type == SETUP_FINALLY)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2906 PyObject *exc, *val, *tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2907 int handler = b->b_handler; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2908 /* 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
|
2909 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
|
2910 PUSH(tstate->exc_traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2911 PUSH(tstate->exc_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2912 if (tstate->exc_type != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2913 PUSH(tstate->exc_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2914 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2915 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2916 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2917 PUSH(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2918 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2919 PyErr_Fetch(&exc, &val, &tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2920 /* Make the raw exception data |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2921 available to the handler, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2922 so a program can emulate the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2923 Python main loop. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2924 PyErr_NormalizeException( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2925 &exc, &val, &tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2926 PyException_SetTraceback(val, tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2927 Py_INCREF(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2928 tstate->exc_type = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2929 Py_INCREF(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2930 tstate->exc_value = val; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2931 tstate->exc_traceback = tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2932 if (tb == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2933 tb = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2934 Py_INCREF(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2935 PUSH(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2936 PUSH(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2937 PUSH(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2938 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2939 JUMPTO(handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2940 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2941 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2942 if (b->b_type == SETUP_FINALLY) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2943 if (why & (WHY_RETURN | WHY_CONTINUE)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2944 PUSH(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2945 PUSH(PyLong_FromLong((long)why)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2946 why = WHY_NOT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2947 JUMPTO(b->b_handler); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2948 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2949 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2950 } /* unwind stack */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2951 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2952 /* 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
|
2953 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2954 if (why != WHY_NOT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2955 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2956 READ_TIMESTAMP(loop1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2957 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2958 } /* main loop */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2959 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2960 assert(why != WHY_YIELD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2961 /* Pop remaining stack entries. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2962 while (!EMPTY()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2963 v = POP(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2964 Py_XDECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2965 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2966 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2967 if (why != WHY_RETURN) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2968 retval = NULL; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2969 |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
2970 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
|
2971 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
|
2972 /* 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
|
2973 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
|
2974 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
|
2975 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
|
2976 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
|
2977 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
|
2978 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
|
2979 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
|
2980 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
|
2981 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
|
2982 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
|
2983 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
|
2984 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
|
2985 /* 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
|
2986 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
|
2987 else |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
2988 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
|
2989 } |
|
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
|
2990 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2991 if (tstate->use_tracing) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2992 if (tstate->c_tracefunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2993 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
|
2994 if (call_trace(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2995 tstate->c_traceobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2996 PyTrace_RETURN, retval)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2997 Py_XDECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2998 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2999 why = WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3000 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3001 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3002 else if (why == WHY_EXCEPTION) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3003 call_trace_protected(tstate->c_tracefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3004 tstate->c_traceobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3005 PyTrace_RETURN, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3006 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3007 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3008 if (tstate->c_profilefunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3009 if (why == WHY_EXCEPTION) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3010 call_trace_protected(tstate->c_profilefunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3011 tstate->c_profileobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3012 PyTrace_RETURN, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3013 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
|
3014 tstate->c_profileobj, f, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3015 PyTrace_RETURN, retval)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3016 Py_XDECREF(retval); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3017 retval = NULL; |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
68086
diff
changeset
|
3018 /* why = WHY_EXCEPTION; */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3019 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3020 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3021 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3022 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3023 /* pop frame */ |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3024 exit_eval_frame: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3025 Py_LeaveRecursiveCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3026 tstate->frame = f->f_back; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3027 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3028 return retval; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
3029 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
3030 |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3031 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
|
3032 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
|
3033 { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3034 int err; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3035 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
|
3036 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
|
3037 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3038 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
|
3039 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
|
3040 /* 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
|
3041 switch (len) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3042 case 1: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3043 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
|
3044 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
|
3045 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3046 case 2: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3047 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
|
3048 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
|
3049 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
|
3050 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3051 default: |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3052 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
|
3053 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
|
3054 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
|
3055 /* 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
|
3056 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
|
3057 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
|
3058 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
|
3059 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
|
3060 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3061 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3062 /* 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
|
3063 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
|
3064 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
|
3065 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
|
3066 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3067 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3068 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
|
3069 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
|
3070 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
|
3071 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
|
3072 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3073 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3074 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
|
3075 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
|
3076 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
|
3077 break; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3078 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3079 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
|
3080 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3081 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
|
3082 "%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
|
3083 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
|
3084 len, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3085 kind, |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3086 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
|
3087 name_str); |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3088 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
|
3089 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3090 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3091 static void |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3092 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
|
3093 PyObject **fastlocals) |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3094 { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3095 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
|
3096 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
|
3097 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
|
3098 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
|
3099 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
|
3100 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3101 /* 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
|
3102 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
|
3103 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
|
3104 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3105 if (positional) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3106 start = 0; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3107 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
|
3108 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3109 else { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3110 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
|
3111 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
|
3112 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3113 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
|
3114 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
|
3115 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
|
3116 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
|
3117 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
|
3118 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
|
3119 return; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3120 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3121 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
|
3122 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3123 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3124 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
|
3125 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
|
3126 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
|
3127 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3128 |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3129 static void |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3130 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
|
3131 { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3132 int plural; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3133 int kwonly_given = 0; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3134 int i; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3135 PyObject *sig, *kwonly_sig; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3136 |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3137 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
|
3138 /* Count missing keyword-only args. */ |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3139 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
|
3140 if (GETLOCAL(i) != NULL) |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3141 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
|
3142 if (defcount) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3143 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
|
3144 plural = 1; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3145 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
|
3146 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3147 else { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3148 plural = co->co_argcount != 1; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3149 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
|
3150 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3151 if (sig == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3152 return; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3153 if (kwonly_given) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3154 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
|
3155 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
|
3156 kwonly_given != 1 ? "s" : ""); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3157 if (kwonly_sig == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3158 Py_DECREF(sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3159 return; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3160 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3161 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3162 else { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3163 /* This will not fail. */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3164 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
|
3165 assert(kwonly_sig != NULL); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3166 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3167 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3168 "%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
|
3169 co->co_name, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3170 sig, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3171 plural ? "s" : "", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3172 given, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3173 kwonly_sig, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3174 given == 1 && !kwonly_given ? "was" : "were"); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3175 Py_DECREF(sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3176 Py_DECREF(kwonly_sig); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3177 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3178 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
3179 /* 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
|
3180 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
|
3181 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
|
3182 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3183 PyObject * |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
3184 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
|
3185 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
|
3186 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
|
3187 { |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
3188 PyCodeObject* co = (PyCodeObject*)_co; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3189 register PyFrameObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3190 register PyObject *retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3191 register PyObject **fastlocals, **freevars; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3192 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3193 PyObject *x, *u; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3194 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
|
3195 int i; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3196 int n = argcount; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3197 PyObject *kwdict = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3198 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3199 if (globals == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3200 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3201 "PyEval_EvalCodeEx: NULL globals"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3202 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3203 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3204 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3205 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3206 assert(globals != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3207 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
|
3208 if (f == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3209 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3210 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3211 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3212 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
|
3213 |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3214 /* Parse arguments. */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3215 if (co->co_flags & CO_VARKEYWORDS) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3216 kwdict = PyDict_New(); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3217 if (kwdict == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3218 goto fail; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3219 i = total_args; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3220 if (co->co_flags & CO_VARARGS) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3221 i++; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3222 SETLOCAL(i, kwdict); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3223 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3224 if (argcount > co->co_argcount) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3225 n = co->co_argcount; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3226 for (i = 0; i < n; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3227 x = args[i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3228 Py_INCREF(x); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3229 SETLOCAL(i, x); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3230 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3231 if (co->co_flags & CO_VARARGS) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3232 u = PyTuple_New(argcount - n); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3233 if (u == NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3234 goto fail; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3235 SETLOCAL(total_args, u); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3236 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
|
3237 x = args[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3238 Py_INCREF(x); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3239 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
|
3240 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3241 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3242 for (i = 0; i < kwcount; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3243 PyObject **co_varnames; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3244 PyObject *keyword = kws[2*i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3245 PyObject *value = kws[2*i + 1]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3246 int j; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3247 if (keyword == NULL || !PyUnicode_Check(keyword)) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3248 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3249 "%U() keywords must be strings", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3250 co->co_name); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3251 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3252 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3253 /* 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
|
3254 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
|
3255 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
|
3256 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
|
3257 PyObject *nm = co_varnames[j]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3258 if (nm == keyword) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3259 goto kw_found; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3260 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3261 /* Slow fallback, just in case */ |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3262 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
|
3263 PyObject *nm = co_varnames[j]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3264 int cmp = PyObject_RichCompareBool( |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3265 keyword, nm, Py_EQ); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3266 if (cmp > 0) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3267 goto kw_found; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3268 else if (cmp < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3269 goto fail; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3270 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3271 if (j >= total_args && kwdict == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3272 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3273 "%U() got an unexpected " |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3274 "keyword argument '%S'", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3275 co->co_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3276 keyword); |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3277 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3278 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3279 PyDict_SetItem(kwdict, keyword, value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3280 continue; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3281 kw_found: |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3282 if (GETLOCAL(j) != NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3283 PyErr_Format(PyExc_TypeError, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3284 "%U() got multiple " |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3285 "values for argument '%S'", |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3286 co->co_name, |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3287 keyword); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3288 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3289 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3290 Py_INCREF(value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3291 SETLOCAL(j, value); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3292 } |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3293 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
|
3294 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
|
3295 goto fail; |
|
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 if (argcount < co->co_argcount) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3298 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
|
3299 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
|
3300 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
|
3301 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
|
3302 missing++; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3303 if (missing) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3304 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
|
3305 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3306 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3307 if (n > m) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3308 i = n - m; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3309 else |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3310 i = 0; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3311 for (; i < defcount; i++) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3312 if (GETLOCAL(m+i) == NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3313 PyObject *def = defs[i]; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3314 Py_INCREF(def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3315 SETLOCAL(m+i, def); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3316 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3317 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3318 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3319 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
|
3320 int missing = 0; |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3321 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
|
3322 PyObject *name; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3323 if (GETLOCAL(i) != NULL) |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3324 continue; |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3325 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
|
3326 if (kwdefs != NULL) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3327 PyObject *def = PyDict_GetItem(kwdefs, name); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3328 if (def) { |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3329 Py_INCREF(def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3330 SETLOCAL(i, def); |
|
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3331 continue; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3332 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3333 } |
|
70940
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3334 missing++; |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3335 } |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3336 if (missing) { |
|
52744a5a9260
give the names of missing positional or keyword-only arguments (closes #12356)
Benjamin Peterson <benjamin@python.org>
parents:
70652
diff
changeset
|
3337 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
|
3338 goto fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3339 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3340 } |
|
70652
44d46d74ef4f
greatly improve argument parsing error messages (closes #12265)
Benjamin Peterson <benjamin@python.org>
parents:
69833
diff
changeset
|
3341 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3342 /* 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
|
3343 vars into frame. */ |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3344 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
|
3345 PyObject *c; |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3346 int arg; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3347 /* 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
|
3348 if (co->co_cell2arg != NULL && |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3349 (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3350 c = PyCell_New(GETLOCAL(arg)); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3351 else |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3352 c = PyCell_New(NULL); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3353 if (c == NULL) |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3354 goto fail; |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3355 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
|
3356 } |
|
70987
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3357 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
|
3358 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
|
3359 Py_INCREF(o); |
|
c5b0585624ef
map cells to arg slots at code creation time (closes #12399)
Benjamin Peterson <benjamin@python.org>
parents:
70940
diff
changeset
|
3360 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
|
3361 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3362 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3363 if (co->co_flags & CO_GENERATOR) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3364 /* 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
|
3365 * when the generator is resumed. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3366 Py_XDECREF(f->f_back); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3367 f->f_back = 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 PCALL(PCALL_GENERATOR); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3370 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3371 /* 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
|
3372 * and return that as the value. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3373 return PyGen_New(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3374 } |
|
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 retval = PyEval_EvalFrameEx(f,0); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3377 |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3378 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
|
3379 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3380 /* 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
|
3381 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
|
3382 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
|
3383 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
|
3384 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3385 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3386 ++tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3387 Py_DECREF(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3388 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3389 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
|
3390 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3391 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3392 |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3393 static PyObject * |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3394 special_lookup(PyObject *o, char *meth, PyObject **cache) |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3395 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3396 PyObject *res; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3397 res = _PyObject_LookupSpecial(o, meth, cache); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3398 if (res == NULL && !PyErr_Occurred()) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3399 PyErr_SetObject(PyExc_AttributeError, *cache); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3400 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3401 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3402 return res; |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3403 } |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3404 |
|
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54459
diff
changeset
|
3405 |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3406 /* 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
|
3407 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3408 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3409 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
|
3410 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3411 PyObject *type, *value, *traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3412 Py_XINCREF(tstate->exc_type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3413 Py_XINCREF(tstate->exc_value); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3414 Py_XINCREF(tstate->exc_traceback); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3415 type = f->f_exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3416 value = f->f_exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3417 traceback = f->f_exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3418 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
|
3419 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
|
3420 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
|
3421 Py_XDECREF(type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3422 Py_XDECREF(value); |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
3423 Py_XDECREF(traceback); |
|
71159
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3424 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3425 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3426 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3427 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
|
3428 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3429 PyObject *tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3430 tmp = tstate->exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3431 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
|
3432 f->f_exc_type = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3433 tmp = tstate->exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3434 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
|
3435 f->f_exc_value = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3436 tmp = tstate->exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3437 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
|
3438 f->f_exc_traceback = tmp; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3439 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3440 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3441 static void |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3442 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
|
3443 { |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3444 PyObject *type, *value, *tb; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3445 type = tstate->exc_type; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3446 value = tstate->exc_value; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3447 tb = tstate->exc_traceback; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3448 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
|
3449 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
|
3450 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
|
3451 f->f_exc_type = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3452 f->f_exc_value = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3453 f->f_exc_traceback = NULL; |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3454 Py_XDECREF(type); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3455 Py_XDECREF(value); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3456 Py_XDECREF(tb); |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3457 } |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3458 |
|
95784a617d05
convert generator exc state functions into static functions
Benjamin Peterson <benjamin@python.org>
parents:
71158
diff
changeset
|
3459 |
|
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
|
3460 /* 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
|
3461 This *consumes* a reference count to each of its arguments. */ |
|
31875
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
3462 static enum why_code |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3463 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
|
3464 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3465 PyObject *type = NULL, *value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3466 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3467 if (exc == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3468 /* Reraise */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3469 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3470 PyObject *tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3471 type = tstate->exc_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3472 value = tstate->exc_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3473 tb = tstate->exc_traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3474 if (type == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3475 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3476 "No active exception to reraise"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3477 return WHY_EXCEPTION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3478 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3479 Py_XINCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3480 Py_XINCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3481 Py_XINCREF(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3482 PyErr_Restore(type, value, tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3483 return WHY_RERAISE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3484 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3485 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3486 /* 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
|
3487 raise |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3488 raise <instance> |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3489 raise <type> */ |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3490 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3491 if (PyExceptionClass_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3492 type = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3493 value = PyObject_CallObject(exc, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3494 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3495 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
|
3496 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
|
3497 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
|
3498 "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
|
3499 "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
|
3500 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
|
3501 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
|
3502 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3503 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3504 else if (PyExceptionInstance_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3505 value = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3506 type = PyExceptionInstance_Class(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3507 Py_INCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3508 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3509 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3510 /* 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
|
3511 anyway, just not what you specified :-) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3512 Py_DECREF(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3513 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3514 "exceptions must derive from BaseException"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3515 goto raise_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3516 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3517 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3518 if (cause) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3519 PyObject *fixed_cause; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3520 if (PyExceptionClass_Check(cause)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3521 fixed_cause = PyObject_CallObject(cause, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3522 if (fixed_cause == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3523 goto raise_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3524 Py_DECREF(cause); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3525 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3526 else if (PyExceptionInstance_Check(cause)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3527 fixed_cause = cause; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3528 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3529 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3530 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3531 "exception causes must derive from " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3532 "BaseException"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3533 goto raise_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3534 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3535 PyException_SetCause(value, fixed_cause); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3536 } |
|
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 PyErr_SetObject(type, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3539 /* PyErr_SetObject incref's its arguments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3540 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3541 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3542 return WHY_EXCEPTION; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3543 |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3544 raise_error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3545 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3546 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3547 Py_XDECREF(cause); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3548 return WHY_EXCEPTION; |
|
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
|
3549 } |
|
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
|
3550 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3551 /* 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
|
3552 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
|
3553 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3554 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
|
3555 with a variable target. |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3556 */ |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3557 |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3558 static int |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3559 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
|
3560 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3561 int i = 0, j = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3562 Py_ssize_t ll = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3563 PyObject *it; /* iter(v) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3564 PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3565 PyObject *l = NULL; /* variable list */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3566 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3567 assert(v != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3568 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3569 it = PyObject_GetIter(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3570 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3571 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3572 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3573 for (; i < argcnt; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3574 w = PyIter_Next(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3575 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3576 /* Iterator done, via error or exhaustion. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3577 if (!PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3578 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3579 "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
|
3580 i, i == 1 ? "" : "s"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3581 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3582 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3583 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3584 *--sp = w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3585 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3586 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3587 if (argcntafter == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3588 /* 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
|
3589 w = PyIter_Next(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3590 if (w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3591 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3592 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3593 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3594 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3595 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3596 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
|
3597 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
|
3598 "(expected %d)", argcnt); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3599 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3600 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3601 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3602 l = PySequence_List(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3603 if (l == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3604 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3605 *--sp = l; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3606 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3607 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3608 ll = PyList_GET_SIZE(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3609 if (ll < argcntafter) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3610 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
|
3611 argcnt + ll); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3612 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3613 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3614 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3615 /* 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
|
3616 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
|
3617 *--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
|
3618 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3619 /* Resize the list. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3620 Py_SIZE(l) = ll - argcntafter; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3621 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3622 return 1; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3623 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3624 Error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3625 for (; i > 0; i--, sp++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3626 Py_DECREF(*sp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3627 Py_XDECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3628 return 0; |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3629 } |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3630 |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3631 |
| 567 | 3632 #ifdef LLTRACE |
| 86 | 3633 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3634 prtrace(PyObject *v, char *str) |
| 69 | 3635 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3636 printf("%s ", str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3637 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
|
3638 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
|
3639 printf("\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3640 return 1; |
| 69 | 3641 } |
| 86 | 3642 #endif |
| 69 | 3643 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3644 static void |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3645 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
|
3646 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3647 PyObject *type, *value, *traceback, *arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3648 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3649 PyErr_Fetch(&type, &value, &traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3650 if (value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3651 value = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3652 Py_INCREF(value); |
|
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 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
|
3655 if (arg == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3656 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3657 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3658 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3659 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
|
3660 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3661 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3662 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3663 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3664 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3665 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3666 Py_XDECREF(traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3667 } |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3668 } |
|
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3669 |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3670 static int |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3671 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
|
3672 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
|
3673 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3674 PyObject *type, *value, *traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3675 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3676 PyErr_Fetch(&type, &value, &traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3677 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
|
3678 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3679 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3680 PyErr_Restore(type, value, traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3681 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3682 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3683 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3684 Py_XDECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3685 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3686 Py_XDECREF(traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3687 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3688 } |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3689 } |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3690 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3691 static int |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3692 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
|
3693 int what, PyObject *arg) |
| 567 | 3694 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3695 register PyThreadState *tstate = frame->f_tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3696 int result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3697 if (tstate->tracing) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3698 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3699 tstate->tracing++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3700 tstate->use_tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3701 result = func(obj, frame, what, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3702 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
|
3703 || (tstate->c_profilefunc != NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3704 tstate->tracing--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3705 return result; |
| 567 | 3706 } |
| 3707 | |
|
28556
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3708 PyObject * |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3709 _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
|
3710 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3711 PyFrameObject *frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3712 PyThreadState *tstate = frame->f_tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3713 int save_tracing = tstate->tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3714 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
|
3715 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3716 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3717 tstate->tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3718 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
|
3719 || (tstate->c_profilefunc != NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3720 result = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3721 tstate->tracing = save_tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3722 tstate->use_tracing = save_use_tracing; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3723 return result; |
|
28556
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3724 } |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3725 |
|
55372
79718ee03986
Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
54909
diff
changeset
|
3726 /* 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
|
3727 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
|
3728 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
|
3729 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
|
3730 int *instr_prev) |
| 24844 | 3731 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3732 int result = 0; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3733 int line = frame->f_lineno; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3734 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3735 /* 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
|
3736 instruction window, reset the window. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3737 */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3738 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
|
3739 PyAddrPair bounds; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3740 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
|
3741 &bounds); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3742 *instr_lb = bounds.ap_lower; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3743 *instr_ub = bounds.ap_upper; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3744 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3745 /* 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
|
3746 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
|
3747 number and call the trace function. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61186
diff
changeset
|
3748 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
|
3749 frame->f_lineno = line; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3750 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
|
3751 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3752 *instr_prev = frame->f_lasti; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3753 return result; |
| 24844 | 3754 } |
| 3755 | |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3756 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3757 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
|
3758 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3759 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3760 PyObject *temp = tstate->c_profileobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3761 Py_XINCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3762 tstate->c_profilefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3763 tstate->c_profileobj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3764 /* 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
|
3765 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
|
3766 Py_XDECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3767 tstate->c_profilefunc = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3768 tstate->c_profileobj = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3769 /* 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
|
3770 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
|
3771 } |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3772 |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3773 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3774 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
|
3775 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3776 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3777 PyObject *temp = tstate->c_traceobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3778 _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
|
3779 Py_XINCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3780 tstate->c_tracefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3781 tstate->c_traceobj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3782 /* 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
|
3783 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
|
3784 Py_XDECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3785 tstate->c_tracefunc = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3786 tstate->c_traceobj = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3787 /* 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
|
3788 tstate->use_tracing = ((func != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3789 || (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
|
3790 } |
|
4cb34314bd97
Instead of initializing & interning the strings passed to the profile
Fred Drake <fdrake@acm.org>
parents:
18128
diff
changeset
|
3791 |
| 5368 | 3792 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3793 PyEval_GetBuiltins(void) |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3794 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3795 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3796 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3797 return PyThreadState_GET()->interp->builtins; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3798 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3799 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
|
3800 } |
|
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3801 |
| 5368 | 3802 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3803 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
|
3804 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3805 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3806 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3807 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3808 PyFrame_FastToLocals(current_frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3809 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
|
3810 } |
|
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3811 |
| 5368 | 3812 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3813 PyEval_GetGlobals(void) |
| 69 | 3814 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3815 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3816 if (current_frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3817 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3818 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3819 return current_frame->f_globals; |
| 69 | 3820 } |
| 3821 | |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3822 PyFrameObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3823 PyEval_GetFrame(void) |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3824 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3825 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3826 return _PyThreadState_GetFrame(tstate); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3827 } |
|
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3828 |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3829 int |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3830 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
|
3831 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3832 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3833 int result = cf->cf_flags != 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3834 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3835 if (current_frame != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3836 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
|
3837 const int compilerflags = codeflags & PyCF_MASK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3838 if (compilerflags) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3839 result = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3840 cf->cf_flags |= compilerflags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3841 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
3842 #if 0 /* future keyword */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3843 if (codeflags & CO_GENERATOR_ALLOWED) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3844 result = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3845 cf->cf_flags |= CO_GENERATOR_ALLOWED; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3846 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
3847 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3848 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3849 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
|
3850 } |
|
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
|
3851 |
| 86 | 3852 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3853 /* External interface to call any callable object. |
|
60130
04e775b33e9e
Merged revisions 79555 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59863
diff
changeset
|
3854 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
|
3855 |
| 5368 | 3856 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3857 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
|
3858 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3859 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3860 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3861 if (arg == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3862 arg = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3863 if (arg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3864 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3865 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3866 else if (!PyTuple_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3867 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3868 "argument list must be a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3869 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3870 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3871 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3872 Py_INCREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3873 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3874 if (kw != NULL && !PyDict_Check(kw)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3875 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3876 "keyword list must be a dictionary"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3877 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3878 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3879 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3880 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3881 result = PyObject_Call(func, arg, kw); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3882 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3883 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3884 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3885 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
3886 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3887 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
|
3888 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3889 if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3890 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
|
3891 else if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3892 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
|
3893 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3894 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
|
3895 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3896 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
|
3897 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3898 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
3899 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3900 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
|
3901 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3902 if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3903 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3904 else if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3905 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3906 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3907 return "()"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3908 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3909 return " object"; |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3910 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3911 |
|
26141
6ce9228a3da2
Make private functions static so we don't pollute the namespace
Neal Norwitz <nnorwitz@gmail.com>
parents:
26110
diff
changeset
|
3912 static void |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3913 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
|
3914 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3915 if (flags & METH_NOARGS) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3916 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3917 "%.200s() takes no arguments (%d given)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3918 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3919 nargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3920 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3921 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3922 "%.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
|
3923 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3924 nargs); |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3925 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3926 |
|
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
|
3927 #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
|
3928 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
|
3929 if (call_trace(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3930 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3931 tstate->frame, PyTrace_C_CALL, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3932 func)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3933 x = NULL; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3934 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3935 else { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3936 x = call; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3937 if (tstate->c_profilefunc != NULL) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3938 if (x == NULL) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3939 call_trace_protected(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3940 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3941 tstate->frame, PyTrace_C_EXCEPTION, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3942 func); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3943 /* XXX should pass (type, value, tb) */ \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3944 } else { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3945 if (call_trace(tstate->c_profilefunc, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3946 tstate->c_profileobj, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3947 tstate->frame, PyTrace_C_RETURN, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3948 func)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3949 Py_DECREF(x); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3950 x = NULL; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3951 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3952 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3953 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3954 } \ |
|
32409
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3955 } else { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3956 x = call; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3957 } |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3958 |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3959 static PyObject * |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
3960 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
|
3961 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3962 , 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
|
3963 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3964 ) |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3965 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3966 int na = oparg & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3967 int nk = (oparg>>8) & 0xff; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3968 int n = na + 2 * nk; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3969 PyObject **pfunc = (*pp_stack) - n - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3970 PyObject *func = *pfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3971 PyObject *x, *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3972 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3973 /* 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
|
3974 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
|
3975 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3976 if (PyCFunction_Check(func) && nk == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3977 int flags = PyCFunction_GET_FLAGS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3978 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3979 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3980 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3981 if (flags & (METH_NOARGS | METH_O)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3982 PyCFunction meth = PyCFunction_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3983 PyObject *self = PyCFunction_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3984 if (flags & METH_NOARGS && na == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3985 C_TRACE(x, (*meth)(self,NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3986 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3987 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
|
3988 PyObject *arg = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3989 C_TRACE(x, (*meth)(self,arg)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3990 Py_DECREF(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3991 } |
|
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 err_args(func, flags, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3994 x = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3995 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3996 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3997 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3998 PyObject *callargs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3999 callargs = load_args(pp_stack, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4000 READ_TIMESTAMP(*pintr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4001 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
|
4002 READ_TIMESTAMP(*pintr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4003 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4004 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4005 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4006 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
|
4007 /* optimize access to bound methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4008 PyObject *self = PyMethod_GET_SELF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4009 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4010 PCALL(PCALL_BOUND_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4011 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4012 func = PyMethod_GET_FUNCTION(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4013 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4014 Py_DECREF(*pfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4015 *pfunc = self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4016 na++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4017 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4018 } else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4019 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4020 READ_TIMESTAMP(*pintr0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4021 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4022 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
|
4023 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4024 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
|
4025 READ_TIMESTAMP(*pintr1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4026 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4027 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4028 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4029 /* 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
|
4030 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
|
4031 (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
|
4032 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4033 while ((*pp_stack) > pfunc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4034 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4035 Py_DECREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4036 PCALL(PCALL_POP); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4037 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4038 return x; |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4039 } |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
4040 |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
4041 /* 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
|
4042 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
|
4043 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
|
4044 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
|
4045 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
|
4046 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
|
4047 done before evaluating the frame. |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4048 */ |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4049 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4050 static PyObject * |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4051 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
|
4052 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4053 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
|
4054 PyObject *globals = PyFunction_GET_GLOBALS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4055 PyObject *argdefs = PyFunction_GET_DEFAULTS(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4056 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
|
4057 PyObject **d = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4058 int nd = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4059 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4060 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4061 PCALL(PCALL_FAST_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4062 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
|
4063 co->co_kwonlyargcount == 0 && nk==0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4064 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
|
4065 PyFrameObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4066 PyObject *retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4067 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4068 PyObject **fastlocals, **stack; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4069 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4070 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4071 PCALL(PCALL_FASTER_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4072 assert(globals != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4073 /* 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
|
4074 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
|
4075 take builtins without sanity checking them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4076 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4077 assert(tstate != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4078 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
|
4079 if (f == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4080 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4081 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4082 fastlocals = f->f_localsplus; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4083 stack = (*pp_stack) - n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4084 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4085 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4086 Py_INCREF(*stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4087 fastlocals[i] = *stack++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4088 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4089 retval = PyEval_EvalFrameEx(f,0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4090 ++tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4091 Py_DECREF(f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4092 --tstate->recursion_depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4093 return retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4094 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4095 if (argdefs != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4096 d = &PyTuple_GET_ITEM(argdefs, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4097 nd = Py_SIZE(argdefs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4098 } |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
4099 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
|
4100 (PyObject *)NULL, (*pp_stack)-n, na, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4101 (*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
|
4102 PyFunction_GET_CLOSURE(func)); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4103 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4104 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4105 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
|
4106 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
|
4107 PyObject *func) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4108 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4109 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4110 if (orig_kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4111 kwdict = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4112 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4113 kwdict = PyDict_Copy(orig_kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4114 Py_DECREF(orig_kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4115 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4116 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4117 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4118 while (--nk >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4119 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4120 PyObject *value = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4121 PyObject *key = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4122 if (PyDict_GetItem(kwdict, key) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4123 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4124 "%.200s%s got multiple values " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4125 "for keyword argument '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4126 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4127 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4128 key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4129 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4130 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4131 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4132 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4133 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4134 err = PyDict_SetItem(kwdict, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4135 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4136 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4137 if (err) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4138 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4139 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4140 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4141 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4142 return kwdict; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4143 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4144 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4145 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4146 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
|
4147 PyObject ***pp_stack) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4148 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4149 PyObject *callargs, *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4150 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4151 callargs = PyTuple_New(nstack + nstar); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4152 if (callargs == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4153 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4154 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4155 if (nstar) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4156 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4157 for (i = 0; i < nstar; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4158 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
|
4159 Py_INCREF(a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4160 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
|
4161 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4162 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4163 while (--nstack >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4164 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4165 PyTuple_SET_ITEM(callargs, nstack, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4166 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4167 return callargs; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4168 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4169 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4170 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4171 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
|
4172 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4173 PyObject *args = PyTuple_New(na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4174 PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4175 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4176 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4177 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4178 while (--na >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4179 w = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4180 PyTuple_SET_ITEM(args, na, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4181 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4182 return args; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4183 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4184 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4185 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4186 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
|
4187 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4188 PyObject *callargs = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4189 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4190 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4191 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4192 if (nk > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4193 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
|
4194 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4195 goto call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4196 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4197 callargs = load_args(pp_stack, na); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4198 if (callargs == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4199 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
|
4200 #ifdef CALL_PROFILE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4201 /* 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
|
4202 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
|
4203 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
|
4204 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4205 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4206 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4207 else if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4208 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4209 else if (PyType_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4210 PCALL(PCALL_TYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4211 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4212 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4213 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4214 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
|
4215 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4216 if (PyCFunction_Check(func)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4217 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4218 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
|
4219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4220 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4221 result = PyObject_Call(func, callargs, kwdict); |
| 43411 | 4222 call_fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4223 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4224 Py_XDECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4225 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4226 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4227 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4228 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4229 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
|
4230 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4231 int nstar = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4232 PyObject *callargs = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4233 PyObject *stararg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4234 PyObject *kwdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4235 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4236 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4237 if (flags & CALL_FLAG_KW) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4238 kwdict = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4239 if (!PyDict_Check(kwdict)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4240 PyObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4241 d = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4242 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4243 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4244 if (PyDict_Update(d, kwdict) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4245 Py_DECREF(d); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4246 /* PyDict_Update raises attribute |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4247 * error (percolated from an attempt |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4248 * to get 'keys' attribute) instead of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4249 * 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
|
4250 * is not a mapping. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4251 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4252 if (PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4253 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4254 "%.200s%.200s argument after ** " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4255 "must be a mapping, not %.200s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4256 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4257 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4258 kwdict->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4259 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4260 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4261 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4262 Py_DECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4263 kwdict = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4264 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4265 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4266 if (flags & CALL_FLAG_VAR) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4267 stararg = EXT_POP(*pp_stack); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4268 if (!PyTuple_Check(stararg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4269 PyObject *t = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4270 t = PySequence_Tuple(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4271 if (t == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4272 if (PyErr_ExceptionMatches(PyExc_TypeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4273 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4274 "%.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
|
4275 "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
|
4276 PyEval_GetFuncName(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4277 PyEval_GetFuncDesc(func), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4278 stararg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4279 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4280 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4281 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4282 Py_DECREF(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4283 stararg = t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4284 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4285 nstar = PyTuple_GET_SIZE(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4286 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4287 if (nk > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4288 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
|
4289 if (kwdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4290 goto ext_call_fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4291 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4292 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
|
4293 if (callargs == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4294 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
|
4295 #ifdef CALL_PROFILE |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4296 /* 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
|
4297 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
|
4298 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
|
4299 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4300 if (PyFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4301 PCALL(PCALL_FUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4302 else if (PyMethod_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4303 PCALL(PCALL_METHOD); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4304 else if (PyType_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4305 PCALL(PCALL_TYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4306 else if (PyCFunction_Check(func)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4307 PCALL(PCALL_CFUNCTION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4308 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4309 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
|
4310 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4311 if (PyCFunction_Check(func)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4312 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4313 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
|
4314 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4315 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4316 result = PyObject_Call(func, callargs, kwdict); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
4317 ext_call_fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4318 Py_XDECREF(callargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4319 Py_XDECREF(kwdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4320 Py_XDECREF(stararg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4321 return result; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4322 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4323 |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4324 /* 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
|
4325 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
|
4326 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
|
4327 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
|
4328 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
|
4329 */ |
|
21441
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4330 /* 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
|
4331 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
|
4332 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
|
4333 */ |
| 12614 | 4334 int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
4335 _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) |
| 69 | 4336 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4337 if (v != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4338 Py_ssize_t x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4339 if (PyIndex_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4340 x = PyNumber_AsSsize_t(v, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4341 if (x == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4342 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4343 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4344 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4345 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4346 "slice indices must be integers or " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4347 "None or have an __index__ method"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4348 return 0; |
|
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 *pi = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4351 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4352 return 1; |
| 69 | 4353 } |
| 4354 | |
|
42132
863ed7cd45dc
Merged revisions 56020-56124 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
4355 #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
|
4356 "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
|
4357 |
| 5368 | 4358 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4359 cmp_outcome(int op, register PyObject *v, register PyObject *w) |
| 69 | 4360 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4361 int res = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4362 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4363 case PyCmp_IS: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4364 res = (v == w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4365 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4366 case PyCmp_IS_NOT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4367 res = (v != w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4368 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4369 case PyCmp_IN: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4370 res = PySequence_Contains(w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4371 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4372 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4373 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4374 case PyCmp_NOT_IN: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4375 res = PySequence_Contains(w, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4376 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4377 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4378 res = !res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4379 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4380 case PyCmp_EXC_MATCH: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4381 if (PyTuple_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4382 Py_ssize_t i, length; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4383 length = PyTuple_Size(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4384 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
|
4385 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
|
4386 if (!PyExceptionClass_Check(exc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4387 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4388 CANNOT_CATCH_MSG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4389 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4390 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4391 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4392 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4393 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4394 if (!PyExceptionClass_Check(w)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4395 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4396 CANNOT_CATCH_MSG); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4397 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4398 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4399 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4400 res = PyErr_GivenExceptionMatches(v, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4401 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4402 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4403 return PyObject_RichCompare(v, w, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4404 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4405 v = res ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4406 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4407 return v; |
| 69 | 4408 } |
| 4409 | |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4410 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
|
4411 import_from(PyObject *v, PyObject *name) |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4412 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4413 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4414 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4415 x = PyObject_GetAttr(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4416 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4417 PyErr_Format(PyExc_ImportError, "cannot import name %S", name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4418 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4419 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
|
4420 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4421 |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4422 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
|
4423 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
|
4424 { |
|
72926
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4425 _Py_IDENTIFIER(__all__); |
|
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4426 _Py_IDENTIFIER(__dict__); |
|
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4427 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
|
4428 PyObject *dict, *name, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4429 int skip_leading_underscores = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4430 int pos, err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4431 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4432 if (all == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4433 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4434 return -1; /* Unexpected error */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4435 PyErr_Clear(); |
|
72926
db4aa878cea2
Port SetAttrString/HasAttrString to SetAttrId/GetAttrId.
Martin v. Löwis <martin@v.loewis.de>
parents:
72925
diff
changeset
|
4436 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
|
4437 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4438 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4439 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4440 PyErr_SetString(PyExc_ImportError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4441 "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
|
4442 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4443 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4444 all = PyMapping_Keys(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4445 Py_DECREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4446 if (all == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4447 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4448 skip_leading_underscores = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4449 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4450 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4451 for (pos = 0, err = 0; ; pos++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4452 name = PySequence_GetItem(all, pos); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4453 if (name == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4454 if (!PyErr_ExceptionMatches(PyExc_IndexError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4455 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4456 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4457 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4458 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4459 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4460 if (skip_leading_underscores && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4461 PyUnicode_Check(name) && |
| 72475 | 4462 PyUnicode_READY(name) != -1 && |
| 4463 PyUnicode_READ_CHAR(name, 0) == '_') | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4464 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4465 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4466 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4467 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4468 value = PyObject_GetAttr(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4469 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4470 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4471 else if (PyDict_CheckExact(locals)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4472 err = PyDict_SetItem(locals, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4473 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4474 err = PyObject_SetItem(locals, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4475 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4476 Py_XDECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4477 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4478 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4479 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4480 Py_DECREF(all); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4481 return err; |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4482 } |
|
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4483 |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4484 static void |
| 42860 | 4485 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
|
4486 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4487 const char *obj_str; |
|
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 if (!obj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4490 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4491 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4492 obj_str = _PyUnicode_AsString(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4493 if (!obj_str) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4494 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4495 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4496 PyErr_Format(exc, format_str, obj_str); |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4497 } |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4498 |
|
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
|
4499 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
|
4500 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
|
4501 { |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4502 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
|
4503 /* 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
|
4504 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
|
4505 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
|
4506 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
|
4507 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
|
4508 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
|
4509 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
|
4510 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
|
4511 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
|
4512 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
|
4513 } 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
|
4514 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
|
4515 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
|
4516 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
|
4517 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
|
4518 } |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4519 } |
|
25cc226dc9bd
#4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64439
diff
changeset
|
4520 |
|
72605
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4521 static PyObject * |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4522 unicode_concatenate(PyObject *v, PyObject *w, |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4523 PyFrameObject *f, unsigned char *next_instr) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4524 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4525 PyObject *res; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4526 if (Py_REFCNT(v) == 2) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4527 /* 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
|
4528 * 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
|
4529 * 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
|
4530 * '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
|
4531 * the refcnt to 1. |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4532 */ |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4533 switch (*next_instr) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4534 case STORE_FAST: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4535 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4536 int oparg = PEEKARG(); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4537 PyObject **fastlocals = f->f_localsplus; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4538 if (GETLOCAL(oparg) == v) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4539 SETLOCAL(oparg, NULL); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4540 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4541 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4542 case STORE_DEREF: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4543 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4544 PyObject **freevars = (f->f_localsplus + |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4545 f->f_code->co_nlocals); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4546 PyObject *c = freevars[PEEKARG()]; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4547 if (PyCell_GET(c) == v) |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4548 PyCell_Set(c, NULL); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4549 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4550 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4551 case STORE_NAME: |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4552 { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4553 PyObject *names = f->f_code->co_names; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4554 PyObject *name = GETITEM(names, PEEKARG()); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4555 PyObject *locals = f->f_locals; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4556 if (PyDict_CheckExact(locals) && |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4557 PyDict_GetItem(locals, name) == v) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4558 if (PyDict_DelItem(locals, name) != 0) { |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4559 PyErr_Clear(); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4560 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4561 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4562 break; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4563 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4564 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4565 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4566 res = v; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4567 PyUnicode_Append(&res, w); |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4568 return res; |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4569 } |
|
07d27d865e2c
ceval.c: restore str+=str optimization
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72558
diff
changeset
|
4570 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4571 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4572 |
|
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
|
4573 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4574 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
|
4575 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4576 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4577 PyObject *l = PyList_New(256); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4578 if (l == NULL) return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4579 for (i = 0; i < 256; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4580 PyObject *x = PyLong_FromLong(a[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4581 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4582 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4583 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4584 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4585 PyList_SetItem(l, i, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4586 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4587 for (i = 0; i < 256; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4588 a[i] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4589 return l; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4590 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4591 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4592 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4593 _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
|
4594 { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4595 #ifndef DXPAIRS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4596 return getarray(dxp); |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4597 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4598 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4599 PyObject *l = PyList_New(257); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4600 if (l == NULL) return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4601 for (i = 0; i < 257; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4602 PyObject *x = getarray(dxpairs[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4603 if (x == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4604 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4605 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4606 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4607 PyList_SetItem(l, i, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4608 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4609 return l; |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4610 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4611 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4612 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4613 #endif |
